Programowanie obiektowe

Transkrypt

Programowanie obiektowe
Programowanie obiektowe
Wykład 1
Dariusz Wardowski
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
1/20
Programowanie obiektowe
Wykład 1
O mnie
• prowadzący wykład: Dariusz Wardowski
• pokój: A334
• dyżur: środa, godz. 10.00 – 12.00
• e-mail: [email protected]
• www: www.math.uni.lodz.pl/˜wardd
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
2/20
Programowanie obiektowe
Wykład 1
Zasady zaliczenia
Laboratorium
1. kolokwium (programowanie obiektowe w C++) sprawdzające efekty E2E5. Termin: ostatnie zajęcia, termin I poprawy: sesja, termin II poprawy:
sesja poprawkowa.
2. test sprawdzający efekt E1 (teoria z wykładu). Termin: j.w.
3. Aktywność studentów mile widziana i nagradzana (projekty dla
chętnych).
Wykład
Brak egzaminu.
Pamiętaj: Materiał omawiany na wykładzie jest podstawą do zaliczenia
ćwiczeń. Patrz punkt nr 2.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
3/20
Programowanie obiektowe
Wykład 1
Literatura
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
C. S. Horstman, G. Cornell, Core Java 2 Podstawy, Helion 2003
C. S. Horstman, G. Cornell, Core Java 2 Techniki Zaawansowane, Helion 2003
B. Stroustrup, Język C++, WNT 2002
S. Prata, Szkoła Programowania Język C++, Robomatic 2002
B. S. Lippman, J. Lajoie, Podstawy języka C++, WNT 2003
B. Eckel, Thinking in Java, Helion 2003
http://wazniak.mimuw.edu.pl
J. Grębosz, Symfonia C++ Tom I, II, III, Oficyna Kallimach 1999
www.programowanieobiektowe.pl
M. Ben-Ari, Understanding programming languages, John Wiley & Sons 1996
B. Meyer, Programowanie zorientowane obiektowo, Helion 2005
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
4/20
Programowanie obiektowe
Wykład 1
Programowanie obiektowe jako jeden ze sposobów
programowania
Paradygmaty programowania
• Programowanie proceduralne
• Programowanie strukturalne
• Programowanie imperatywne
• Programowanie obiektowe
• Programowanie funkcyjne
• Programowanie uogólnione
• Programowanie zdarzeniowe
• Programowanie logiczne
• Programowanie aspektowe
• Programowanie deklaratywne
• Programowanie agentowe
• Programowanie modularne
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
5/20
Programowanie obiektowe
Wykład 1
Historia programowania obiektowego
Za pierwszy prawdziwie obiektowy język programowania uważany jest Simula 67, który
powstał w latach 60-tych ubiegłego stulecia. Język ten powstał podczas pracy nad symulacją
statków. To w tym języku po raz pierwszy wprowadzono pojęcie klasy i egzemplarza danej
klasy. Dzięki temu językowi możliwa była tzw. symulacja, czyli odwzorowanie obiektów
świata rzeczywistego na obiekty używane w programie.
Idea programowania obiektowego została następnie dopracowana w języku Smalltalk
(1971), w którym obiekty mogą być tworzone i modyfikowane dynamicznie, tzn. w trakcie
działania programu (w przeciwieństwie do statycznych programów).
Powstanie języka C++ (1983) przyczyniło się w sposób szczególny do rozpowszechnienia idei
programowania obiektowego. Cechy obiektowości pojawiły się również w wielu innych
językach programowania takich jak np. Ada, Eiffel, Basic, Pascal, Lisp.
Dzisiaj jednym z najpopularniejszych obiektowych języków programowania jest Java (1991).
Przykłady innych obiektowych języków programowania: Python, Perl, C#, Ruby, Ocaml,
PHP5.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
6/20
Programowanie obiektowe
Wykład 1
Dlaczego programowanie obiektowe?
Programy komputerowe zbliżone są do ludzkiego sposobu postrzegania rzeczywistości.
„Łatwiej” jest zrozumieć kod i pomysły innych programistów i tym samym współpracować w
zespole oraz ponownie wykorzystywać istniejące rozwiązania.
Ten sam, naturalny dla ludzi sposób myślenia i te same pojęcia można użyć przy analizie
problemu, który ma być rozwiązany i przy projektowaniu jego programowego rozwiązania.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
7/20
Programowanie obiektowe
Wykład 1
Założenia paradygmatu obiektowego
Abstrakcja Jest to ograniczenie cech obiektu ze świata rzeczywistego do cech istotnych,
kluczowych z punktu widzenia programisty. Abstrakcja ma za zadanie uprościć rozwiązanie
problemu i zwiększyć jego ogólność.
Hermetyzacja, zwana inaczej enkapsulacją, jest kluczowym zagadnieniem programowania
zorientowanego obiektowo. Polega ona na ukrywaniu implementacji przed użytkownikiem
obiektu. Hermetyzacja zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych
obiektów w nieoczekiwany sposób.
Dziedziczenie umożliwia definicję i tworzenie obiektów na podstawie obiektów bardziej
ogólnych.
Polimorfizm umożliwia dostosowanie działania obiektów do własnych oczekiwań poprzez
łączenie funkcjonalności zarówno dziedziczonej, jak i implementowanej samodzielnie. Idea
polimorfizmu bazuje na tym, że użytkownik obiektu nie wie i nie musi wiedzieć, czy
konkretne zachowanie wykorzystywanego obiektu zostało zrealizowane bezpośrednio w tym
obiekcie czy też w tym, po którym dziedziczy on swoje właściwości.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
8/20
Programowanie obiektowe
Wykład 1
Klasa i obiekt
Klasa jest najważniejszym z pojęć związanym z programowaniem zorientowanym
obiektowo. Klasa jest „szablonem”, czy też projektem na podstawie którego
tworzone są obiekty, które posiadają pewne cechy i funkcje. Zatem klasa jest
narzędziem, za pomocą którego tłumaczy się abstrakcję na typ użytkownika.
Zadaniem obiektów w programie jest reprezentowanie wybranych, istotnych cech i
funkcji rzeczywistego obiektu
Właściwości obiektów:
• Zachowanie obiektu – co można zrobić dzięki temu obiektowi i jakie metody (funkcje)
można dla niego wywoływać?
• Stan obiektu – jak obiekt reaguje na działanie tych metod?
• Tożsamość obiektu – w jaki sposób można odróżnić ten obiekt od innych, posiadając to
samo zachowanie i stan?
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
9/20
Programowanie obiektowe
Wykład 1
Programowanie obiektowe vs. programowanie proceduralne
Programowanie zorientowane obiektowo
Zidentyfikowanie zadania
Podzielenie każdego zadania na kilka mniejszych elementarnych
Implementacja zadań elementarnych
(tzw. podejście od ogółu do szczegółu)
Programowanie proceduralne
Tworzenie procedur wykonujących proste zadania
Łączenie prostych procedur w bardziej skomplikowane
Powstanie pożądanej aplikacji
(tzw. podejście od szczegółu do ogółu)
metoda
metoda
Obiekt
funkcja
funkcja
metoda
metoda
Obiekt
funkcja
funkcja
Dane
globalne
metoda
metoda
Obiekt
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
funkcja
10/20
Programowanie obiektowe
Wykład 1
Przykład klasy w języku C++
Deklaracja klasy
Implementacja funkcji składowych klasy
//plik pracownik.h
class Pracownik
{
private:
char imie[30];
char nazwisko[30];
char stanowisko[40];
double zasadnicza;
double premia;
double pensja;
void obliczPensje() {pensja = premia +
zasadnicza;}
//plik pracownik.cc
#include <iostream>
public:
void aktualizuj(double, double);
void pokaz();
};
using namespace std;
#include ”pracownik.h”
void Pracownik::aktualizuj(double zas, double pr)
{
zasadnicza = zas;
premia = pr;
obliczPensje();
}
void Pracownik::pokaz()
{
cout <<"Pracownik: "<< imie <<" "<<nazwisko<<'\n';
cout <<"Pensja: "<< pensja <<"\n";
}
aktualizuj
pokaz
Pracownik
imie
nazwisko
stanowisko
zasadnicza
premia
pensja
obliczPensje()
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
11/20
Programowanie obiektowe
Wykład 1
Przykład klasy w języku Java
//plik Pracownik.java
import java.util.*;
class Pracownik
{
private String imie;
private String nazwisko;
private String stanowisko;
private double zasadnicza;
private double premia;
private double pensja;
private void obliczPensje() {pensja = premia + zasadnicza;}
public void aktualizuj(double zas, double pr)
{
zasadnicza = zas;
premia = pr;
obliczPensje();
}
public void pokaz()
{
System.out.println(”Pracownik: ” + imie + ” ” + nazwisko);
System.out.println(”Pensja: ” + pensja);
}
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
12/20
Programowanie obiektowe
Wykład 1
Typy użytkownika, czyli zastosowanie klas
Poniższy program napisany w języku C++, używa
obiektów klasy Pracownik.
//plik testPracownik.cc
#include ”pracownik.h”
int main()
{
Pracownik janek;
Pracownik zenek;
janek.aktualizuj(1400,200);
zenek.aktualizuj(1560,100);
janek.pokaz();
zenek.pokaz();
return 0;
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
Użycie klasy Pracownik. Język Java.
//plik testPracownik.java
import java.util.*;
public class testPracownik.java
{
public static void main(String [] args)
{
Pracownik janek = new Pracownik();
Pracownik zenek = new Pracownik();
janek.aktualizuj(1400,200);
zenek.aktualizuj(1560,100);
janek.pokaz();
zenek.pokaz();
}
}
13/20
Programowanie obiektowe
Wykład 1
Ogólnie o klasach
//C++
class NazwaKlasy
{
private:
dane składowe klasy
public:
funkcje składowe (prototypy) klasy
};
Zawartość części publicznej to tzw. interfejs publiczny.
Zamknięcie danych składowych klasy w części prywatnej to enkapsulacja danych.
Funkcje składowe klasy nazywane są metodami.
Obiekty utworzone na podstawie danej klasy nazywane są instancjami tej klasy.
Przykłady definicji obiektów na przykładzie klasy Student.
Student s1;
Student* s2 = new Student;
Student tab1S[10];
Student* tab2S = new Student[10];
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
14/20
Programowanie obiektowe
Wykład 1
Konstruktory
Aby możliwe było inicjowanie pól składowych obiektu podczas jego tworzenia używa się specjalnych metod zwanych
konstruktorami. Metoda ta jest wywoływana automatycznie podczas tworzenia obiektu. Nazwa konstruktora jest taka
sama jak nazwa klasy. Jedna klasa może mieć wiele konstruktorów.
Poniżej przedstawiono prototypy konstruktorów klasy Pracownik (C++).
Pracownik(); //konstruktor domyślny
Pracownik(const char* i, const char* n, const char* s);
Pracownik(const char* i, const char* n, const char* s = „fizyczny”);
Poniżej przedstawiono definicje powyższych konstruktorów.
Pracownik::Pracownik()
{
strcpy(imie,”???”); strcpy(nazwisko,”???”); zasadnicza=0; pensja=0;
}
Pracownik::Pracownik(const char* i, const char* n, const char* s)
{
strcpy(imie,i); strcpy(nazwisko,n); strcpy(stanowisko,s); zasadnicza=0; pensja=0;
}
Pracownik::Pracownik(const char* i, const char* n, const char* s = ”fizyczny”);
{
strcpy(imie,i); strcpy(nazwisko,n); zasadnicza=1200; premia=140;
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
15/20
Programowanie obiektowe
Wykład 1
Konstruktory
Jawne użycie konstruktora:
Pracownik p1 = Pracownik(”Jan”, ”Kowalski”, ”brygadzista”);
Niejawne użycie konstruktora:
Pracownik p2(”Edward”, ”Dzik”);
Inne przykłady zastosowania konstruktorów:
Pracownik * p3 = new Pracownik; // niejawne wywołanie konstruktora domyślnego
Pracownik p4 = Pracownik(); // jawne wywołanie konstruktora domyślnego
Uwaga
Gdy nie dostarczymy klasie żadnych konstruktorów, wówczas kompilator utworzy konstruktor domyślny.
Jeżeli zdefiniujemy natomiast dowolny konstruktor klasy, wówczas konstruktor domyślny należy zdefiniować
samemu (o ile jest potrzebny).
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
16/20
Programowanie obiektowe
Wykład 1
Konstruktor domyślny
Konstruktor domyślny jest używany do utworzenia obiektu wtedy, gdy nie podamy wartości inicjujących. Konstruktor
taki nie posiada argumentów. W poniższej deklaracji użyty jest konstruktor domyślny.
Pracownik janek;
Uwaga
Gdy nie dostarczymy klasie żadnych konstruktorów, wówczas kompilator utworzy konstruktor domyślny.
Jeżeli zdefiniujemy natomiast dowolny konstruktor klasy, wówczas konstruktor domyślny należy zdefiniować
samemu (o ile jest potrzebny). Zobacz przykład poniżej.
class Para
{
private:
double x;
double y;
public:
Para(int _x, int _y)
{
x = _x;
y = _y;
}
};
int main()
{
Para z1(1,2); //poprawnie
Para z2; // źle
return 0;
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
17/20
Programowanie obiektowe
Wykład 1
Destruktory
(C++) Po utworzeniu danego obiektu program śledzi jego istnienie aż do momentu jego wygaśnięcia. Wywoływana jest
wówczas specjalna metoda klasy zwana destruktorem, której zadaniem jest „posprzątanie” po wygasłym obiekcie (np.
zwolnienie pamięci). Tak samo jak konstruktor destruktor nie posiada wartości zwracanej ani nie posiada żadnych
argumentów. Nazwa destruktora to nazwa klasy poprzedzona tyldą (~).
(Java) Brak destruktorów. „Odśmiecaniem” pamięci zajmuje się tzw. garbage collector.
Poniżej przedstawiono przykład klasy ze zdefiniowanym destruktorem:
class A
{
private:
int* a;
public:
A(int x)
{
a = new int(x);
}
~A()
{
delete a;
cout << „Destruktor obiektu” << *a << ‘\n’;
}
};
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
18/20
Programowanie obiektowe
Wykład 1
Kiedy wywoływany jest destruktor?
•Decyzję o wywołaniu destruktora podejmuje kompilator. Kod nie powinien jawnie wywoływać destruktora.
•Jeżeli obiekt tworzony jest w pamięci statycznej, wówczas jego destruktor wywoływany jest przed zakończeniem
programu.
•Jeżeli obiekt tworzony jest w sposób automatyczny wówczas destruktor jest wywoływany kiedy program opuszcza
blok kodu w którym został zdefiniowany ten obiekt.
•Jeżeli obiekt utworzono w sposób dynamiczny (tzn. za pomocą operatora new), wówczas destruktor tego obiektu jest
wywoływany automatycznie, gdy użyjemy delete do zwolnienia pamięci.
Zadanie W jakiej kolejności wywołane będą destruktory obiektów klasy A utworzonych następująco:
A p1(1);
int main()
{
A* p2 = new A(2);
{
A p3(3);
}
A p4(4);
A p5(5);
delete p2;
return 0;
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
19/20
Programowanie obiektowe
Wykład 1

Dziękuję za uwagę
dr Dariusz Wardowski, Katedra Analizy Nieliniowej
20/20