2013-05-11 12 views
9

Chcę utworzyć procedurę obsługi danych rur i filtrów opartych że należy manipulować przychodzące zbiory danych jak tak, ale nie neccessarily m.in:Najbardziej eleganckim sposobem wdrożenia rur i Wzorzec filtru

rury źródłowego (może być zestaw danych from a db) < -sink-source-> filter (dodaj dodatkowe pole) < -sink-source-> filter (zmień trochę danych/usuń, np. unieważnij zestaw danych)

Mam pomysł, jak taka architektura będzie wygląda jak w C/C++. Ale biorąc pod uwagę wszystkie gadżety, które pochodzą z aspektów funkcjonalnych C++ 11 za, mam nadzieję, że to zadanie może być wykonane w elegancki sposób, tak, że jest w stanie:

  • łatwe skalowanie i używać go w środowisku wielowątkowym (np wykonując zadania filtrów jako stdscr lambda, więc prawdopodobnie uniknąć przynajmniej pewną obsługę gwintu)
  • łatwe dodawanie i usuwanie filtrów w czasie wykonywania
  • wejście
  • uchwyt strumieni leniwie

Odpowiedz

3

co opisujesz jest jakiś streamingu architektura lub architektura rurociągów. Standardowy C++ nie ma nic konkretnego, ale zapewnia, jako autorowi biblioteki, niezbędne prymitywy w języku i standardowej bibliotece, aby zbudować taką architekturę. Po prostu twórz klasy i interfejsy zgodnie ze zwykłym programowaniem obiektowym, a następnie twórz je i łącz je w potoku zgodnie z Twoimi potrzebami.

Na przykład można mieć Source interfejsu oraz interfejs Sink - i Filter abstrakcyjne klasy, która implementuje zarówno Source i Sink, jak również Pipe klasy, która implementuje zarówno Source i Sink i po prostu przekazuje dane prosto. Jest to tylko jeden z wielu sposobów na nazwanie i zorganizowanie takiej struktury.

+0

Mówisz „standard C++ nie ma nic konkretnego ", co jest poprawne. Jednak już wiem, jak wyglądałaby wspólna implementacja w C++ (jak w twoim przykładzie). Ale interesowało mnie coś: – benjist

+0

@benjist: Ogólność mojej odpowiedzi pasuje do ogólności twojego pytania. Twoje pytanie byłoby lepsze, gdybyś zapytał o coś bardziej konkretnego. "Jaki jest najbardziej elegancki sposób na wdrożenie wzorca projektowego X?" jest zbyt szeroki i subiektywny. –

+0

Niestety, mój poprzedni komentarz został skrócony. Masz rację, że pytanie jest trochę ogólne. Ale wciąż mam pytanie, czy nie ma bardziej eleganckiej drogi do tych trzech wymagań/życzeń, które stawiam teraz w C++ 11. Dla przykładu, czy nie byłoby możliwe posiadanie wektora filtrów i użycie std :: transform do zastosowania tych filtrów na danych? Czy nie ułatwiłoby to robienia równoległych zadań? Itd. – benjist

Powiązane problemy