[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Hermetyzacja w PROGRESS-ie.




Bogdan Brzozowski wrote:
>         Można to osiągnąć
>         poprzez stworzenie instancji procedury zewnętrznej
>         poleceniem RUN PERSISTENT, a następnie używając procedur
>         wewnętrznych [ciach] Jest to rzeczywiście
>         proteza. Program tak napisany będzie działał ok. 2,5 raza
>         wolniej przy wielokrotnym tworzeniu i niszczeniu instancji
>         procedury zewnętrznej, niż program który takiej instancji
>         nie tworzy [ciach]


Tomasz Judycki odpowiedział:
	Przeciez procedury persistent nie zostaly po to wymyslone!
	Procedure uruchamia sie raz w trybie persistent przy uruchomieniu
aplikacji i dzieki temu ma sie stale w pamieci operacyjnej dostepne
procedury wewnetrzne. A przy zakonczeniu dzialania aplikacji
	likwidujemy instancje procedury. Takie podejscie bedzie
	szybsze niz wielokrotne uruchamianie procedury
	z pliku zewnetrznego.

Panie Tomaszu,
	Problem przedstawiłem bardzo pobieżnie. Teraz go sprecyzuję.
	Chodziło mi o próbę obiektowego podejścia do pisania
	transakcji w PROGRESS-ie. Procedura zewnętrzna miała
	pełnić rolę klasy. Zmienne zadeklarowane w jej bloku
	głównym - rolę prywatnych atrybutów tej klasy, natomiast
	procedury wewnętrzne - rolę metod. Jeżeli metodami takiej
	"klasy" chciałbym przetwarzać dużą ilość rekordów i nie
	likwidowałbym instancji "obiektów - procedur zewn."
	(czyli instancji moich "klas"),  wówczas miałbym pamięć
	zajętą setkimi lub tysiącami niepotrzebnych mi już instancji.
	Przeprowadzony przeze mnie test polegał na wywołaniu po
	5 000 razy różnych metod: fnd, ins, upd  wewnątrz
	instancji "procedury-klasy", którą zamieszczę poniżej
	(i jeżeli starczy Panu cierpliwości - proszę na nią spojrzeć).
	Tabela tymczasowa ttTbl służy do przekazywania parametrów
	pomiędzy metodami "klasy" a zewnętrznymi procedurami
	tworzącymi i niszczącymi instancje klasy. Takie podejście
	musiałem odrzucić ze względu na wydajność (ok. 2,5 raza gorszą,
	niż w przypadku wywoływania "zwykłych" procedur
	zewnętrznych realizujących to samo, co metody: fnd,
	ins, upd). Trochę tego żałuję, ponieważ dzięki tak
	uzyskanej hermetyzacji miałbym w sposób bardziej
	naturalny zapewnioną częściową zgodność pomiędzy kodem
	źródłowym i projektem aplikacji stworzonym za pomocą
	standardu projektowania obiektowego, jakim jest UML.
	Jeżeli w przedstawionym przeze mnie podejściu popełniłem
	jakieś błędy, lub Pan i inni korespodenci listy macie pomysły,
	aby jednak taką hermetyzację uzyskać (bez utraty wydajności)
	- jestem tym bardzo zainteresowany.
	Zgadzam się z Panem Tomaszem, że polecenie run persistent
	daje inne, cenne możliwości.

	Pozdrawiam

	Bogdan Brzozowski


/* pseudoklasa w formie
   proc. zewn. a_tbl.p */

/* atrybuty klasy-tabeli */
def buffer bA_tbl for a_tbl.

/* do komunikacji z inerfejsem uzytkownika */
def temp-table ttTbl like a_tbl.

/* szukaj rekordu */
procedure fnd:
    def input param iiKeyForFind as int no-undo.
    def param buffer bttTblp for ttTbl.
    def var vcRetp as char init "NOT-OK".

    proc:
    do  on error undo, leave proc
        on stop undo, leave proc:

        case iiKeyForFind:
            when 0 then
                find bA_tbl
                where bA_tbl.tbl_id = bttTblp.tbl_id no-error.

            when 1 then
                find bA_tbl
                where bA_tbl.tbl_name = bttTblp.tbl_name no-error.
        end case.
        if locked(bA_tbl) then
            undo, leave proc.

        if not available(bA_tbl) then
            undo, leave proc.

        vcRetp = "OK".
    end.
    return vcRetp.
end procedure.

/* dopisz nowy rekord */
procedure ins:
    def param buffer bttTblp for ttTbl.
    def var vcRetp as char init "NOT-OK".

    proc:
    do  on error undo, leave proc
        on stop undo, leave proc:
        create bA_tbl.

        run upd(buffer bttTblp).
        if return-value <> "OK" then
            undo, leave proc.

        vcRetp = "OK".
    end.
    return vcRetp.
end procedure.

/* zapis do istniejacego rekordu */
procedure upd:
    def param buffer bttTblp for ttTbl.
    def var vcRetp as char init "NOT-OK".

    proc:
    do  on error undo, leave proc
        on stop undo, leave proc:
        if not available(bA_tbl) then do:
            run fnd(input 0,
                    buffer bttTblp) .
            if return-value <> "OK" then
                undo, leave proc.
        end.

        bA_tbl.tbl_name =  bttTblp.tbl_name.

        vcRetp = "OK".
    end.
    return vcRetp.
end procedure.


/* usun rekord */
procedure kill:
    def param buffer bttTblp for ttTbl.
    def var vcRetp as char init "NOT-OK".

    proc:
    do  on error undo, leave proc
        on stop undo, leave proc:
        if not available(bA_tbl) then do:
            run fnd(input 0,
                    buffer bttTblp) .
            if return-value <> "OK" then
                undo, leave proc.
        end.

        delete bA_tbl.

        vcRetp = "OK".
    end.
    return vcRetp.
end procedure.


/* zwroc rekord  w tabeli tymczasowej */
procedure ret :
    def param buffer bttTblp for ttTbl.
    def var vcRetp as char init "NOT-OK".

    proc:
    do  on error undo, leave proc
        on stop undo, leave proc:
        if not available(bA_tbl) then do:
            run fnd(input 0,
                    buffer bttTblp) .
            if return-value <> "OK" then
                undo, leave proc.
        end.

        buffer-copy bA_tbl to bttTblp.

        vcRetp = "OK".
    end.
    return vcRetp.

end procedure.



------
Strona WWW:     http://pluton.pol.lublin.pl/pugpl/index.htm
Obsluga listy:  listserv@zeto.bydgoszcz.pl
Archiwum listy: http://www.zeto.bydgoszcz.pl/progress/index.html
------