Nick_S schreef op vrijdag 23 december 2005 @ 15:57:
Dan kun je beter je loop aanpassen ipv. een break gebruiken.
Java:
1
2
3
| for (int i = 0; i < list.length || returnValue != null; i++) {
//do your stuff
} |
Ik heb ook geleerd dat break bad practice is.
Een paar opmerkingen over die code om een item uit een kamer te getten:
Het doel van classes is om objecten te representeren, waarbij je zo weinig mogelijk aan de gebruikers van die classes laat weten *hoe* de data die bij die objecten hoort opgeslagen wordt.
In dit geval is het daarom niet netjes als je 2 publieke functies hebt om een item op te vragen, nl. eentje om de index bij een string op te zoeken, en eentje om het juiste element adhv de index op te vragen. Een gebruiker van die Room classe wil helemaal niet weten dat zo'n item in een list zit, maar wil gewoon dat item getten!
Ik zou die functies daarom private maken, en een publieke functie maken in class Room:
Java:
1
2
3
4
5
6
7
8
9
10
11
| public Item getItem(String description)
{
int idx = findItem(description);
if (idx == -1)
{
return null;
}
return getItem(idx);
} |
Ik zag dat je al iets dergelijks gemaakt had, maar dan met een string als returnwaarde, en ik zag niet in welke class je die gezet had.
Die oplossing waarbij jij een string als returnwaarde van de functie teruggeeft, is ook niet netjes. Je kunt beter het Item object retourneren, omdat je item later misschien wel veel meer functionaliteit gaat krijgen dan alleen die description. Misschien wel een korte en lange beschrijving, kleur, ... In de code die het Item nodig heeft (bijv. de player), roep je vervolgens gewoon item.getDescription() aan om de omschrijving te krijgen.
Overigens zou ik de items en de room nog anders implementeren. Je wilt namelijks er altijd naar streven om functionaliteit zoveel mogelijk in de class te implementeren waar de functionaliteit om gaat.
In dit geval is de functionaliteit het zoeken naar een object a.d.h.v. een woord wat een user intikt. Nu gaat de room bepalen of een item uit de lijst van items die het heeft matcht. Echter, deze 'matching' code zou ik dus in het item stoppen:
Java:
1
2
3
4
5
| //we zitten in class item
public boolean matchQuery(String desc)
{
return this.description.equals(desc));
} |
En dan de functie getItem in je room:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| //class Room implementation, items are now Items in a list, not strings!
List<Item> Items = new ArrayList();
//...
public Item getItem(String desc)
{
Iterator<Item> it = Items.iterator();
while (it.hasNext())
{
Item myItem = it.next();
if (myItem.matchQuery(desc)
{
return myItem;
}
}
return null; //item not found
} |
Die <Item> notatie is java 1.5 specifiek (Generics interface), indien je 1.4 gebruikt, gewoon objecten casten naar Item.
Nu je de matching in het item zelf hebt gestopt, kun je later een fatsoelijk match-algoritme implementeren dat niet alleen voor items in een room werkt, maar ook items in je player's inventory (die je vast ook gaat willen hebben

. En waarschijnlijk wil je op een gegeven moment ook wel een betere match-implementatie die ook dingen als 'all green apples' snapt.
Wat zijn jullie trouwens aan het maken; een text-RPG of een MUD?
I mentioned it once, but I think I got away with it.