13. september 2003 - 18:00Der er
6 kommentarer og 2 løsninger
optimering ændring af kontrolstruktur
hejsa igen E, jeg har siddet og leget lidt med en IRC bot skrevet fra bunden med java, og er da også kommet ganske langt, nu er mit problem blot at jeg synes denne struktur er en anelse uhænsigtsmæssig og vil derfor hører om der ikke er en smartere måde at gøre følgende på:
String[] res; while(true) { res = forb.readResponse(); if(res[1].equals("PING")) { forb.send("PONG "+res[2]); } elseif(res[1].equals("001")) { forb.send("JOIN #channel"); } } altså min res[1] indeholder forskellige værdier og derefter skal mit program så udfører forskellige handlinger, men synes if elseif struktureren er lidt tung når man har 50 elseif'er.. håber der er nogen som har en smart løsning.
Det er teknisk muligt at undgå if elseif elseif ...:
* lav en klasse for hver * lad alle klasse implementere samme interface med en process metode * gem et objekt af hver klasse i en hashmap under test værdien * hent interface ud af hashmappen udfra test værdi og kald process metoden
Kan du ikke lave et 2 dimensionelt array, indeholdene værdien der skal checkes og værdien der skal sendes, det array holder du op imod 'res'
Da det er tekststrenge du checker, burde det ikke være noget problem og slipper for dine if else if'er
Noget a la nedenstående (Ved det ikke, bare et forslag):
public class Test { public Test() { String[] res = {"PING", "DYNAMO"}; String[][] check = {{"PING", "# ping"}, {"PONG", "# pong"}, {"DYNAMO", "# dynamo"}};
for(int i = 0; i < res.length; i++) for(int x = 0; x < check.length; x++) if( res[i].equals(check[x][0])) System.out.println(check[x][1]); }
public static void main(String[] args) { new Test(); } }
Hvis du virkelig gerne vil undgå if elese kan du evt bruge Strings hashCode() og beregne værdier for alle strenge under initialisering: int PING = "ping".hashCode(); int PONG = "pong".hashCode();
Derefter kan du under selve programafviklingen lave din switch swicth(res[1].hashCode()) { case PING:doPing();break; case PONG:doPong();break; } Jeg tvivler dog på det er hurtigere + der er ikke nogen garanti for at string1 != string2 => string1.hashCode() != string2.hashCode() jvf dokumentationen. Så det skulle lige testes først
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.