Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C++] Podział programu na moduły.

Arkain 27 Mar 2012 13:10 4073 11
  • #1
    Arkain
    Level 10  
    Witam.

    Do tej pory pisałem programy w konsoli oparte na funkcjach. Programy dzieliły się na wiele plików .hpp i cpp z funkcjami i klasami.



    Obecnie uczę się Borland C++ i równolegle WINAPI. Tam wszystko jest oparte o zdarzenia. Proszę jak mogę znaleźć książki/strony www/inne źródła o tym jak takie programy się pisze - jaka powinna być struktura kodu i jak dzielić taki program na moduły. Po jakich hasłach znajdę opis prawidłowego stylu programowania programów okienkowych i dzielenia ich na moduły. Jak deklarować w nich zmienne globalne do których muszą mieć dostęp inne moduły i tego typu sprawy.

    Chodzi o to że obecnie program ma np 600-900 linii i w pliku głównego okna są wszystkie zdarzenia go dotyczące a w nich były funkcje i zmienne lecz wszystko stawało się tak nieczytelne i rozwlekłe że trzeba było przebierać w sporej ilości zdarzeń, linijek by odnaleźć to czego się szuka. Więc teraz w funkcjach obsługi darzeń np są tylko po 1 funkcji a ta funkcja jest w osobnym pliku (i w niej jest cała zawartość lecz taki sposób jest uciążliwy bo i tak nie mam dostępu bezpośredniego np do pola edit w tym oknie tylko muszę zwracać wartość funkcją i dopiero w pliku głównego okna przypisywać to do edit-a - to tylko przykład). Jednak nadal w pliku głównym okna jest bardzo dużo funkcji obsługi zdarzeń.

    Chciałbym by dało się tak zrobić i podzielić to na moduły że w pliku źródłowym głównego okna były tylko odwołania do modułu w którym są definicje zdarzeń odpowiedzialnych za każdy przycisk np moduł interfejsu osobno moduł sieciowy itp. a w nich tak swobodny dostęp jak gdybym pisał w pliku głównego okna. Jak tworzy się takie podziały w programach okienkowych?

    Serdecznie dziękuję za pomoc i jest to niby banalny temat podziału na pliki cpp i hpp ale jednak zasady podziału programu okienkowego opartego o zdarzenia nie jest dla mnie tak jasny jak opartego o funkcje. Proszę o pomoc.
  • #2
    directx11
    Level 17  
    Odnośnie pisania programów okienkowych, to w mojej opinii one właśnie bardzo dobrze pokazują samą ideę programowania obiektowego np. w C++ a także korzystania z niektórych wzorców projektowych. Podział na pliki występuje niejako w sposób naturalny, narzucany z góry przez frameworki okienkowe min. MFC, wxWidgets czy Qt (w Borlandzie też coś tam jest). Piszesz, że uczysz się też WINAPI, ale to jest raczej dobre do poznania jak funkcjonują mechanizmy okien w Windows, bo do pisania większych programów średnio się nadaje. Większość środowisk ma gotowe mechanizmy do tworzenia obiektów potrzebnych do funkcjonowania aplikacji, tj. okien, zasada jest prosta - każde okno ma swój plik nagłówkowy i źródłowy, bo każde coś dziedziczy po frameworku. Jeśli mówimy o pisaniu w czystym WINAPI to zastanów się nad sensem, bo wypracowywanie takiego podziału nie prowadzi do niczego innego, tylko do powstania takiego właśnie frameworka w miarę rozwoju kodu. Jeśli zakładasz używanie frameworka to musisz mieć świadomość, że gro funkcjonalności zostanie przed Tobą ukryte, min. funkcje obsługi komunikatów itp. i zastąpione zostanie przez wygodne mechanizmy do obsługi takich zdarzeń.
  • #3
    Krzysztof Gustaw
    Level 23  
    Witam!
    Polecam książkę "Windows od kuchni" autor Roland Wacławek. Fakt, jest trochę stara i programy pisane są w PASCALu ale aplikacje działają równiez pod XP-kiem. Autor bardzo przystepnie, czasami z humorem przekazuje cenne informacje. Te książkę naprawdę czyta się jak dobrą powieść.
    Pozdrawiam
  • #4
    LightOfWinter
    Level 33  
    W kwestii podziału kodu na moduły/ pliki jest to tak zwana architektura oprogramowania. Czyli filozofia podziału na moduły/warstwy żeby potem było wygodnie nad nimi pracować. Proponuję poszukać pod takim hasłem.

    Ja z Framework-ami spotkałem się pod Javą, a nie pod C++. Proszę mnie poprawić jeśli się mylę.

    Odnośnie WinAPI jak i C++
    Warto przejrzeć strony Microsoftu odnośnie Visual C++ jest tam sporo użytecznych informacji i przykłady.

    Pozdrawiam
  • #5
    Arkain
    Level 10  
    Dzięki wam za odpowiedzi ;]

    Mój problem polega na tym że do tej pory programy opierałem o funkcje (konsola). Teraz gdy zaczynam pisać programy okienkowe i widzę (tak jak to mówił kolega wyżej) że każde okno ma swój plik i nagłówkowy i źródłowy to pojawił się problem taki:

    W pliku źródłowym okna zacząłem mieć zbyt wiele funkcji obsługi zdarzeń i ciężko się już po nim poruszać. Postanowiłem więc zrobić osobne moduły (osobne pliki źródłowe i nagłówkowe) tak aby np wszystko co się tyczy obsługi RS-232 było w jednym a dotyczące obsługi przycisków i ogólnie GUI w drugim itd.

    Na początku zrobiłem to tak że w pliku źródłowym okna zostawiłem funkcje obsługi zdarzenia a jej ciało zastępowałem wywołaniem funkcji która była w innym pliku. Jednak nie jest to wygodny mechanizm.

    Chciałbym tak zrobić by pisząc np funkcje obsługi zdarzenia dla konkretnego okna w różnych plikach, działałby one tak jak gdyby były wewnątrz pliku źródłowego okna.

    Może się mylę może tak się nie pisze? Nie bardzo wiem też z kąt czerpać wiedzę na temat tego jak powinna wyglądać struktura programu okienkowego i jego podział na moduły (dziękuję przedmówcy za trop który teraz sprawdzam).

    Chodzi mi o taki swoisty szablon aplikacji np 1-dno okienkowej w którym występuje podział na moduły.

    W którym miejscu należy deklarować zmienne globalne itp?
    Bo w tej chwili to piszę by jedynie działało... A to błąd bo poco robić sobie złe nawyki.

    Pisania programów dla konsoli w C++ uczyłem się z "Symfonia C++" J. Grębosza.
    Czy jest na naszym rynku aktualna polskojęzyczna książka o pisaniu programów okienkowych pisana w podobnym stylu jak "Symfonia"?


    Za każdą pomoc z góry serdecznie dziękuję ;]
  • #6
    sedr
    Level 17  
    Arkain wrote:
    W którym miejscu należy deklarować zmienne globalne itp?


    W żadnym. Powinno unikać się korzystania ze zmiennych globalnych.

    Tak jak kolega directx11 stwierdził, poszukaj coś o wzorcach projektowych i o inżynierii oprogramowania.

    @Krzysztof Gustaw: polecanie 20 letniej książki raczej nie jest dobrym pomysłem. To jest tak jak byś polecał książkę o programowaniu w DOSie. Niby wiedza jakaś jest, ale tak naprawdę jest obecnie bezużyteczna.

    @LightOfWinter
    Quote:
    Ja z Framework-ami spotkałem się pod Javą, a nie pod C++. Proszę mnie poprawić jeśli się mylę.


    Mylisz się. Framework to dość obszerna koncepcja, która nie organiczna się tylko do Javy.
  • #7
    Arkain
    Level 10  
    Wiem że powinno się unikać ale np jak różne zdarzenia korzystają z kolejki pakietów i odczytują je z bufora to ten bufor (kolejka) musi być globalnie dostępny? Może się mylę?
  • #8
    sedr
    Level 17  
    Arkain wrote:
    Wiem że powinno się unikać ale np jak różne zdarzenia korzystają z kolejki pakietów i odczytują je z bufora to ten bufor (kolejka) musi być globalnie dostępny? Może się mylę?


    To zależy tylko i wyłącznie od Ciebie. Jaką sobie przyjmiesz architekturę to tak będziesz miał. Nie ma jednego pomysłu na zrobienie czegoś.
  • #9
    directx11
    Level 17  
    Odnosząc się jeszcze do głównego problemu to najlepiej jest właśnie robić tak, żeby wszystkie komunikaty przychodzącego dla danego okna były obsługiwane w jego kodzie. Jeśli będziesz używał lepszych IDE to one Ci będą robiły to niejako z automatu, np. dodasz obsługę rysowania czy wybierania z menu itd. wtedy mechanizm IDE wygeneruje Ci odpowiedni kawałek kodu gdzie trzeba. Jeśli chodzi o RS-232 poszukaj w środowisku, którego używasz czy nie ma dedykowanej, gotowej klasy do jego obsługi, może się zdarzyć tak, że będziesz miał problem z głowy. Dobrze przy takiej okazji byłoby liznąć wiedzy na temat wątków, ich synchronizacji itp.
  • #10
    szefkozak
    Level 11  
    Ja generalnie polecałbym Ci spróbować .NET, który jest frameworkiem microsoftu. Jedna z jego wad jest to, że aplikacje w nim napisane działaja jedynie w środowisku Windows( są opcje na linuks mono ale podobno jest z nimi wiele problemów), ale skoro korzystasz z winapi to i tak chcesz pisać aplikacje po winde. Filozofia .Net jest taka, że możesz pisać w różnych językach, a wszystko tłumaczone jest do języka bajtowego. Pośród tych języków jest C++/CLI. Jest to delikatnie zmodyfikowane c++. Zaletą korzystania z >Net jest olbrzymie wsparcie oraz mnóstwo przykładów(polecam strone MSDN jeżeli j angielski nie jest dla Ciebie barierą). W przeciwieństwie do pseudo obiektowgo winApi c++/cli jest w pełni obiektowy. Bardzo szybko można w tym środowisku zrozumieć obiektowość. I co najważniejsze łatwo tam rozgraniczyć poszczególne zdarzenia związane ze swoja klasą: okna portu rs itp. wszystko można pozamykać w definicjach poszczególnych klas, dzięki czmu programy staja się bardziej modularne. Pozatym problem zmiennych globalnych moża łatwo rozwiązać stosując zmienne statyczne klas). Polecam przynajmniej spróbować .Net.

    Jest również dobrz książka na początek, tak żeby załapać o co mniej wiecej chodzi:

    "Microsoft Visual C ++ 2008 : tworzenie aplikacji dla Windows" / Rafał Wileczek.
  • #11
    gbd.reg
    Level 21  
    Jeśli interesuje Cię jednak pisanie aplikacji pod wiele systemów operacyjnych (jak i platform mobilnych typu android, iOS, symbian) polecam zamiast .Net użyć Qt4. Funkcjonalność bardzo podobna do dotnetu, ciekawy i łatwy do zrozumienia system slotów i sygnałów (do synchronizacji wątków i przekazywania między nimi informacji i zdarzeń) oraz bardzo dobra dokumentacja (po angielsku). Jeśli wiesz wystarczająco dużo o wskaźnikach, obiektach i ogólnie o C++, powinieneś sobie spokojnie poradzić z ogarnięciem Qt.

    http://www.voidrealms.com/tutorials.aspx?filter=qt dobrze napisany tutorial wprowadzający do programowania w Qt :)

    I odnośnie Twojego problemu podziału, Qt ma dobrze narzucony podział na pliki (chyba jak każdy obiektowy framework) i posiada klasy praktycznie do wszystkiego, więc możesz mocno uszczuplić swój kod :)
  • #12
    Arkain
    Level 10  
    Dziękuję za wyjaśnienia i pomoc ;]

    Temat zamykam.