2009-07-30 15 views
9

Czy ktoś ma jakiekolwiek przemyślenia na temat koncepcji Tablicy z p.165 "Pragmatycznego programisty"?Ktoś myśli w ten sposób o użyciu Wzorca Tablicy?

Chcę mieć kilka małych podsystemów (DLL i EXE) w większości niezależnie od siebie. Istnieje kilka złożeń, które będą używane przez wszystkie EXE. Zespoły te prawie wszystkie korzystają z tej samej bazy danych. Zamiast używać interfejsów do komunikacji pomiędzy tymi zespołami, czy wzór typu Tablica nie zapewnia większej niezależności?

Mam na myśli konstruktor typu mediatora, który powiadamia poprzez zdarzenia i przechodzi przez niego cała komunikacja podukładowa. Dzięki temu syb-systemy są bardzo niezależne. Mediator będzie nosił nazwę wszystkich powiadomień, które powinien nadawać. Subskrybenci będą następnie słuchać określonego wydarzenia według nazwy, ale zawsze subskrybują to samo (lub może przekazać nazwę jako parametr) zdarzenie mediatora.

Oto kilka dyskusja na jej temat: http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_22829492.html

+0

Jestem także zainteresowany poznaniem, jak to jest lepsze niż "workflow". – Mank

Odpowiedz

13

Pojęcie tablicy jest to, że wiele niezależnych procesy działają i aktualizuje tablicę jak oni wypracować jego fragmentów. Klasycznym przykładem jest rozpoznawanie mowy. Dane wejściowe to dźwięk, który ma zostać rozpoznany. Dźwięk może być podzielony na segmenty i wiele wątków zaczyna dopasowywać fragmenty do słów. Ponieważ każdy wątek znajduje pasujące słowa, aktualizuje tablicę z tłumaczeniem do tego momentu. W miarę jak zaczyna się składać zwrot, inny wątek może sprawdzać gramatykę, aby zweryfikować wybory dokonywane przez różne wątki rozpoznawcze. Jeśli słowo ma niską pewność siebie i narusza gramatykę, utwór można ponownie uruchomić, szukając alternatyw. Może to nawet doprowadzić do ponownej partycjonowania danych dźwiękowych w miarę jak zacinają się i pauzy.

Ponieważ zdania stają się zdaniami, można uzyskać jeszcze większe widoki, a różne opcje dla homofonów (para, pare) mogą zostać rozwiązane. Wszystko to odbywa się poprzez otwarcie tablicy na wszystkie procesy, a "blokady" są stosowane tylko podczas wprowadzania różnych wyników.

Używanie bazy danych jako tablicy ma sens, ponieważ transakcje są "za darmo" , ale zależy to od tego, jak agresywnie dane są aktualizowane i ponownie czytane. Jeśli dzieje się to bardzo szybko, wycieczki w obie strony zsumują się i uczynią strukturę pamięci bardziej rozsądną.

Pomysł mediatora ma sens, ponieważ tworzy pojedynczy punkt blokowania ... a algorytmy tablicowe rzadko stykają się z zakleszczeniami stylu A-> B, B-> A, ponieważ proszą o wszystkie elementy danych z przodu. Poza tym rezygnacja z blokady nie jest dużą karą, ponieważ różne podzadania będą ponownie uruchamiane, gdy dane będą się pojawiać. Subskrybenci tablicy będą musieli zostać powiadomieni, gdy dane, które mają, staną się przestarzałe, co można zrobić za pomocą wywołań zwrotnych, które uruchomiłyby ponownie zadanie z najnowszymi danymi.

Odnośnie komentarza dotyczącego przepływu pracy: główna różnica polega na tym, że większość przepływów pracy jest koordynowana przez proces główny, który przyjmuje właśnie wprowadzony stan i podejmuje decyzje o tym, jakie stany staną się dostępne dla danych, do których można się przenieść. Chociaż mogą istnieć niezależne podmioty, rzadko angażują się w "prześcignięcie" się nawzajem poprzez tworzenie lepszych wyników (które następnie będą wykorzystywać inne zadania). Innymi słowy, przepływ pracy jest zwykle bardzo ograniczonym zbiorem stanów, przez które przechodzą dane, podczas gdy tablica jest prawie darmowa - dla wszystkich niezależnych działań. (To powiedziawszy, tablica może leżeć za twoim przepływem pracy: http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf)

Nie mogę wymyślić żadnych przykładów C# z wzoru, który widziałem, a rodzaj pracy, którą wykonuję, nie ma za wiele do tego zaproszenia (obliczenia są deterministyczne). Podczas niektórych wyszukiwań znajdują się odniesienia w innych językach, ale żaden nie wygląda na świetną jakość.

+0

Dzięki. Czy nie sprawdzi się jako centralna komunikacja pomiędzy rozproszonymi aplikacjami w intranecie? – 4thSpace

+2

Wydaje się rozsądny wzór dla aplikacji rozproszonych z kilkoma zastrzeżeniami. Po pierwsze, jest zwykle używany w scenariuszach czasu rzeczywistego lub w czasie zbliżonym do rzeczywistego, w których narzut na bardziej złożony model (który może uniknąć łatwiejszych obliczeń) jest przeważony przez szybkie aktualizacje, które dostarczają innym procesom lepszych danych wyjściowych. Drugim zastrzeżeniem jest to, że tablica handluje prędkością zbieżności dla przepustowości: może istnieć wiele zbędnych ponownych odczytów spowodowanych cyklem aktualizacji/powiadamiania. – Godeke

+1

Z powodu tych dwóch potencjalnych problemów zdecydowanie zapewniłbym, że bardziej tradycyjny model dystrybucji sieci (taki jak użycie projektu, w którym proces centralny rozprowadza obciążenie do procesów roboczych w ramach farmy) nie ma większego sensu. Nieco większa liczba obliczeń z przodu w centrum może oznaczać, że można uniknąć większości przeróbek, po prostu nie wysyłając poleceń do pracowników, dopóki cały scenariusz nie będzie dostępny dla tej jednostki pracy. Trudno powiedzieć, nie znając charakteru pracy: iteracyjnej (Blackboard) lub dystrybucji obciążenia (hub/worker). – Godeke

Powiązane problemy