logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c++] Interfejs i przekazywanie różnych parametrów

McRancor 24 Lut 2010 21:17 2389 2
REKLAMA
  • #1 7745882
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    Witam!

    Mam problem natury architektonicznej. Piszę w c++ pod windowsem.

    Planuje moduł zapewniający obsługę interfejsu USB i RS232. Chciałbym zaprojektować interfejs, który zainicjuje odpowiedni interfejs komputera (USB/RS232) w zależności od parametrów przekazanych przez metodę init. Jednocześnie interfejs zrealizowany jest w postaci wzorca projektowego automatu stanu, który pilnuje żeby nie zostały wykonane metody zapisu i odczytu danych kiedy nie było poprawnej inicjalizacji.

    Moduł ma architekturę warstwową. Na górze znajduje się aplikacja, która chce wykonać funkcję init(), z parametrami na podstawie których zostanie zainicjowany odpowiedni interfejs komputera.

    Przykładowo:
    init(parametryUsb); //zainicjuje interfejs USB i odpowiednie jego ustawienia,
    init(parametryRS); //j.w. tylko RS232

    Gdzie parametryRS/USB to odpowiednie struktury z parametrami.

    Interesuje mnie bardziej jak powinno to zostać rozwiązane, aby było możliwie poprawne architektonicznie. Nie zależy mi na napisanie kawałka bylejakiego kodu, bo to mam opanowane do perfekcji ;)

    Zależy mi na tym żeby interfejs był możliwie prosty, niezawodny i jednolity do jak najniższych warstw.

    Myślałem nad wykorzystaniem szablonów specjalizowanych, ale nie wiem czy to najlepsze rozwiązanie. Przeciążenie funkcji w zależności od argumentów jest najprostrzym rozwiązaniem, ale czy najlepszym? Może factory pattern, który podepnie odpowiedni obiekt do state patternu interfejsu?

    Macie może jakieś ciekawe propozycje?

    PS> interfejs i interfejs komputera to dwie różne rzeczy - słaby z polskiego jestem ;)
  • REKLAMA
  • Pomocny post
    #2 7749789
    ostrytomasz
    Poziom 25  
    Posty: 496
    Pomógł: 82
    Ocena: 219
    "Poprawność architektoniczna" to moim zdaniem rzecz względna i dyskusyjna.
    Jeżeli priorytetem byłaby skalowalność (prostota rozszerzania programu o kolejne media), to zastosowałbym fabrykę wg Alexandrescu.
    Problematyczne, niejednorodne init() zastąpiłbym funkcją, której działaniem byłoby utworzenie fragmentu interfejsu użytkownika związanego z konfiguracją (kilka widżetów w jakimś kontenerze) przenosząc tym samym odpowiedzialność za formę i zakres konfiguracji do klasy konkretnego medium (vide: klasy przetwarzania sygnałów http://www.eig.ch/fr/laboratoires/systemes-nu...ojets/osqoop-l-oscilloscope-libre/index.html).
    Zapis/odczyt konfiguracji można powierzyć klasie konkretnego medium lub przyjąć jakiś amorficzny bufor jako "uniwersalny" nośnik zlecając serializację/deserializację klasie konkretnego medium.
    Jeżeli uczynienie fragmentu GUI składnikiem klasy konkretnego medium byłoby niepożądane można użyć uniwersalnego "edytora właściwości" jak w środowiskach RAD, zdefiniować 2-3 typy właściwości odpowiadające np. polu edycyjnemu, suwakowi i liście. Klasa konkretnego medium dostarcza zbiór/listę swoich właściwości pozwalając na skonfigurowanie edytora.
  • Pomocny post
    #3 7750681
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Zaprojektuj interfejs (klasę abstrakcyjną) np. ICommEndpoint dla operacji wykonywanych przez urządzenie (read, write, open, close etc).
    Klasy Rs232Endpoint i UsbEndpoint implementują ICommEndpoint.
    Konstruktory mogą dowolnie konfigurować endpoint - możesz też użyć fabryki.
    Przekazujesz ICommEndpoint& do podmodułu, a tam korzystasz z interfejsu.
    Jeśli trzeba rekonfigurować połączenie po utworzeniu obiektu to najprościej przekazać nową instancję obiektu - dostarczenie jednolitego interfejsu do konfigurowania różnych typów endpointów może być dość problematyczne... Przeciążanie typem argumentu oznacza, że musisz statycznie wiedzieć jaki to typ - to samo z wzorcami.
    Jedyne sensowne rozwiązanie to polimorfizm.

    Pozdrawiam,
    Dr.Vee
REKLAMA