Wpis z mikrobloga

Hej.

Mam klasę która obsługuje polecenia podawane przez użytkownika w konsoli. Tzn jest pęta while(true) która czeka na polecenie i dopasowywuje to co podał użytkownik do odpowiedniej metody, wyciąga argumenty iip.

np:

add node 1
remove node 2
itp

I teraz pytanie. Jak to zrobić mądrze i elegancko ? IFy ?Jeśli będę obsługiwał wiele poleceń z różnymi parametrami, zakopię się z ifami i nic nie będzie czytelne oraz łatwe do rozbudowy. Jest jakiś wzorzec projektowy od tego ? Pozdrawiam i życzę miłej środy :)

#programowanie #wzorceprojektowe
  • 17
  • Odpowiedz
@marooned: Jaki to język?

W języku wysokiego poziomu rozwiązanie jest proste, np.

var actions = {

'add': function(arg1, arg2) {

//magia

},

'remove': function(arg1, arg2) {

}

}

itd. (można zamiast definiować w konkretnym miejscu użyć tylko identyfikatorów funkcji)

A potem tylko wywołać ładnie

if (command in actions) {

actions[command](argumenty);

}

switch
też jest okej.
  • Odpowiedz
@Ginden: Java.

Twoja propozycja w javie chyba odpada. Chyba, że użyć map ? Nie wiem. :P

Problemem jest to, że polecenia mogą być długie, mieć wiele flag, opcji, przełączników itp. Więc wydaje mi się, że z switchami też bym się zakopał.
  • Odpowiedz
(o ile jesteś tym maroonedem którego mam na myśli, jak nie to sorry :P)

Dzięki temu bajerkowi z refleksją możesz wyciągnąć konkretną metodę z klasy i ją wywołać.
  • Odpowiedz
@Visher: Robię coś bardzo podobnego. Teraz w metodzie

parsujPolecenie
będzie walka z ifami i switchami itp.

Polecenie może np. wyglądać tak:

gcc -o plik.exe -m "Siema to ja, Mirek" -O3 plik3.c
- oczywiście nie piszę gcc :) taki przykład.

Myślałem, że będzie do tego wzorzec projektowy.

@mqmq Nie, nie jestem Nim :) Zbieżność nicków i zainteresowań. Chyba robię temu kolesiowi zły PR bo już któraś osoba pytanie mnie czy to ten
  • Odpowiedz
@marooned: do wszystkiego musi być jakiś wzorzec projektowy? Ty po prostu musisz napisać parser poleceń, uwzględnić przełączniki, przełączniki z parametrami, parametry mogą być ujęte w cudzysłów jako reprezentację wielowyrazowego parametru.. Tu split może nie wystarczyć, jeżeli chcesz to pisać sam od początku to raczej parsowanie znak po znaku.
  • Odpowiedz
@mqmq: OK. Spróbuję to ogarnąć. Dzięki wielkie. Właśnie o coś takiego jak "java command line parser" mi chodziło. Googlując wpisywałem coś innego i nie znalazłem nic konkretnego :P Mój błąd.

@Visher: Lubię wzorce projektowe. :) Używanie znanych i lubianych schematów to chyba dobra praktyka dla początkującego programisty ? Nie wiem.
  • Odpowiedz
@marooned: no tak, tylko wzorzec projektowy możesz wykorzystać do jakiegoś konkretnego elementu w aplikacji, a sam z siebie wzorzec wymaga jakiegoś utartego schematu działania, natomiast taki parser co chwile zmienia swój stan na jakiś specjalny, np. przechodzi w tryb napisu po tym jak zobaczy znak " i ignoruje spacje jako oddzielenie argumentów itd.

Jeżeli masz ma celu coś większego, a to jest tylko środkiem, to oczywiście polecał bym użyć gotowca. Nie
  • Odpowiedz
@Hauleth: Aż zaczynam się bać, kiedyś pisałem coś bardzo podobnego też z interfejsami i musiałem się namyśleć.. jak każdy na wszystko będzie wzorca szukał, to w końcu zginą wszyscy którzy te wzorce wymyślają :s
  • Odpowiedz
@marooned: Nie rozumiem co w ifach jest zlego, ify + rekursywne parsowanie tego, np:

if *it == "add":

parseadd(++i)

void parse
add(iterator it)

{

if *it == "node": ...

}

itp. Prosciej i czytelniej sie tego chyba nie da zrobic.
  • Odpowiedz