• Nie Znaleziono Wyników

Dariusz Wardowski

N/A
N/A
Protected

Academic year: 2021

Share "Dariusz Wardowski"

Copied!
18
0
0

Pełen tekst

(1)

Dariusz Wardowski

(2)

1. C. S. Horstman, G. Cornell, core Java 2 Podstawy, Helion 2003 2. B. Eckel, Thinking in Java, Helion 2003

3. http://wazniak.mimuw.edu.pl 4. http://pl.wikipedia.org

5. J. Grębosz, Symfonia C++ Tom I, II, III, Oficyna Kallimach 1999 6. S. Prata, Szkoła Programowania Język C++, Robomatic 2002 7. www.programowanieobiektowe.pl

Literatura

(3)

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

Programowanie obiektowe jako jeden ze sposobów

programowania

(4)

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.

Historia programowania obiektowego

Idea programowania obiektowego została następnie dopracowana w języku Smalltalk (1971), w którym obiekty mogą byd tworzone i modyfikowane dynamicznie, tzn. w trakcie działania programu (w przeciwieostwie 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.

(5)

Programy komputerowe zbliżone są do ludzkiego sposobu postrzegania rzeczywistości.

Dlaczego programowanie obiektowe?

„Łatwiej” jest zrozumied kod i pomysły innych programistów i tym samym współpracowad w zespole oraz ponownie wykorzystywad istniejące rozwiązania.

Ten sam, naturalny dla ludzi sposób myślenia i te same pojęcia można użyd przy analizie

problemu, który ma byd rozwiązany i przy projektowaniu jego programowego rozwiązania.

(6)

Abstrakcja Jest to ograniczenie cech obiektu ze świata rzeczywistego do cech istotnych, kluczowych z punktu widzenia programisty. Abstrakcja ma za zadanie uprościd rozwiązanie problemu i zwiększyd jego ogólnośd.

Założenia paradygmatu obiektowego

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 zmieniad 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 oczekiwao 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 wiedzied, 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.

(7)

Klasa jest najważniejszym z pojęd 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

Klasa i obiekt

Właściwości obiektów:

• Zachowanie obiektu – co można zrobid dzięki temu obiektowi i jakie metody (funkcje) można dla niego wywoływad?

• Stan obiektu – jak obiekt reaguje na działanie tych metod?

• Tożsamośd obiektu – w jaki sposób można odróżnid ten obiekt od innych, posiadając to

samo zachowanie i stan?

(8)

Programowanie zorientowane obiektowo Zidentyfikowanie zadania

Podzielenie każdego zadania na kilka mniejszych elementarnych Implementacja zadao elementarnych

(tzw. podejście od ogółu do szczegółu)

Programowanie obiektowe vs. programowanie proceduralne

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)

Obiekt Obiekt Obiekt

metoda metoda

metoda metoda

metoda metoda

Dane globalne

funkcja

funkcja

funkcja

funkcja

funkcja

(9)

Przykład klasy w języku C++

Deklaracja 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;}

public:

void aktualizuj(double zas, double pr);

void pokaz();

};

Implementacja funkcji składowych klasy

//plik pracownik.cc

#include <iostream>

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";

}

Pracownik

imie nazwisko stanowisko

zasadnicza premia pensja obliczPensje() aktualizuj

pokaz

(10)

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);

} }

(11)

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;

}

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();

} }

(12)

Ogólnie o klasach

//C++

class NazwaKlasy {

private:

dane składowe klasy public:

funkcje składowe (prototypy) klasy }

Zawartośd 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];

(13)

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 mied 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;

}

(14)

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 zdefiniowad

samemu (o ile jest potrzebny).

(15)

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 zdefiniowad samemu (o ile jest potrzebny). Zobacz przykład poniżej.

class Zespolona {

private:

double re;

double im;

public:

Zespolona(int x, int y) {

re = x;

im = y;

} };

int main() {

Zespolona z1(1,2); //poprawnie Zespolona z2; // źle

return 0;

}

(16)

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’;

} };

(17)

Kiedy wywoływany jest destruktor?

•Decyzję o wywołaniu destruktora podejmuje kompilator. Kod nie powinien jawnie wywoływad destruktora.

•Jeżeli obiekt tworzony jest w pamięci statycznej, wówczas jego destruktor wywoływany jest przed zakooczeniem 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;

}

(18)

KONIEC

Dziękuję za uwagę 

Cytaty

Powiązane dokumenty

Zadanie 13. Oba gazy przereagowały całkowicie. Napisz równanie reakcji i oblicz liczbę cząsteczek otrzymanego produktu z dokładnością do drugiego miejsca po

Jeżeli jakieś dane em ­ piryczne przemawiają przeciw jednej lub drugiej teorii, powstały konflikt traktuje się jako dowód na to, że teoria nie stosuje się do sytuacji,

- ściśle rosnąca wtedy i tylko wtedy, gdy jej pochodna jest nieujemna oraz między każdymi dwoma punktami przedziału P znajduje się punkt, w którym pochodna ' f jest dodatnia, -

23. Dana jest liczba rzeczywista a. Niech P będzie dowolnym punktem wewnątrz czworokąta wypukłego ABCD. Udowod- nij, że środki ciężkości trójkątów 4P AB, 4P BC, 4P CD, 4P

Tetrisa możemy kłaść w dowolny sposób na szachownicę tak, aby boki tetrisa pokry- wały się z bokami pól na szachownicy, możemy również go obracać.. Mamy dane dwa

Dowód nierówności Jensena.

 rezystancja wejściowa układu jest równa rezystancji wzmacniacza operacyjnego dla sygnału współbieżnego.  rezystancja wejściowa jest bardzo duża i w praktyce wynosi 10 10

 jeżeli poczujesz się zagrożony, wezwij pomoc przez otwarte okno lub z balkonu, staraj się być jak najdalej od miejsca, w którym są płomienie lub dym.. Pali się na