ďťż
 
design pattern ďťż
 
design pattern
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • absolwenci.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com