370 likes | 535 Views
Programowanie komponentowe jesień-zima 2013. Wykład 1 Wprowadzenie. dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz. Warunki zaliczenia. Wykład/Egzamin Test pisemny Laboratorium – na podstawie rozwiązań ćwiczeń. Zakres materiału.
E N D
Programowanie komponentowejesień-zima 2013 Wykład 1 Wprowadzenie dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz
Warunki zaliczenia Wykład/Egzamin Test pisemny Laboratorium – na podstawie rozwiązań ćwiczeń
Zakres materiału Filozofia programowania komponentowego jako odmiany programowania obiektowego • Przykłady technologii komponentowych: • Java – Spring i EJB (to będzie na przedmiocie Java 2) • Platforma .NET • Poznanie języków programowania • C++/CLI • C# • Poznanie środowisk i bibliotek programowania • Microsoft Visual Studio 2010 • Windows Forms
Paradygmat programowania Proceduralne Strukturalne Liniowe Programowanie Obiektowe Komponentowe Zorientowaneobiektowo Zdarzeniowe Aspektowe
Programowanie proceduralne Uporządkowanie czynności Metoda programowania polegająca na dzieleniu kodu na procedury, czyli fragmenty wykonujące ściśle określone operacje. Procedury nie powinny korzystać ze zmiennych globalnych (w miarę możliwości), lecz pobierać i przekazywać wszystkie dane (czy też wskaźniki do nich) jako parametry wywołania. Instrukcje goto mogą być wprawdzie używane w procedurach, ale w żadnym wypadku celem wskoczenia w środek innej procedury.
Programowanie strukturalne Uporządkowanie danych Programowanie strukturalne to metoda programowania zalecająca hierarchiczne dzielenie kodu na moduły, które komunikują się jedynie poprzez dobrze określone interfejsy. Jest to rozszerzenie koncepcji programowania proceduralnego. Programowanie obiektowe Uporządkowanie danych + skojarzenie czynności ze strukturami danych Programowanie obiektowe to sposób tworzenia programów komputerowych, w którym definiujemy programy za pomocą "obiektów" - elementów łączących stan (czyli dane) i zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań. Podejście to różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane. Programowanie obiektowe ma ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów.
Programowanie zorientowane obiektowo (OOP) Abstrakcja Każdy obiekt w systemie służy jako model abstrakcyjnego "wykonawcy", który może wykonywać pracę, opisywać i zmieniać swój stan, oraz komunikować się z innymi obiektami w systemie, bez ujawniania, w jaki sposób zaimplementowano dane cechy. Enkapsulacja ukrywanie implementacji, hermetyzacja. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój "interfejs", który określa dopuszczalne metody współpracy.
Programowanie zorientowane obiektowo (OOP) Ponowne wykorzystanie klas Dziedziczenie umożliwienia definiowanie i tworzenia specjalizowanych obiektów na podstawie bardziej ogólnych. Dla obiektów specjalizowanych nie trzeba ponownie określać wszystkich jego elementów, lecz tylko te, których nie ma obiekt ogólniejszy. Kompozycja Polega na budowaniu nowych obiektów z obiektów już istniejących wykorzystując je jako „cegiełki”. Taki obiekt posiada wszystkie elementy obiektów składowych. Polimorfizm (wielopostaciowość) Zachowanie się obiektu zależy od kontekstu w jakim jest on użyty. Obiekt może ujawniać wszystkie swoje cechy lub cechy swoich przodków.
Programowanie aspektowe Programowanie aspektowe (aspect-orientedprogramming, AOP) to paradygmat tworzenia programów komputerowych wspomagający separację zagadnień i rozdzielenie programu na części w jak największym stopniu niezwiązane funkcjonalnie. Chodzi o podzielenie programu na elementy realizujące poszczególne funkcjonalności, np. związane z wyświetlaniem napisu, obsługą pliku lub bazy danych. Takie zagadnienia nazywa się problemami przekrojowymi. Dana funkcjonalność może pojawiać się w różnych częściach kodu, czyli przekraczać granice projektowe: - metody tej samej klasy - metody różnych klas (w pakiecie) - metody klas w różnych pakietach Aspekt jest dodatkową konstrukcją języka grupującą funkcjonalności. Podlega zasadom dziedziczenia i polimorfizmu. AspectJ – rozszerzenie języka Java AJDT - AspectJ Development Tools – rozszerzenie środowiska Eclipse
Programowanie zdarzeniowe Ideą programowania zdarzeniowego jest to, że zaimplementowane przez nas funkcje nie są wywoływane jawnie w kodzie programu, lecz przez system operacyjny lub wydzielony moduł programu. Komunikaty: Funkcje obsługujące tzw. kolejkę komunikatów pochodzących od systemu lub: • mysz; • klawiatura; • zmiana w interfejsie graficznym programu; • zegar; • operacje plikowe lub sieciowe. Wyjątki: Funkcje obsługujące błędy czasu wykonywania mogące wystąpić w programie: • operacje arytmetyczne (np. dzielenie przez zero); • operacje wejścia / wyjścia (brak pliku, brak połączenia sieciowego); • błędy adresowania pamięci (przekroczenie zakresu tablicy, nieistniejący obiekt).
Zdarzeniowy model aplikacji System Windows bazuję na komunikatach, które zarządzają stanem aplikacji. Komunikaty informują aplikacje o tym co się dzieje w systemie. • - komunikaty poleceń (ang. commandmessages) - wysyłane w celu wykonania jakiejś czynności • komunikaty powiadomień (ang. notificationmessages) - dla powiadomienia aplikacji lub systemu o wystąpieniu zdarzenia. • Komunikaty przetwarzane są w kolejce 1. wystąpienie zdarzenia - system umieszcza je w kolejce komunikatów, 2. proces pobiera komunikat z kolejki 3. komunikat jest wysyłany pod adresem okna docelowego, 4. jeżeli w procedurze okna, uwzględniono jego obsługę, jest ona wywoływana, w przeciwnym wypadku obsługa w sposób domyślny
Delegacyjny model obsługi zdarzeń Programowanie GUI jest programowaniem zdarzeniowym, opartym na koncepcji tzw. funkcji callback. Funkcja typu callback zawarta w naszym programie jest wywoływana nie przez program, ale przez sam system np. w reakcji na zdarzenia, takie jak naciśnięcie klawisza czy kliknięcie myszą. W Javie i .NET wprowadzono tu koncepcję "oddelegowania" obsługi: metoda, która obsługuje zdarzenie jest metodą innej klasy niż obiekt, któremu zdarzenie się przytrafiło. Słuchacz (ang. Listener) to obiekt, który może obsługiwać zdarzenia. Aby móc generować obiekty-Słuchacze, klasa musi implementować interfejs nasłuchu. Interfejs nasłuchu zawiera abstrakcyjne metody do obsługi zdarzeń. Jego implementacja oznacza, iż metody te zyskują konkretne definicje. Java i .NET dostarczająwielestandardowychinterfejsównasłuchu, przygotowanych do odbiorukonkretnychrodzajówzdarzeń. Klasy-słuchaczemogąimplementowaćjedenlubkilka z tychinterfejsów, zyskując w ten sposóbzdolność do obsługiwybranychzestawówrodzajówzdarzeń.
Programowanie komponentowe Definicja (Clemens Szyperski) komponent jest podstawowym elementem, z którego budowane jest oprogramowanie, posiada opisane deklaratywnie interfejsy, a wszystkie wymagane przez niego zależności są podane wprost. Dzięki temu możliwe jest przekazanie go do wdrożenia osobie, która nie jest jego twórcą. Komponent (w implementacji) jest rozszerzeniem obiektu. Komponent jest zbudowany z jednej lub kilku klas. Komponent posiada deklaracje oferowanych interfejsów Komponent posiada deklaracje żądanych zależności. Komponent to obiekt, który oferuje usługi i żąda ich od zewnętrznych komponentów, jednocześnie ukrywając swoją strukturę wewnętrzną
Obiekty a komponenty Programowanie obiektowe Programowanie komponentowe częściowa hermetyzacja wymuszona hermetyzacja – komunikacja poprzez interfejsy Dobrowolne definiowanie interfejsów Wymuszone definiowanie abstrakcyjnych interfejsów, które określają sposób komunikacji Powszechne stosowanie dziedziczenia klas Dziedziczenie rzadziej stosowane, głównie do interfejsów Powtórne użycie kodu poprzez polimorfizm i późne wiązanie wywołań powtórne użycie kodu na poziomie binariów
7 kryteriów istnienia komponentu Może być użyty przez inne elementy programu Wg Bertranda Meyera (2001) Jego użycie nie wymaga interwencji programisty Posiada pełną specyfikację zależności Specyfikuje oferowaną przez siebie funkcjonalność Może być użyty wyłącznie na podstawie tej specyfikacji Można go złożyć z innymi komponentami Integruje się z systemem w sposób szybki i bezproblemowy (wyłącznie poprzez konfigurację)
Właściwości komponentów W odróżnieniu od obiektów, nie są jednostkami aktywnymi, nie tworzą i nie usuwają samodzielnie swoich instancji. Zarządzaniem komponentami zajmuje się kontener steruje procesem tworzenia instancji komponentów (i ich odzyskiwania) rozwiązuje zależności pomiędzy komponentami zarządza cyklem życia komponentów Zajmuje się „techniczną” stroną działania: zarządza zasobami, zarządza transakcjami, równoważy obciążenie żądań nadchodzących od klientów
Podstawy języka C# C# Cookbook, 2nd Edition 350 Solutions for C# Programmers By Jay Hilyard, Stephen Teilhet Marcin Lis C#. Ćwiczenia. Wydanie III Helion Krzysztof Rychlicki-Kicior Tablice informatyczne. C#
Informacje podstawowe C# to obiektowy język programowania zaprojektowany przez A. Hejlsberga dla firmy Microsoft w 2001 roku CSharp ma wiele cech wspólnych z językami C++, Java, a także Pascal i Delphi. Program napisany w C# jest kompilowany do języka CIL (CommonIntermediateLanguage), specjalnego kodu pośredniego wykonywanego w środowisku uruchomieniowym takim jak .NET, Mono, DotGNU. Kod programu jest zbiorem klas. C# zawiera mechanizmy odzyskiwania pamięci i obsługę wyjątków (try – catch). Programy tworzone w środowisku .NET, niezależnie od używanego języka, wymagają specjalnego środowiska uruchomieniowego CLR (CommonLanguageRuntime).
Środowiska programistyczne C# Microsoft Visual Studio (wersje od 2003 do 2012) Borland Turbo C# Explorer http://www.turboexplorer.com/csharp http://www.icsharpcode.net/opensource/sd/
Budowa programu konsolowego using System; usingSystem.Collections.Generic; usingSystem.Text; Użycie przestrzeni nazw dla klas (jak w CPP lub jak import w Javie) namespace ConsoleApplication1 { class Program { staticvoidMain(string[ ] args) { Console.WriteLine(”Witaj w środowisku Microsoft Visual C#.”); } } } Przestrzeń nazw – zbiory zdefiniowanych klas Klasa – podstawowy element programowania obiektowego Główna funkcja programu
Konwersja łańcuch - liczba string base2 = "11"; string base8 = "17"; string base10 = "110"; string base16 = "11FF"; Console.WriteLine("Convert.ToInt32(base2, 2) = " + Convert.ToInt32(base2, 2)); Console.WriteLine("Convert.ToInt32(base8, 8) = " + Convert.ToInt32(base8, 8)); Console.WriteLine("Convert.ToInt32(base10, 10) = " + Convert.ToInt32(base10, 10)); Console.WriteLine("Convert.ToInt32(base16, 16) = " + Convert.ToInt32(base16, 16)); Convert.ToInt32(base2, 2) = 3 Convert.ToInt32(base8, 8) = 15 Convert.ToInt32(base10, 10) = 110 Convert.ToInt32(base16, 16) = 4607
Nazwy zmiennych w C# W języku C# ważna jest wielkość liter.
Instrukcja wejścia bez parametru Console.ReadLine(); int zmienna = Convert.ToInt16(Console.ReadLine()); string tekst = Console.ReadLine(); Console.WriteLine("Program oblicza sumę dwóch liczb."); Console.Write("Podaj a="); double a = Convert.ToDouble(Console.ReadLine()); Console.Write("Podaj b="); double b = Convert.ToDouble(Console.ReadLine()); double Suma = a+b; Console.WriteLine("Suma={0}", Suma); Console.ReadLine();
Proste operacje arytmetyczne • using System; • namespace ConsoleApplication1 • { • class Program • { • staticvoidMain(string[] args) • { • int a, b, c; • a = 5; • b = 20; • c = b - a; • Console.WriteLine("a = " + a); • Console.WriteLine("b = " + b); • Console.WriteLine("b - a = " + c); • } • } • }
Matematyczne funkcje wbudowane • class Trygonometria • { • staticvoidMain() • { • int kat; • double y; • Console.WriteLine("Obliczanie wartości funkcji cosinus!"); • Console.Write("Podaj wielkość kąta:"); • kat=Convert.ToInt16(Console.ReadLine()); • y=Math.Cos(Math.PI/180*kat); • Console.WriteLine("Cos("+kat+")="+y); • Console.ReadLine(); • } • }