2010-10-01 11 views
5

ludzie, programuję GUI dla aplikacji, kontenera CD do wstawiania cd, a obecnie nie jestem bardzo jasny i myślę, że potrzebuję pomocy w wyjaśnieniu mojej wiedzy na temat projektowania obiektowego .obiektowe pytanie projektowe dla aplikacji GUI

Po pierwsze, używam wzorca obserwatora do budowania klas abstrakcyjnych modeli i widoków, a także konkretnych modeli (kontener cd) i widoków konkretnych (widok kontenera CD). Wtedy zacznę używać ramy wxWidget zaprojektować i wygląd graficzny lub układ (CDContainerWidget z wxPanel) do pojemnika CD oraz innych kontroli gui mainframe (z wxFrame), etc ..

więc teraz mam trzy klasy: CDContainerModel (kontener cd), CDContainerView (klasa dla wzorca obserwacyjnego) i CDContainerWidget (kontrolki GUI). Wtedy nie wiem, co powinienem zrobić z CDContainerView i CDContainerWidget?

Myślę, że CDContainerWidget i CDContainerView wymagają zarówno CDContainerModel. Myślę o czterech podejściach, ale nie wiem, który z nich jest właściwy:

1). powiąż CDContainerWidget z CDContainerView jako zmienną składową, a następnie umieść CDContainerView w ramce głównej jako zmienną składową.

class CDContainerView: 
    def __init__: 
    self.gui=CDContainerWidget 

class MainFrame: 
    def __init__: 
    CDContainerView 

2). Podklasa CDContainerView CDContainerWidget:

class CDContainerView(CDContainerWidget): 

class MainFrame: 

    def __init__: 

    CDContainerView 

3). Podklasa CDContainerWidget CDContainerView:

class CDContainerWidget(CDContainerView): 

class MainFrame: 
    def __init__: 
    CDContainerWidget 

4). zamiast używać CDContainerWidget i CDContainerView użyć tylko jednej klasy CDContainerBig które podklasy klasy abstrakcyjnej View i wxPanel

class CDContainerBig(View, wxPanel) 

Moje pytanie brzmi, co jest dobrym rozwiązaniem? Przeczytałem stronę wiki o wzorze MVC, ale tak naprawdę nie rozumiem jej opisu i nie wiem jak, a także zastanawiam się, czy jest stosowne zastosować ją do mojego problemu.

cóż, dodałem kilka dodatkowych komentarzy. pierwotnie, kiedy zacząłem projektować program, nie myślałem dużo i po prostu wybrałem, 2) podejście. ale teraz myślę, że 3) jest dobre. ponieważ rozsądne jest umieszczenie widgetu w widgecie (CDContainerWidget w MainFrame). ale nie jestem naprawdę pewien. Wydaje się również, że w przypadku wzorca obserwacyjnego trzy klasy są skręcone i awkard. Czasami wydaje mi się, że te 4 mogą być takie same, tylko kto obejmuje, kto wysyła wiadomości do kogo. Cóż, myślę, że naprawdę potrzebuję wyjaśnienia w tej kwestii.

Jestem również za 3) z praktycznego punktu. W CDContainerWidget faktycznie zawiera kilka komponentów subwidget (przycisk, pole wprowadzania, itp.) I jeśli zmienimy coś jak ustawić nowe wartości za pośrednictwem widgetu podskładnik, to na 1), potrzebujemy CDContainerWidget, aby mieć świadomość o CDContainerView, aby CDContainerView mógł powiadamiać inne widoki. dla 2) jeszcze gorzej, CDContainerWidget musi być świadomy swojego dziecinnego CDContainerView. dla 3) CDContainerWidget sam jest CDContainerView, więc całkiem rozsądny. dla 4) dobrze, łatwo, ale bez separacji logicznej. to jest moja własna myśl, nie wiem, czy to prawda.

Dzięki!

+0

Nigdy nie komentuj swojego własnego pytania. Nigdy. Proszę ** zaktualizować ** swoje pytanie do wypełnienia. Następnie, po ** aktualizacji **, usuń mylące komentarze. Nigdy nie komentuj swojego własnego pytania. –

Odpowiedz

1

Co może sprawić, że łatwiej będzie Ci zrzucić połączenie między klasami, implementując wzór szczeliny sygnału z czymś takim, jak Spiff Signal lub jednym z innych dostępnych modułów sygnału/gniazda.

Oddzielając logikę komunikacji, możesz całkowicie uwolnić się od konieczności bezpośredniej rozmowy z modułami, a zamiast tego używać wiadomości przekazywanych z oddzwanianiem.

1

Opcja 1 wydaje się najbardziej odpowiednia. Generalnie powinieneś unikać dziedziczenia, chyba że wzorzec tego wymaga, lub jest jakiś inny ważny powód, aby go używać. Nadużywanie dziedziczenia sprawi, że twój kod będzie dużo bardziej zintegrowany niż jest to konieczne.

+0

Witam, p-static, dziękuję za odpowiedź. Czy mógłbyś bardziej szczegółowo wyjaśnić, dlaczego 1) najbardziej odpowiednie. To, co powiedziałeś, to po prostu "delegacja jest lepsza niż dziedziczenie", nic więcej, i jest to ogólna zasada projektowa, ale nie jest specyficzna dla mojego pytania. Szczerze mówiąc, nie jestem do tego przekonany. – pepero

+1

Cóż, z mojego doświadczenia wynika, że ​​nie chcesz mieć zależności od kodu GUI w jakiejkolwiek innej części programu, która tego nie wymaga (jak klasa View) - zrobiłem to w kilku projektach i zawsze żałował, że niedługo potem. To eliminuje 2) i 4). 3) faktycznie wydaje się rozsądnym rozwiązaniem; moim jedynym problemem jest moje uprzedzenie do dziedziczenia. :) –

+0

(+1 do wszystkiego, co powiedziałeś). "uprzedzenie do dziedziczenia" jest zawsze lepsze niż irracjonalne pragnienie, by wszędzie umieścić dziedzictwo. – Raveline