Jak pogodzić CQS z wzorcem kompozyt?

0

Mówiąc CQS mam na myśli Command-query separation, czyli hasło opisujące metodę która albo zwraca wynik ale nie modyfikuje stanu, albo modyfikuje stan, ale nic nie zwraca.

Mam kilka obiektów, które dostają jakąś wartość, i z tą wartością, albo wykonuje jakąś akcję (powiedzmy wysłanie maila), albo zwraca response (zawsze jedno albo drugie).

Potrzebuję zdynamizować te obiekty (żeby można było je przekazywać w runtimie'ie), i właśnie chciałbym mieć taki kompozyt, na którym mogę właśnie albo wykonać wszystkie akcje, oraz zwrócić response'y (bo może być że niektóre obiekty w kompozycie zrobią swoją akcje i nie zwrócą response'ów, albo nic nie zrobią i zwrócą response).

1

Możesz rozwinąć? Na jakie problemy napotkałeś, jak próbowałeś w ten sposób to połączyć?

0

bo może być że niektóre obiekty w kompozycie zrobią swoją akcje i nie zwrócą response'ów, albo nic nie zrobią i zwrócą response

O tym, czy metoda jest działaniem, czy zapytaniem, klient powinien wiedzieć przed wywołaniem metody, a nie po. Czyli

interface Something {
	void action();
	SomeResult query();
}

class Unit implements Something;

class Compisite implements Something;

a nie

interface Something {
	Either<void, SomeResult> actionOrMaybeQuery();
}

0

Nie wiem jaki jest problem. Możesz mieć taką sytuację, gdzie CGS i Composite współegzystują

interface I {
	void action();
	SomeResult query();
}

class Normal : I  {
  override void action() {/* do something */}
  override SomeResult query() {/* do something */}
}

class Tree : I  {
  override void action() {leafs.forEach {it.action()}}}
  override SomeResult query() {leafs.map {it.query()}.aggregateResults()}

  val List<I> leafs;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1