1 / 25

Programowanie komponentowe jesień-zima 2013

Programowanie komponentowe jesień-zima 2013. Wykład 2 Interakcja komponentów Rodzaje apliakcji w Visual Studio. dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz. Zależność komponentów.

oni
Download Presentation

Programowanie komponentowe jesień-zima 2013

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programowanie komponentowejesień-zima 2013 Wykład 2 Interakcja komponentów Rodzaje apliakcji w Visual Studio dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz

  2. Zależność komponentów Komponenty są zależne – aby działać, muszą współpracować. Istotą programowania komponentów jest ich konfiguracja i łączenie bez konieczności modyfikacji kodu źródłowego. Konfiguracja polega na definiowaniu zależności pomiędzy nimi i ich rozwiązywaniu. zawiera Przykład: Samochód zawiera silnik. Samochód dla klienta tworzy zamkniętą funkcjonalną całość i jest gotowy do jazdy. Klient kupując auto chce mieć wpływ na niektóre podzespoły, np. rodzaj silnika. Pogodzenie tych dwóch wymagań może być trudne i jest istotą problemu definiowania zależności pomiędzy komponentami.

  3. Rozwiązywanie zależności Klient tworzy instancję Samochodu, która z kolei tworzy zależną od niej instancję Silnika1.6. public classSamochod { private Silnik silnik = null; publicSamochod() { this.silnik = new Silnik1_6(); } } Hermetyzacja procesu tworzenia komponentu zależnego Samochód decyduje o wyborze poszczególnych komponentów, natomiast Klient nie ma na to żadnego wpływu. W zamian otrzymuje prawidłowo zmontowany pojazd. OK. – w przypadku projektowania obiektowego. ŹLE – w przypadkup projektowania komponentowego. Rozwiązanie tworzy silną zależność pomiędzy Samochodem i Silnikiem, na którą Klient nie ma wpływu: nie może zmienić rodzaju Silnika bez modyfikacji klasy Samochód. Zależność ta definiuje nie tylko kontrakt dotyczący cech Silnika (czyli interfejs), ale narzuca też instancję konkretnego modelu Silnika.

  4. Tradycyjne rozwiązywanie zależności KOMPONENT A 1. Utwórz komponent A KLIENT 4. Zmontuj A i B 2. A zależy od B KOMPONENT B 3. utwórz komponent B 1. Klient żąda utworzenia instancji komponentu A 2. Komponent A posiada zależność od komponentu B, dlatego nie może być utworzony przed nim 3. Komponent A musi utworzyć instancję komponentu B 4. Komponent A musi oraz zmontować je razem 5. Następuje przekazanie zmontowanego zestawu klientowi W efekcie klient otrzymuje żądaną instancję komponentu A, jednak nie ma żadnego wpływu na sposób montażu A i B ani na wybór zależnego komponentu B.

  5. Osłabienie zależności Aby osłabić rodzaj zależności pomiędzy komponentami, można wprowadzić pomiędzy nie interfejs. W tym przypadku komponent Samochód nie zależy bezpośrednio od klasy Silnik1_6, ale od implementowanego przez nią interfejsu Silnik. W praktyce jednak musi także utworzyć instancję klasy Silnik1_6, zatem po wprowadzeniu interfejsu Samochód nadal w pewien sposób będzie zależał od konkretnej klasy Silnik1_6, a ponadto powstanie zależność od interfejsu, który ta klasa implementuje. Takie rozwiązanie nadal nie spełnia swojego zadania.

  6. Odwrócone rozwiązywanie zależności Odwrócone sterowanie (ang. Inversion of Control, IOC) polega na zmianie odpowiedzialności poszczególnych komponentów. Komponenty stają się pasywne – nie tworzą samodzielnie innych komponentów, tylko je odbierają od innego obiektu. W ten sposób komponenty tracą wpływ na sposób zarządzania ich instancjami. Dominującą rolę przejmuje nowy uczestnik interakcji – kontener IoC Rola IoC polega na zarządzaniu tworzeniem wszystkich komponentów oraz dostarczaniu gotowych instancji klientowi. Komponenty, chcąc rozwiązać swoje zależności, zlecają tę czynność kontenerowi, który zna wszystkie komponenty (przechowuje ich konfigurację w tzw. rejestrze) i może dostarczyć ich instancje. Rola klienta nie ulega zmianie – ale ma on większą możliwość konfiguracji i wpływu na zachowanie komponentów Zamiast bezpośrednich powiązań pomiędzy implementacjami komponentów, zależą one od kontenera, którego konfiguracja decyduje o utworzeniu ich instancji.

  7. Inverse of Control Komponent A 1. Utwórz komponent A 2. Znajdź komponent A 4. Znajdź komponent B KLIENT 5. Zwróć komponent A zmontowany z B 3. A zależyod B KONTENER ZARZĄDZAJĄCY Komponent B

  8. Inverse of Control Klient odwołuje się do Kontenera w celu uzyskania zmontowanej instancji Samochodu. Zależności wewnętrzne są ukryte przed Klientem. Jedyne zależności, jakie mogą wystąpić w warstwie komponentów, to żądane lub oferowane przez nie interfejsy, dzięki czemu komponenty stają się bardziej deklaratywne. Rozwiązywaniem zależności i tworzeniem instancji komponentów zajmuje się jedynie kontener, który jest także dla klienta rodzajem interfejsu umożliwiającego dostęp do komponentów.

  9. IoC - podsumowanie API komponentu staje się pasywne. Przesunięcie odpowiedzialności za tworzenie i konfigurację komponentów z nich samych na kontener Usunięcie mocnych powiązać z warstwy komponentów. W IoC komponenty nigdy nie sterują same sobą. Jedynym sposobem komunikacji pomiędzy nimi jest deklarowanie wymaganych zależności, które są rozwiązywane i spełniane przez kontener. Posiada on pełną władzę nad komponentami, także w zakresie tworzenia ich instancji oraz zarządzania cyklem ich życia.

  10. Maszyna wirtualna .NET CLR - CommonLanguageRuntime  środowisko uruchomieniowe dla platformy .NET. Jest to maszyna wirtualna, która wykonuje kod wyrażony w CommonIntermediateLanguage (CIL). CommonIntermediateLanguage (CIL) - język najniższego poziomu dla .NET odczytywalny przez człowieka. Jest to odpowiednik asemblera jako języka pośredniego dla typowych języków wysokiego poziomu (CLI) wyrażający kod w C#, Visual Basic .NET, Managed C++, F#, J# lub inym z 40 języków. CIL jest tłumaczony bezpośrednio na kod bajtowy. CIL jest wykonywany za pomocą maszyny wirtualnej. .assemblyHelloWorld .classautoansiHelloWorldApp { .method public hidebysigstaticvoidMain() cilmanaged { .entrypoint .maxstack 1 ldstr "Helloworld." callvoid [mscorlib]System.Console::WriteLine(string) ret } }

  11. Common Language Infrastructure CLI to część platformy Microsoft .NET Framework, wykorzystywana jako środowisko uruchomieniowe oprogramowania stworzonego w różnych językach. Specyfikacja CLI opisuje: Wspólny zestaw typów danych (CommonType System) – zbiór typów danych, które są obsługiwane przez wszystkie kompatybilne języki. Metadane – informacje o strukturze definiowanych klas, interfejsów i innych typów, pozwalające na ich wykorzystanie w różnych językach i narzędziach. CLS (CommonLanguageSpecification) – określa zbiór reguł, do których wszystkie języki zgodne z CLI muszą się stosować, aby były kompatybilne z pozostałymi językami. Wirtualny system wykonawczy (VirtualExecution System) – wczytuje i wykonuje programy kompatybilne z CLI.

  12. C++ w Visual Studio

  13. Trzy sposoby tworzenia programu Korzystanie z Windows Forms – sposób tworzenia aplikacji oparty na formularzach, która jest uruchamiana w środowisku CLR tworzenie GUI budując projekt metodą „przeciągnij i upuść” bez konieczności pisania dużej ilości kodu. Jest to najszybszy i najprostszy sposób budowania aplikacji, która działa w środowisku CLR, które pogarsza nieznacznie wydajność. Korzystanie z biblioteki Microsoft Foundation Classes (MFC), która zawiera klasy C++ obejmujące API Windows korzystanie z gotowych kontrolek GUI, korzystając z metody wizualnego programowania. Należy jednak napisać sporo kodu do obsługi interakcji z użytkownikiem. Umożliwia to dużą kontrolę nad tworzonym GUI, większą niż w Windows Forms. Program działa natywnie na PC, więc nieznacznie ma lepszą wydajność. Korzystanie z API Windows jako podstawowego interfejsu systemu operacyjnego Windows do komunikacji między systemem operacyjnym i aplikacją Należy napisać cały kod dla wszystkich elementów GUI (pracochłonny)

  14. Program w Windows API #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCEhPrevInstance, LPSTR lpCmdLine, intnCmdShow) { MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK); return 0; } Najprostszy program w języku C generujący MessageBox – okienko z przyciskiem OK. HINSTANCE hInstance Uchwyt do instacji wykonywanego programu (pliku .exe w pamięci) HINSTANCE hPrevInstance Zawsze NULL w przypadku programów Win32 LPSTR lpCmdLine Lista argumentów z jakimi program został wykonany. Nie zawiera nazwy programu intnCmdShow Wartość całkowita, która może zostać przesłana do funkcji ShowWindow(). later.

  15. Program w Windows API - Okienko Krok 1 – tworzymy i rejestrujemy tzw klasę okna int WINAPI WinMain(HINSTANCE hInstance, HINSTANCEhPrevInstance, LPSTR lpCmdLine, intnCmdShow){ WNDCLASSEX wc; HWND hwnd; MSG Msg; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = g_szClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)){ MessageBox(NULL, "WindowRegistrationFailed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; }

  16. Program w Windows API - Okienko Krok 2 – tworzymy Okno programu hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, g_szClassName, "Thetitle of my window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "WindowCreationFailed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);

  17. Program w Windows API - Okienko Krok 3 – implementujemy i uruchamiamy pętlę komunikatów (tzw. procedurę okna) while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ caseWM_CLOSE: DestroyWindow(hwnd); break; caseWM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }

  18. Program w MFC MFC – Microsoft Foundation Classes Opakowanie dla WinAPI, zestaw klas C++ umożliwiających wygodniejsze pisanie programów MFC od pewnego czasu jest wypierane przez .NET, ale jest rozwiązaniem przydatnym jeśli nie chcemy używać .NET Microsoft zapowiada stopniową integrację MFC z .NET MFC nie jest dostępne w wersjach Express produktów Visual Studio Zalety Znaczne uproszczenie tworzenia typowych aplikacji w stosunku do WinAPI Wygodniejsze zastosowanie w technologiach obiektowych (m. in. dziedziczenie z jednej klasy) Organizacja współpracy między warstwą dokumentu a warstwą prezentacji Organizacja wymiany danych z okienkami Dodatkowe klasy związane m. in. z kolekcjami i serializacją Wizardy wspierające tworzenie aplikacji

  19. Program w MFC Wady Rzeczy które nie zostały przewidziane przez twórców biblioteki często bardzo trudno zaimplementować. Konieczne jest modyfikowanie fragmentów generowanych przez wizardy, co często powoduje niekompatybilności i trudności w dalszej pracy z wizardami Zmiana rodzaju projektu po wygenerowaniu przez wizard jest praktycznie niemożliwa Architektura dokument-widok jest niezbyt przejrzysta, niektóre rozwiązania są niejasne Konieczność dołączania bibliotek

  20. Program w MFC Koncepcje: Podejście obiektowe. Język CPP. Nazwy klas zaczynają się od C. Prawie wszystkie dziedziczą po CObject Podstawowe klasy aplikacji użytkownika dziedziczą po klasach MFC Duża część implementacji polega na pisaniu własnych implementacji funkcji zdefiniowanych w klasach bazowych Prawie wszystkie elementy interfejsu dziedziczą po CWnd Możliwe są trzy zasadnicze rodzaje aplikacji: Dialog, SDI, MDI Interakcja między elementami jest oparta na standardowych komunikatach Windows, Obsługa dodawana przez wizardy

  21. Rodzaje głównych okien Windows Interfejs typu jednodokumentowySDI (thesingle-documentinterface) Można otworzyć tylko jeden dokument - jeśli jest otwarty jeden dokument, nie można otworzyć drugiego okna

  22. Rodzaje głównych okien Windows Interfejs typu wielodokumentowy MDI (themultiple-documentinterface) Dokument – reprezentacja pliku w pamięci programu. Widok – okno prezentujace dokument. W programie można jednocześnie wiele dokumentów. Można generować różne widoki tego samego dokumentu.

  23. Rodzaje głównych okien Windows Interfejs typu Dialog Aplikacja składa się z jednego okna, na którym sąokna sterujące (kontrolki). Dialog może być: Niemodalny Modalny Modalny systemowo

  24. Rodzaje głównych okien Windows interfejsu programu typu „explorer-style” Pojedyncze okno zawierające dwa panele - w lewym panelu zawierające zazwyczaj drzewo lub hierarchiczny widok, w prawym panelu wyświetla zawartość obszaru zaznaczonego w lewym panelu. Służy do wyboru lub nawigacji wśród dużej liczby plików, dokumentów, obrazów

  25. Aplikacje typu Windows Forms

More Related