eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingwhat up, programowanie aspektoweRe: what up, programowanie aspektowe
  • Path: news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
    From: " " <f...@g...SKASUJ-TO.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: what up, programowanie aspektowe
    Date: Wed, 9 May 2012 13:57:31 +0000 (UTC)
    Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
    Lines: 156
    Message-ID: <jodt4b$dg3$1@inews.gazeta.pl>
    References: <jobtll$46i$1@inews.gazeta.pl> <jod8gb$4ag$1@news.task.gda.pl>
    <jodh5p$cqv$1@inews.gazeta.pl> <jodmdo$8ir$1@news.task.gda.pl>
    NNTP-Posting-Host: localhost
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: 8bit
    X-Trace: inews.gazeta.pl 1336571851 13827 172.20.26.235 (9 May 2012 13:57:31 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Wed, 9 May 2012 13:57:31 +0000 (UTC)
    X-User: fir
    X-Forwarded-For: 91.94.173.39
    X-Remote-IP: localhost
    Xref: news-archive.icm.edu.pl pl.comp.programming:197150
    [ ukryj nagłówki ]

    zażółcony <r...@c...pl> napisał(a):

    > W dniu 2012-05-09 12:33, f...@g...SKASUJ-TO.pl pisze:
    > > zażółcony<r...@c...pl> napisał(a):
    > >
    > >> W dniu 2012-05-08 21:54, prof fir pisze:
    > >>> zasadniczo pierwszy raz o tym slysze, spostrzezenie
    > >>> w polskiej wiki wydaje sie sensowne, ale czy ktos tego
    > >>> uzywal, czy da sie to jakos zrobic i jak to wyglada
    > >>
    > >> Elementy programowania/myślenia aspektowego pojawiają się
    > >> wszędzie, ja akurat obserwuję to na przykładzie
    > >> J2EE - tylko często się tego nie nazywa po imieniu
    > >> i często jest to zapisane w sposób nieefektywny (bo za pomocą
    > >> takiego języka jak Java). Wiele wzorców projektowych
    > >> ma w sobie coś z idei programowania aspektowego.
    > >>
    > >> Jakiś prosty przykład ...
    > >>
    > >> Masz typową funkcję 'biznesową', która coś wyciąga
    > >> z bazy danych, oblicza i do bazy zapisuje. Jak baza
    > >> danych - to musi być jakieś łączenie z tą bazą a potem
    > >> transakcja. Pominę samo łączenie, zostanę przy transakcji.
    > >> Twoja funkcja wyglada wtedy tak:
    > >>
    > >> void MyFun() {
    > >> BeginTrans()
    > >> x=SELECT Z BAZY
    > >> x = x * y * COSTAM
    > >> UPDATE BAZY (x)
    > >> CommitTrans()
    > >> }
    > >>
    > >> W tej postaci funkcja ma jeszcze sporą 'niedoróbkę', a
    > >> mianowicie - brak obsługi błędów. Dodajmy więc coś podstawowego:
    > >>
    > >> void MyFun() {
    > >> BeginTrans()
    > >> try {
    > >> x=SELECT Z BAZY
    > >> x = x * y * COSTAM
    > >> UPDATE BAZY (x)
    > >> CommitTrans()
    > >> } catch (ex) {
    > >> log.err(ex)
    > >> RollbackTrans()
    > >> }
    > >> }
    > >>
    > >> Czy powyższy kod jest zły ? Dodać komentarze i będzie OK. Nie da się
    > >> tego zrobić 'prościej'.
    > >> (przy okazji będziesz miał odpowiedź na swoje pytanie w innym wątku,
    > >> co to oznacza wprowadzić abstrakcję).
    > >>
    > >> A teraz sobie wyobraź, że masz 10 programistów i tysiące takich
    > >> funkcji. Każdy z programistów robi copy paste tych beginów, endów,
    > >> try-catchów, każdy coś tam zmieni (np. niektórzy OpenTrans() będę robić
    > >> po try, a nie przed, jak w w.w. przykładzie.
    > >> Generalnie - kod nie jest zbyt czytelny. Wynika to m.in. z tego, że
    > >> w jednej funkcji łączy dwa aspekty: aspekt biznesowy i aspekt techniczny
    > >> związany z zarządzaniem transakcjami.
    > >> Na marginesie: Można troszeczkę ograniczyć ten techniczny aspekt
    > >> wprowadzając obiekty do zarządzanai transakcjami (TransactionScope) i
    > >> korzystając z wzorca RIAA, ale w jezyku takim jak Java akurat nic to nie
    > >> da, bo obiekty nie mają destruktorów.
    > >>
    > >> Więc wydzielamy aspekt transakcyjności na zewnątrz.
    > >> W bardzo dużym, przykładowym uproszczeniu, będziemy teraz mieć
    > >> dwa współpracujące obiekty: manager transakcji oraz funkcję biznesową:
    > >>
    > >> class MyFunBiz {
    > >> public execute() {
    > >> x=SELECT Z BAZY
    > >> x = x * y * COSTAM
    > >> UPDATE BAZY (x)
    > >> }
    > >> }
    > >>
    > >> Powyżej zero kodu transakcyjnego, który jest teraz tu:
    > >>
    > >> class ManagerFunkcjiBiznesowych {
    > >> public execute(MyFunBiz funBiz) {
    > >> BeginTrans()
    > >> try {
    > >> funBiz.execute()<--- Tu wywołujesz kod biznesowy
    > >> CommitTrans()
    > >> } catch (ex) {
    > >> log.err(ex)
    > >> RollbackTrans()
    > >> }
    > >> }
    > >> }
    > >>
    > >> Wywołanie naszej funkcji polega teraz na utworzeniu obiektu
    > >> i przekazaniu go do managera funkcji/transakcji, który
    > >> 'otacza' ją transakcją bazodanową.
    > >>
    > >> fun = MyFunBiz()
    > >> ManagerFunkcjiBiznesowych.execute(fun)
    > >>
    > >> Programowanie aspektowe polega właśnie na takim 'otaczaniu',
    > >> jak w cebuli. W środku masz zasadniczą funkcję biznesową
    > >> i Twoich 10 programistów zajmuje się dostarczaniem tego
    > >> środka (zobacz o ile jest to teraz czytelniejsze i zwięźlejsze),
    > >> a potem sami lub automatycznie jest to 'otaczane'
    > >> kolejnymi sukienkami - kolejnym aspektami/kontekstami (u nas jest
    > >> jeden - kontekst transakcji bazodanowej).
    > >> Programowanie aspektowe pozwala to robić w bardzo efektywnym
    > >> zapisie, natomiast w języku takim jak Java trzeba tworzyć
    > >> obiekty, interfejsy, klasy anonimowe, jest zamieszanie z przekazywaniem
    > >> parametrów itp itd (co ja w przykładach w dużej części pominąłem).
    > >>
    > >> Masz też powyżej przykład utworzenia abstrakcji - abstrakcją jest
    > >> tu np. pojęcie funkcji biznesowej, w której zajmujemy się wyłącznie
    > >> biznesem, a transakcje mamy już zapewnione 'z zewnątrz.
    > >
    > > dosyc ciekawe, (a jakos nigdy nie slyszalem nic ntt),
    > > nawet ten kod w miare, tx za odp
    > > z tym ze nie rozumiem tego kawalka
    > >
    > >> public execute() {
    > > /**/
    > > }
    > >
    > > to chyba skrot, czy tez jakies jezyk umozliwia takie opakowywanie
    > > / przekazywanie blokow kodu do srodka funkcji :-?
    >
    > to deklaracja metody w klasie ...
    >
    > w konwencji Java:
    >
    > class X {
    > ...
    > public void execute(){
    > ...
    > }
    > }
    >
    > W praktyce obecnych realizacji pojawiłby się tu albo
    > interfejs, który dopiero byłby implementowany w konkretnej klasie,
    > albo coraz częściej, zamiast opakowywanai wszystkiego interfejsami
    > markuje się metody adnotacjami, a mechanizmy uczy ich sprawnego
    > rozpoznawania. Ale to już szczegóły realizacji technicznej.

    ok, nie zauwazylem ze to nie funkcja tylko 'k..sa' (wole nie
    uzywac tego dla mnie wyraznie niecenzuralnego slowa) i przez
    to myslem ze to nie definicja tylko jakies wywolanie z zapodanym
    blokiem (kiedys zreszta bedzie trzeba przemyslec czy takie
    bloki ad hoc nie przydalyby sie moze na cos)





    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: