design pattern
andrzej - 31-12-2005 11:09
design pattern
Czesc,
mam kod, ktory jest zrobiony w taki sposob:
aplikacja jest w jakims stanie (klasa obslugujaca dany stan). W tym stanie do 1 metody przychodza eventy. W tej metodzie jest wielki switch na typ eventu (instanceof) i w zaleznosci od tego co przyjdzie robione sa specyficzne dla tego stanu akcje (np rysowanie czegos albo zmiana stanu).
To jest oczywiscie jeden wielki bed smell, ale nie mam pomyslow jak to rozwiazac - wzorzec state na niewiele sie przyda, switcha nie mozna rozbic na akcje specyficzne dla danych eventow, bo w kazdym stanie taki event robi cos innego.
Jesli macie jakies pomysly co z tym zrobic, to prosze o rady.
Pozdrawiam AT.
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Zbyszek Malec - 31-12-2005 11:09
andrzej wrote (tak! stara dobra wrotka!):
> aplikacja jest w jakims stanie (klasa obslugujaca dany stan). W tym stanie do 1 > metody przychodza eventy. W tej metodzie jest wielki switch na typ eventu > (instanceof) i w zaleznosci od tego co przyjdzie robione sa specyficzne dla tego > stanu akcje (np rysowanie czegos albo zmiana stanu).
Tzn coś takiego:
if(event instanceof MyEvent) { if(state == NTH_STATE) { ... } else if(state == MTH_STATE) { } itd } else if(...
> To jest oczywiscie jeden wielki bed smell, ale nie mam pomyslow jak to rozwiazac > - wzorzec state na niewiele sie przyda, switcha nie mozna rozbic na akcje > specyficzne dla danych eventow, bo w kazdym stanie taki event robi cos innego.
A dlaczego nie State?
abstract class State { void processEvent(Event evt); }
class NthState extends State { void processEvent(Event evt) { if(evt instanceof MyEvent) { ... }... } }
class MthState extends { void processEvent(Event evt) { if(evt instanceof MyEvent) { ... }... } }
i tak dalej.
-- Zbigniew Malec Ustronie:104 gg:2756100
andrzejt@vp.pl - 31-12-2005 11:09
> andrzej wrote (tak! stara dobra wrotka!): > > > aplikacja jest w jakims stanie (klasa obslugujaca dany stan). W tym stanie do 1 > > metody przychodza eventy. W tej metodzie jest wielki switch na typ eventu > > (instanceof) i w zaleznosci od tego co przyjdzie robione sa specyficzne dla tego > > stanu akcje (np rysowanie czegos albo zmiana stanu). > > Tzn coś takiego: > > if(event instanceof MyEvent) > { > if(state == NTH_STATE) > { > ... > } > else if(state == MTH_STATE) > { > } > itd > } > else if(... > Nie cos takiego :-( > > To jest oczywiscie jeden wielki bed smell, ale nie mam pomyslow jak to rozwiazac > > - wzorzec state na niewiele sie przyda, switcha nie mozna rozbic na akcje > > specyficzne dla danych eventow, bo w kazdym stanie taki event robi cos innego. > > A dlaczego nie State? > > abstract class State > { > void processEvent(Event evt); > } > > class NthState extends State > { > void processEvent(Event evt) > { > if(evt instanceof MyEvent) > { > ... > }... > } > } > > class MthState extends > { > void processEvent(Event evt) > { > if(evt instanceof MyEvent) > { > ... > }... > } > } > > i tak dalej. > ale wlasnie takie cos jak tu napisales. Tyle, ze tych instanceof w processEvent jest kilka, no i kod sie gmatwa (a sam instanceof tez do super eleganckich konstrukcji nie nalezy).
AT. > > -- > Zbigniew Malec Ustronie:104 gg:2756100
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Tomasz Lewandowski - 31-12-2005 11:10
> aplikacja jest w jakims stanie (klasa obslugujaca dany stan). W tym stanie > do 1 > metody przychodza eventy. W tej metodzie jest wielki switch na typ eventu > (instanceof) i w zaleznosci od tego co przyjdzie robione sa specyficzne > dla tego > stanu akcje (np rysowanie czegos albo zmiana stanu). > > To jest oczywiscie jeden wielki bed smell, ale nie mam pomyslow jak to > rozwiazac > - wzorzec state na niewiele sie przyda, switcha nie mozna rozbic na akcje > specyficzne dla danych eventow, bo w kazdym stanie taki event robi cos > innego.
Bycmoze elegancko bedzie utworzyc mape: (stan,event) -> akcja, i w metodzie obslugujacej komunikaty wyszukiwac po aktualnym stanie oraz klasie eventu odpowiedniej akcji i ja wykonywac.
-- Pozdrawiam Tomasz Lewandowski
Piotr Lipski - 31-12-2005 11:10
> mam kod, ktory jest zrobiony w taki sposob: > > aplikacja jest w jakims stanie (klasa obslugujaca dany stan). W tym stanie do 1 > metody przychodza eventy. W tej metodzie jest wielki switch na typ eventu > (instanceof) i w zaleznosci od tego co przyjdzie robione sa specyficzne dla teg > o > stanu akcje (np rysowanie czegos albo zmiana stanu). > ... > Jesli macie jakies pomysly co z tym zrobic, to prosze o rady.
Może wzorzec wizytatora?
public class Processor { interface Event { void accept(Processor p); } class Event_1 implements Event { public void accept(Processor p) { p.process(this); } } class Event_2 implements Event { public void accept(Processor p) { p.process(this); } }
interface State { public void accept(Processor p, Event_1 e); public void accept(Processor p, Event_2 e); } class State_1 implements State { public void accept(Processor p, Event_1 e) { p.process(this, e); } public void accept(Processor p, Event_2 e) { p.process(this, e); } } class State_2 implements State { public void accept(Processor p, Event_1 e) { p.process(this, e); } public void accept(Processor p, Event_2 e) { p.process(this, e); } }
State state;
public static void main(String[] args) { new Processor(){{ state = new State_1(); { Event e = new Event_1(); e.accept(this); } { Event e = new Event_2(); e.accept(this); }
state = new State_2(); { Event e = new Event_2(); e.accept(this); } { Event e = new Event_1(); e.accept(this); } }}; }
public void process(Event_1 e) { state.accept(this, e); } public void process(Event_2 e) { state.accept(this, e); }
public void process(State_1 s, Event_1 e) { System.out.println("State_1, Event_1"); } public void process(State_1 s, Event_2 e) { System.out.println("State_1, Event_2"); } public void process(State_2 s, Event_1 e) { System.out.println("State_2, Event_1"); } public void process(State_2 s, Event_2 e) { System.out.println("State_2, Event_2"); } }
PL
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
=?iso-8859-2?Q?Micha=B3_S=B3ocinski?= - 31-12-2005 11:10
Dnia 30.12.2005 andrzejt@vp.pl <andrzejt@vp.pl> napisał/a: > ale wlasnie takie cos jak tu napisales. > Tyle, ze tych instanceof w processEvent jest kilka, no i kod sie gmatwa (a sam > instanceof tez do super eleganckich konstrukcji nie nalezy). >
visitor będzie chyba najodpowiedniejszy
-- Michał
Damian - 03-01-2006 10:30
"andrzej" <andrzejtWYTNIJTO@vp.pl> wrote in news:1259.00000027.43b4ef95@newsgate.onet.pl:
> Czesc, > > mam kod, ktory jest zrobiony w taki sposob: > > aplikacja jest w jakims stanie (klasa obslugujaca dany stan). W tym > stanie do 1 metody przychodza eventy. W tej metodzie jest wielki > switch na typ eventu (instanceof) i w zaleznosci od tego co przyjdzie > robione sa specyficzne dla tego stanu akcje (np rysowanie czegos albo > zmiana stanu).
Jednak State tu się przyda, bo w zależności od stanu są różne akcje lub zmiana stanu. Zostaje problem ifów z instanceof - ja tu widzę jakiś wariant Strategy. Tzn. w zależności od typu eventa używasz różnych strategii jego przetwarzania (klas działających w różny sposób, ale implementujących wspólny interfejs). Do przemyślenia jest co ma być najpierw czy wybór strategii i wykonanie akcji (w tym zmiana stanu), czy na odwrót: wykonanie akcji, które użyje jednej ze strategii w zależności od typu eventa.
-- Damian
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
How To Be a Graphic Designer Without Losing Your Soul - ktos czytal?
=?iso-8859-2?Q?ROTFL..._design_=B3adny=2C_acz...?=
Grafik www / senior designer poszukiwany
Baza Designer - zaleznosci (wersje)
Oracle Designer - odpowiednik Linux
Oferta pracy: Graphic Designer
Rozwoj grafika/(web)designera
design oracle database
Oracle Designer 10
HP DesignJet 130
zanotowane.pldoc.pisz.plpdf.pisz.plabsolwenci.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|