Thread View: pl.comp.objects
2 messages
2 total messages
Started by Filip Sielimowicz
Wed, 23 Feb 2005 10:58
Jaki to wzorzec projektowy ?
Author: Filip Sielimowicz
Date: Wed, 23 Feb 2005 10:58
Date: Wed, 23 Feb 2005 10:58
71 lines
3251 bytes
3251 bytes
Mam klasę FunkcjaBiznesowa, która wpasowuje się
mniej więcej w we wzorzez TemplateMethod
http://www.dofactory.com/Patterns/PatternTemplate.aspx
W mojej FunkcjiBiznesowej część zaimplementowaną
stanowią operacje związane z otwieraniem i zamykaniem
transakcji (a dokładniej: sesji Hibernate) bazodanowej,
część nieustaloną (abstrakcyjną) stanowi metoda
run(Transaction s), która, jak widać, używa już gotowej
transakcji. W uproszczeniu templateMethod w FunkcjiBiznesowej
wygląda tak:
public void run() {
try {
Transaction t=openTransaction();
run(t);
t.commit;
} catch (Error e) {
t.rollback;
throw e;
}
}
Teraz postanowiłem wykonać pewną transformację
pokazanego wyżej wzorca. Ale najpierw powód:
chcę oddzielić kwestię zarządzania tranzakcjami
od samych funkcji biznesowych. Dlaczego ?
Dlatego, że rzeczywisty kod z tym związany jest dużo
bardziej złożony niż pokazany powyżej (np. rozbudowana
obsługa błędów) i w związku z tym klasa FunkcjaBiznesowa
ze względów organizacyjnych zawiera wiele metod pomocniczych.
Ja zaś nie chcę narażać programisty na to, by się
z tym wszystkim stykał za każdym razem, kiedy implementuje
nową funkcję biznesową. Transformacja jest więc prosta:
cały kod związany z zarządzaniem transakcjami wypada
do oddzielnej klasy - ManagerFunkcjiBiznesowych. Zaś z klasy
FunkcjaBiznesowa robi się interfejs IFunkcjaBiznesowa,
który zawiera tylko jedną abstrakcyjną metodę:
run(Transaction t).
ManagerFunkcjiBiznesowych jest singletonem, który zawiera
publiczną metodę void run(IFunkcjaBiznesowa):
public void run(IFunkcjaBiznesowa fun) {
try {
Transaction t=openTransaction();
fun.run(t);
t.commit;
} catch (Error e) {
t.rollback;
throw e;
}
}
Poprzednio wywołanie funkcji biznesowej wyglądało tak:
FunkcjaBiznesowa fun=new ConcreteFunkcjaBiznesowa();
fun.run();
teraz wygląda to tak:
IFunkcjaBiznesowa fun=new ConcreteFunkcjaBiznesowa();
ManagerFunkcjiBiznesowych.getInstance().run(fun);
I teraz pytanie: jakimi wzorcami projektowymi najlepiej
opisać takątransformację ? Czy jest jakiś wzorzec który
właśnie postuluje wydzielanie części abstrakcyjnej
do osobnych klas ?
--
Filip Sielimowicz
http://panda.bg.univ.gda.pl/~sielim/genetic/
Re: Jaki to wzorzec projektowy ?
Author: Jakub Głuszecki
Date: Tue, 10 May 2005 20:24
Date: Tue, 10 May 2005 20:24
27 lines
1743 bytes
1743 bytes
Filip Sielimowicz wrote:
> public void run() {
> try {
> Transaction t=openTransaction();
> run(t);
> t.commit;
> } catch (Error e) {
> t.rollback;
> throw e;
> }
> }
>
> Teraz postanowiłem wykonać pewną transformację
> pokazanego wyżej wzorca. Ale najpierw powód:
> chcę oddzielić kwestię zarządzania tranzakcjami
> od samych funkcji biznesowych. Dlaczego ?
To nie odpowiedź na pytanie, ale sugerowałbym użycia jakiegoś gotowego
rozwiązania, ze szczególnym wskazaniem na Spring.
Masz całkowitą rację chcąc rozdzielić zarządzanie tranzakcjami od
funkcji biznesowych, tylko po co wyważać otwarte drzwi. W Springu jest
to zrobione wzorcowo.
--
Pozdrawiam,
Jakub Głuszecki
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads