Podstawy programowania. Programowanie obiektowe

Podobne dokumenty
Materiały do zajęć VII

.NET Klasy, obiekty. ciąg dalszy

Wykład 8: klasy cz. 4

Kurs WWW. Paweł Rajba.

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

TEMAT : KLASY DZIEDZICZENIE

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie obiektowe

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Dokumentacja do API Javy.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wykład 5 Okna MDI i SDI, dziedziczenie

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie obiektowe

Enkapsulacja, dziedziczenie, polimorfizm

Wykład 4: Klasy i Metody

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Programowanie 2. Język C++. Wykład 3.

Programowanie obiektowe - 1.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Technologie i usługi internetowe cz. 2

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

JAVA W SUPER EXPRESOWEJ PIGUŁCE

PHP 5 język obiektowy

Zaawansowane programowanie w języku C++ Klasy w C++

Zaawansowane programowanie w C++ (PCP)

Klasy cd. Struktury Interfejsy Wyjątki

Wykład 5: Klasy cz. 3

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Definiowanie własnych klas

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Klasy i obiekty cz II

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe

Język C++ Programowanie obiektowe

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Definicje klas i obiektów. Tomasz Borzyszkowski

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Dziedziczenie. Tomasz Borzyszkowski

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Wprowadzenie do programowanie obiektowego w języku C++

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Programowanie obiektowe w języku

Java Język programowania

Wykład 9: Polimorfizm i klasy wirtualne

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe i zdarzeniowe

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

Szablony funkcji i szablony klas

Podstawy Programowania Obiektowego

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Programowanie obiektowe W1 Wprowadzenie. Dr hab. inż. Lucyna Leniowska, prof. UR Zakład Mechatroniki, Automatyki i Optoelektroniki

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Metodyka programowania. Podstawy C#

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Multimedia JAVA. Historia

Wstęp do programowania obiektowego. Wykład 2

Klasy abstrakcyjne, interfejsy i polimorfizm

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Wykład 3 Składnia języka C# (cz. 2)

Aplikacje w środowisku Java

Podstawy programowania. Wprowadzenie

Laboratorium 1 - Programowanie proceduralne i obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Dziedziczenie jednobazowe, poliformizm

Platformy Programistyczne Podstawy języka Java

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Polimorfizm. dr Jarosław Skaruz

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Projektowanie obiektowe. Roman Simiński Polimorfizm

Język programowania. Andrzej Bobyk

Programowanie, część I

Rozdział 4 KLASY, OBIEKTY, METODY

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Programowanie obiektowe

Programowanie Komputerów

Transkrypt:

Podstawy programowania Programowanie obiektowe

Metodyki programowania Istnieją trzy główne metodyki programowania: Programowanie strukturalne Programowanie proceduralne Programowanie obiektowe Zastosowanie "wyższych" metodyk programowania wiąże się zawsze z dodatkowym nakładem pracy, jednak przynosi znaczne korzyści przy bardziej złożonych programach ten nakład pracy bardzo szybko się zwraca

Metodyki programowania Stosowanie wyższych metodyk jest koniecznością wraz ze wzrostem komplikacji problemu złożoność kodu oczywiście rośnie we wszystkich metodykach, jednak w różnym tempie. Wybór między programowaniem strukturalnym a obiektowym to jak wybór między algorytmami o złożoności O(n 2 ) i O(nlogn) programowanie strukturalne programowanie proceduralne Nakład pracy, czas pracy, złożoność kodu programowanie obiektowe Złożoność problemu

DRY DRY (ang. don't repeat yourself) Dodatkowa korzyść z programowania proceduralnego oraz obiektowego to możliwość wielokrotnego użycia kodu. Postulat DRY (A. Hunt, D. Thomas) zaleca unikanie powtórzeń kodu (np. przez Ctrl-C, Ctrl-V), do czego właśnie służą wyższe metodyki: fragment kodu można "zamknąć" w postaci oddzielnej funkcji lub klasy i odwołać się do niego, zamiast go kopiować. Co ważne, DRY zmniejsza też liczbę błędów (zatem redukuje czas potrzebny na ich poprawianie) jeżeli funkcja zawiera błędy, to trzeba je poprawić tylko w jednym miejscu, zaś raz opracowana i pozbawiona błędów funkcja już zawsze będzie działać poprawnie DRY ułatwia również utrzymanie kodu jeżeli jakiś aspekt programu trzeba ulepszyć (np. zastosować szybszy algorytm), to wystarczy to zrobić w jednym miejscu

DRY DRY (ang. don't repeat yourself) Skrajne podejście DRY widać np. w języku Java, gdzie zaleca się stosowanie zasady jeden plik = jedna klasa (publiczna) w ten sposób każda klasa może łatwo być użyta wielokrotnie Postulat DRY dotyczy też innych aspektów programowania, np. użycia narzędzi programistycznych, kompilacji warunkowej, szablonów klas, a nawet definiowania stałych (1. W ilu miejscach trzeba zmienić kod, jeżeli węzłów będzie 5 zamiast 4; 2. Które "4" w kodzie oznacza liczbę węzłów, a które coś zupełnie innego) const Int32 NumberNodes = 4; Node[] Nodes = new Node[NumberofNodes]; for (Int32 n = 0; n < NumberOfNodes; n++) Nodes[n].Open();

Geneza Geneza i historia programowania obiektowego Simula, 1967 r., Ole-Johan Dahl i Kristen Nygaard rozwinięcie języka ALGOL, klasy i obiekty (jako instancje klas) Dahl i Nygaard pracowali nad komputerowymi modelami statków duża liczba typów statków i ich parametrów (różnych dla różnych typów) oraz relacji pomiędzy nimi była przyczyną problemów; Wpadli na pomysł, aby dane statków każdego typu zgrupować w jeden programowy byt obiekt Smalltalk, 1971 r., Xerox wiele nowatorskich rozwiązań, m.in. dziedziczenie, maszyna wirtualna, programy GUI (okienkowe), mysz C++, 1979 r., Bjarne Stroustrup obiektowe rozwinięcie C (1973 r., Bell Labs), wspiera paradygmaty proceduralny i obiektowy, umożliwia też wklejanie kodu języka Asembler ceniony za wydajność Java, 1991, Sun Microsystems koncepcja Smalltalk, składnia C++ oraz kilka innowacji np. interfejsy; C#, 1998 r., Microsoft nazwa sugeruje związek z C++, koncepcja bardziej zbliżona do Java (maszyna wirtualna, język pośredni IL, zarządzanie pamięcią GC), wiele cennych rozszerzeń, np. delegacje

Pojęcie klasy Jeżeli przyjąć, że program komputerowy służy do rozwiązania jakiegoś problemu, to klasa jest modelem elementu jego dziedziny. obejmuje stan obiektu (wartości jego pól) oraz zachowanie (działanie), przez definicje metod i właściwości Klasa jest typem dla obiektu, a obiekt danej klasy to jej instancja

: [ <[> Atrybuty<]> ] [ <Modyfikatory> ] class <Nazwa> [ : <Klasa-bazowa> ] // elementy składowe klasy Atrybuty, np. [Serializable] metadane, dołączane przez kompilator do kodu klasy; wg MS stanowią odpowiednik słów kluczowych (jak np. modyfikatory dostępu private/public), ale dowolnie definiowanych; Mogą być wykorzystane na różne sposoby np. mogą stanowić wytyczne dla kompilatora JIT, mogą dodawać pewne funkcjonalności Modyfikatory dostępu (np. private/public), związane z dziedziczeniem (abstract, sealed) oraz modyfikator static Klasa bazowa klasa, po której aktualnie definiowana klasa dziedziczy wszystkie elementy składowe; Domyślnie klasa object (System.Object)

Przykład: [Serializable] public class FirstClass private Double value; public FirstClass(Double value) this.value = value; public Double Value get; set;

Modyfikatory dostępu internal (domyślnie!) klasa jest dostępna tylko w obrębie tego samego pakietu (assembly = plik.dll lub.exe) public klasa jest dostępna z dowolnego zestawu.net protected tylko klasy zagnieżdżone wewnątrz innej klasy klasa jest dostępna tylko dla klasy zawierającej i jej klas potomnych private tylko klasy zagnieżdżone wewnątrz innej klasy klasa jest dostępna tylko dla klasy zawierającej Pozostałe modyfikatory static klasa zawiera wyłącznie metody statyczne, nie można utworzyć obiektu takiej klasy abstract klasa zawierająca metody abstrakcyjne; nie można utworzyć obiektu takiej klasy, ale można zdefiniować jej klasy potomne sealed nie może być przedmiotem dziedziczenia

Nazwa - zasady nieformalne: Klasy, pola, metody, stałe konwencja Pacal, nazwy klas i pól rzeczowniki, metod czasowniki: DaneWykresu (klasa należy unikać nazw na "I") KolorLinii (pole) ZapiszDane (metoda) Interfejsy Pascal poprzedzone literą "I" ISortable Nazwy powinny być znaczące: p, k, polekoła, kolorlinii Kod powinien być czytelny, kiedy do niego zajrzeć po kilku miesiącach albo dla innego programisty (tzw. samodokumentujący się)

Klasa bazowa klasa, po których definiowana klasa dziedziczy elementy składowe, i/lub interfejsy, które implementuje Klasa, która dziedziczy po innej klasie to klasa potomna, natomiast klasa, po której dziedziczy klasa potomna to klasa bazowa Klasa może dziedziczyć po jednej klasie bazowej oraz implementować dowolnie wiele interfejsów (klasa bazowa, o ile występuje, musi być wymieniona przez interfejsami) Domyślnie klasa dziedziczy po klasie System.Object Dziedziczenie klas i interfejsów ma inny sens: w przypadku klas jest to dosłowne dziedziczenie, klasa potomna otrzymuje wszystkie elementy kładowe klasy bazowej można z nich korzystać tak samo, jakby były umieszczone w klasie potomnej - w przypadku interfejsów dziedziczenie oznacza raczej zobowiązanie do zaimplementowania wszystkich metod interfejsu

CTS Wspólny system typów CTS (Common Type System) Obiekt Klasa Typy proste Interfejs Typy wyliczeniowe Tablica Struktury Typy referencyjne Typy wartościowe

Elementy składowe klasy Stała niezmienna wartość (niemodyfikowalna zmienna); Należy do klasy, nie do obiektów, podobnie jak metody statyczne Pole zmienna należąca do obiektu, część stanu obiektu; Zwykle pola są prywatne (dostępne wyłącznie dla metod obiektu) Właściwość sposób udostępnienia stanu obiektu (prywatnego pola) w kontrolowany sposób Metoda funkcja związana z klasą, określająca działania, jakie może wykonać obiekt klasy (nie dotyczy metod statycznych) Konstruktor metoda wykonywana w trakcie tworzenia obiektu Destruktor metoda wykonywana w trakcie "niszczenia" obiektu Operator definicja działania operatora (np. +, *, &&, ) Zdarzenie mechanizm informowania innych obiektów np. o zmianie stanu; w praktyce zmienna typu delegacji Typ zagnieżdżona definicja typu klasy, interfejsu, delegacji,

Elementy składowe klasy - modyfikatory dostępu internal element jest dostępny tylko w obrębie tego samego pakietu (assembly = plik.dll lub.exe) public element jest dostępny z dowolnego zestawu.net protected element jest dostępny tylko dla klasy zawierającej i jej klas potomnych private (domyślnie) element jest dostępny tylko dla klasy zawierającej

Pola Pola są zmiennymi należącym do obiektów lub klasy i reprezentują ich wewnętrzny stan; Z zasady powinny być prywatne, natomiast do udostępniania stanu obiektu powinny służyć właściwości Modyfikatory static pole statyczne, należy do klasy a nie obiektu readonly pole tylko do odczytu (wartość możne nadać konstruktor) const stała wartość typu prostego, nadawana w czasie kompilacji i później nie może być zmieniona; należy do klasy ( static readonly) class Sample public const Double PI = 3.1415; public static readonly DateTime Start = DateTime.Now; private Int32 length;

Właściwości Właściwości służą do kontrolowanego dostępu do stanu obiektu umożliwiają odczyt i zmianę stanu (tj. wartości prywatnych pól) Właściwość składa się z dwóch metod: accesor (odczyt pola) oraz mutator (zmiana wartości pola); w językach C++/Java służą do tego oddzielne metody (w slangu Java nazywane getter i setter), natomiast w C# połączone w jedną konstrukcję składniową Właściwość składa się z sekcji get i/lub set; Obie sekcje są w pewnym sensie metodami można dla nich używać modyfikatorów takich jak dla metod (np. virtual, override) Używanie właściwości nie oznacza spowolnienia programu kompilator JIT może zastępować wywołania prostych (niewirtualnych) właściwości kodem sekcji get lub set

Właściwości Definicja właściwości: <modyfikator> <typ> Nazwa [ <modyfikator> ] get // dowolny kod return <wartość-właściwości> [ <modyfikator> ] set // dowolny kod // wartość przypisywana właściwości // jest dostępna jako value

Właściwości Definicja właściwości, przykład private Double promień; public Double Promień get return promień; set if (value value<0) throw new ArgumentException(); promień = value; public Double Powierzchnia get return Math.PI * promień * promień;

Metody Odpowiadają za wykonywanie działań, które definiują zachowanie się obiektów (można powiedzieć że definiują polecenia, które można wydawać obiektom) Mogą być przeciążone Przeciążenie metody to definiowanie wielu metod o tej samej nazwie, ale różniących się liczbą i/lub typami argumentów (do przeciążenia nie wystarczy inna nazwa argumentu lub inny typ rezultatu) Odpowiadają za polimorfizm (modyfikatory virtual i override)

Metody - modyfikatory static metody statyczne są częścią klasy, nie obiektu abstract metoda abstrakcyjna może pojawić się tylko w klasie abstrakcyjnej; zawiera samą metryczkę (bez ciała metody) virtual metoda może być nadpisana w klasie potomnej override metoda klasy potomnej, nadpisująca metodę odziedziczoną new metoda zastępująca metodę nie-wirtualną w klasie potomnej sealed metoda finalna, nie może być nadpisana extern metoda implementowana zewnętrznie ("pobierana" z DLL dyrektywą DLLImport)

Metody Definicja metody: <modyfikator> <typ-reultatu> Nazwa (<lista-parametrów>) // ciało metody dowolny kod; // jeżeli typ rezultatu jest inny, niż void, // to powinien zawierać instrukcję zwracania // rezultatu: return <wyrażenie>;

Metody Definicja metody, przykład private Double radius; public void SetRadius (Double radius) this.radius = radius; public Double GetArea () return Math.Pi * radius * radius; Metody maja nieograniczony dostęp do wszystkich pól, właściwości i metod klasy oraz jej klas bazowych (oprócz private klasy bazowej); Dostęp do własnych elementów jest BEZ operatora dostępu ".", ale można go użyć ze słowem kluczowym this (= bieżący obiekt), np. kiedy występuje konflikt nazw pomiędzy polem a argumentem

Polimorfizm Obiekt klasy potomnej można zawsze przypisać do zmiennej typu klasy bazowej np. w C# wszystkie klasy dziedziczą po klasie obiect: StreamWriter sw = new StreamWriter(path); Object o = sw; Zmienna klasy bazowej udostępnia tylko te elementy obiektu, które zostały zdefiniowane w klasie bazowej Polimorfizm jest implementowany przez metody wirtualne modyfikator virtual w klasie bazowej i override w klasach potomnych W sytuacji jak wyżej, wywołanie metody polimorficznej spowoduje wykonanie metody zdefiniowanej w klasie potomnej, a nie bazowej;

Polimorfizm W C# wszystkie klasy mają metodę ToString() wirtualną, zdefiniowaną w klasie System.Obiect; Jeżeli ta metoda zostanie nadpisana w klasie potomnej, to nawet po przypisaniu obiektu do zmiennej typu obiect, zostanie wykonana metoda ToString klasy potomnej DateTime dt = DateTime.Now; obiect o = dt; String s = o.tosring(); // = DateTime.ToString Warto zauważyć, że np. dzięki temu Console.WriteLine akceptuje jako argumenty obiekty dowolnej klasy, również nieznanej w momencie tworzenia.net używa ich metody ToString, a dzięki polimorfizmowi wykonywana jest metoda ToString klas potomnych, a dzięki polimorfizmowi wykonywana jest metoda ToString klas potomnych

Inicjacja obiektów i konstruktory Pola niezainicjowane otrzymują wartość domyślną zależnie od typu jest to 0, 0.0, false lub wskazanie puste (null) Pola można inicjować razem z ich deklaracją (dla stałych jest to obowiązkowe) albo w konstruktorach Konstruktor jest specjalną metodą, używaną wyłącznie do tworzenia obiektów nie można go wywołać jawnie, natomiast jest wykowywany zawsze podczas tworzenia obiektu operatorem new Kompilator C# wyposaża klasę w domyślny konstruktor bezargumentowy, ale tylko kiedy klasa nie ma innych konstruktorów Konstruktor może być przeciążony Konstruktory nie są dziedziczone; konstruktor klasy potomnej może "wywołać" konstruktor klasy bazowej

Inicjacja obiektów i konstruktory przykład class Sample private Int32 n1 = 13; private Int32 n2; // tj. n2 = 0 public Sample (Int32 n2) this.n2 = n2; Sample s1 = new Sample (13); // s1.n2 = 13 Sample s2 = new Sample(); // błąd! Sample s3 = new Sample(7, 77); // błąd!

Destruktory Destruktor jest specjalną metodą, wywoływaną niejawnie przez GC w momencie "niszczenia" obiektu Klasy korzystające wyłącznie z zasobów.net (zarządzanych) nie wymagają destruktora GC wykonuje zwalnia zasoby wykorzystywane przez obiekt, zwłaszcza pamięć Klasy korzystające z zasobów spoza.net (niezarządzanych), powinny mieć destruktor, którego zadaniem jest zwolnienie zasobów Destruktor musi być bezargumentowy i nie może być przeciążony class Sample // public ~Sample() // zwolnienie zasobów niezarządzanych

Struktury Struktury (struct) Służą do definiowania typów wartościowych (klasy typy referencyjne) Mają składnie podobną do klas, z kilkoma różnicami: Domyślny modyfikator elementów: public Nie można jawnie definiować konstruktora bezargumentowego, konstruktor taki jest zawsze dostępny Nie może być dziedziczona, ale może implementować interfejs Struktury należy stosować zamiast klas, kiedy w sposób naturalny reprezentują pojedynczą wartość np. data/czas, temperatura itp. Struktury ze względu na wydajność powinny zajmować niewiele pamięci (MS: do 16 bajtów), ponieważ są tworzone na stosie, a nie na stercie jak klasy