end

Transkrypt

end
Informatyka
MPZI
Wykład 5
Typ obiektowy
Struktury dynamiczne
Podstawowe cechy
programowania
obiektowego
Programowanie strukturalne
koncepcja tradycyjna.
(proceduralne)
Główną jego cechą są instrukcje działające na
danych.
Złożone programy korzystają z funkcji, procedur w
celu uproszczenia zarządzania i kontroli nad
programem, lecz nie zmienia to podstawowej
koncepcji.
–
Wady programowania strukturalnego
■ dane są powszechnie dostępne – łatwo o błędy,
■ sekwencyjność wykonywania programu,
■ wszystkie sytuacje trzeba przewidywać
i obsługiwać,
■ konieczność testowania po każdej zmianie,
■ wiele instrukcji, obszerny kod, trudność
zrozumienia algorytmu
Zauważono „kryzys oprogramowania” – programowanie
strukturalne utrudnia panowanie nad bardzo złożonymi
systemami informatycznymi (SI) - rozwój sprzętu
wyprzedzał techniki budowania SI
Potrzebne były metody zwiększające wydajność i
systematyczność tworzenia SI, a następnie ich
wydajność.
Poza tym powstały interfejsy graficzne (Windows)!
Korzenie technologii obiektowej – lata 60-te,
Nygaard i Dohl, języki Simula 1, Simula67 (1967).
OBIEKTOWOŚĆ – filozofia tworzenia na podstawie
rzeczywistych zjawisk otaczającego świata (nie tylko język
programowania).
Obiekty (świata rzeczywistego a także systemu
operacyjnego komputera – plik, ikona, przycisk, okno) –
mają swoje właściwości statyczne (nazwa, kolor itp.) a także
zbiory operacji (możliwych do wykonania na nich czy przez
nie wykonywanych).
Np. typ tablica ma swoje cechy – atrybuty:
■ wymiar
■ rozmiar
■ typ przechowywanych danych
nie określa się jednak sposobów operacji na
tablicach (np. dodawanie tablic), trzeba do tej
operacji tworzyć własne kody lub korzystać
z bibliotecznych procedur, których użycie wymaga
szczegółowego zapoznania się z zestawem
parametrów formalnych (sposób użycia).
Stworzono tzw. ADT – abstrakcyjny typ danych –
podążanie w kierunku naturalnego języka (zbliżenie do
rzeczywistości), nazwano modułem (język Modula) lub
klasą (język Simula).
System reaguje na zdarzenia („siły sprawcze”),
efektem są procesy:
• funkcje przetwarzania parametrów obiektów
• przesyłu informacji między obiektami
• oddziaływania jednych obiektów na inne
PROGRAMOWANIE OOP – podstawowe pojęcia
Programowanie zorientowane obiektowo (OOP – Object Oriented
Programming) umożliwia przedstawienie problemu w postaci
logicznie powiązanych ze sobą struktur danych zwanych
obiektami, wymieniających informacje między sobą.
„Obiektowość” opiera się na koncepcyjnym (intuicyjnym)
klasyfikowaniu rzeczywistości.
Na świat składają się obiekty i procesy w nich zachodzące.
KLASA = typ obiektowy = encja (entity)
OBIEKT =reprezentacja w klasie = instancja w klasie
Podobnie jak typ zmiennej i zmienna
Definicje
KLASA - zbiór obiektów „przefiltrowanych”
przez definicję typu obiektowego sklasyfikowanych do tego typu.
KLASA - zbiór właściwości i funkcji (METOD)
charakterystycznych dla pewnego zbioru
obiektów
Koncepcja (pojęcie) jest wyobrażeniem lub oznaczeniem
stosowanym do rzeczy lub obiektów w naszej świadomości
(Martin)
(Encja = byt pojęciowy, konceptualny)
Przykład 1: klasyfikacja obiektów
materialne: osoba, samochód
niematerialne (abstrakcyjne): firma, czas,
role: pacjent, nauczyciel,
relacyjne: małżeństwo, posiadanie
zdarzeniowe: sprzedaż, wysłanie
inne: zestaw, ikona, sygnał, proces
W DELPHI – obiekty użytkowe są zazwyczaj
komponentami graficznymi: okna, kontrolki itp., ale
nie tylko.
Istnieje pewna grupa klas zdefiniowanych w Delphi
– hierarchia klas
rodzic
TObject
TPersistent
TGraphic
TScreen
TComponent
TMenuItem
TGraphicControl
TCustomEdit
potomek
TCustomComboBox
TCustomControl
TCanvas
TMenu
TPicture
TControl
TWinControl
TStrings
TGlobalComponent
TApplication
TCustomListBox
TButtonControl
TScrollingWinControl
TForm
formularz "okno"
Windows
Własność polegająca na dostępie do pól jedynie przy
użyciu metod nazywa się hermetyzacją.
Tworzy to dyscyplinę programowania, w jednym miejscu
mamy dane i dozwolone operacje na nich.
Ułatwia kontrolę poprawności złożonych programów.
Typ obiektowy jest to złożona struktura danych o określonej
liczbie atrybutów.
Atrybuty dzielimy na pola
i metody.
pola (fields) – atrybuty (właściwości opisane
wartościami dowolnych typów, także strukturalnych)
Pole jest to zmienna, która może być różnego typu.
metody (methods) – procedury i funkcje wykonywane
na polach.
Metoda jest czynnością wykonywaną na obiekcie
w postaci procedury lub funkcji. Metoda obiektu operuje
na polach (danych) obiektu, przy ich pomocy mamy
dostęp do pól.
Czyli typ obiektowy to typ rekordowy poszerzony o metody
DZIEDZICZENIE
Typ obiektowy może on być:
•
niezależny, (zdefiniowany podobnie jak typ
rekordowy) – rodzic drzewa
•
jako potomek istniejącego. Wtedy mówimy, że obiekt
dziedziczy wszystkie elementy (pola i metody)
swojego przodka lub jest typem potomnym.
Obiekty potomne mogą mieć własnego potomka (lub
wielu).
POLIMORFIZM
Potomek może mieć zdefiniowaną metodę o takiej samej nazwie
metody jak przodek, „przykrywa” ona wówczas metodę przodka.
Definiując metodę potomka (rozwijając ją lub modyfikując, np. gdy
jest ona rozszerzeniem metody nadrzędnej), można odwołać się
do metody dziedziczonej od przodka.
Jest to tzw. POLIMORFIZM
Polimorfizm (wielopostaciowość) - wykorzystanie tzw.
metod wirtualnych.
Wzajemne zależności obiektów układają się w
drzewo hierarchii obiektów.
Dziedziczność bezpośrednia – przodek jest niezależny (sam nie
ma przodka)
Dziedziczność pośrednia – przodek już dziedziczy (sam ma
przodka)
Przykład:
type polozenie =
class {obiekt niezależny}
x:integer;
y:integer;
end;
punkt =
class (polozenie)
{obiekt potomny}
widocznosc: Boolean;
end;
Metoda jest to procedura lub funkcja mająca deklarację w
ramach typu obiektowego (sam nagłówek procedury lub funkcji).
Definicja metody występuje poza definicją typu obiektowego i po
niej.
W nagłówku definicji nazwa jest kwalifikowana, czyli wskazuje na
obiekt, którego dotyczy i ma postać:
nazwa_typu_obiektowego . nazwa_metody
identycznie jak w zmiennych rekordowych
Przykład:
type polozenie = class {obiekt niezależny}
x:integer;
y:integer;
procedure przesun (nx, ny: Integer);
end;
procedure polozenie.przesun(nx, ny: Integer);
begin
x:=nx;
y:=ny;
end;
Konstruktor – specjalna metoda używana
przy tworzeniu (instancji) obiektu danej
klasy – zmienna typu obiektowego
Destruktor – specjalna metoda wywoływana
automatycznie tuż przed zakończeniem
istnienia obiektu
Poziomy dostępu do składników klasy
Private – pola i metody ukryte, niewidzialne
poza klasą, chyba, że w tym samym module
Public – pola i metody dostępne, nawet jeśli w
innym module, umieszczonym na liście
USES
Protected - pola i metody dostępne tylko dla
potomków
W programach komputerowych
Wykonywanie metod obiektowych z reguły –
jako reakcja na pewne zdarzenia (Events)
Obiekty wizualne posiadają pewne zbiory
zdarzeń np. OnClick, OnPress, OnDrag itp.
Inicjacja metod obiektowych powinna być
związana z wystąpieniem zdarzeń
Przykład
Tworzenie własnego typu obiektowego (klasy)
Definicja klasy
type
TPunkt = class
x:Integer;
y:Integer;
procedure przesun(dx,dy:Integer);
constructor Create(Sender: TObject);
destructor Destroy;override;
end; //koniec definicji typu
var
p: TPunkt; //zmienna typu obiektowego
constructor TPunkt.create(Sender:TObject);//konstruktor
begin
inherited create;
end;
destructor TPunkt.destroy; //destruktor
begin
inherited destroy;
end;
procedure TPunkt.przesun(dx, dy: Integer);
begin
x:=x+dx;
y:=y+dy;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
p:=TPunkt.create(self);
p.x:=30;
p.y:=40;
edit1.Text:=IntToStr(p.x);
edit2.Text:=IntToStr(p.y);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
p.przesun(4,4);
edit1.Text:=IntToStr(p.x);
edit2.Text:=IntToStr( p.y);
end;
Przykład aplikacji "okienkowej" - umieszczamy komponenty w oknie
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Edit1: TEdit;
Label1: TLabel;
MainMenu1: TMainMenu;
Kolor1: TMenuItem;
Szeroko1: TMenuItem;
Przesu1: TMenuItem;
Widok1: TMenuItem;
Zamknij1: TMenuItem;
Label2: TLabel;
PopupMenu1: TPopupMenu;
Zamknij2: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.Width:=400; //zmiana wartości pola innego obiektu
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Button1.Visible := not Button1.Visible;//zmiana widoczności
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Button1.Left:=Button1.Left+20; //zmiana wartosci pola innego obiektu
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Edit1.Clear;//wyczyszczenie pola Edit
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
Form1.Close; //inicjacja metody zamknięcia
end;
end.
STRUKTURY DYNAMICZNE
Cel podstawowy – oszczędność pamięci, sami
decydujemy o długości struktury (np. tablice mają
niestety stałą wielkość)
ZASADY
Do zbioru (uporządkowanego według określonej
metody) możemy dołączać nowe elementy.
Rozmiar zbioru nie jest zdefiniowany, każde
dołączanie nowego elementu powoduje nową
rezerwację pamięci.
Pobieranie elementu (usuwanie), dołączanie nowego
– mogą być obarczone pewnymi kryteriami dostępu.
Lista jednokierunkowa
dane
adres
dane
adres
dane
adres
dane
nil
koniec
musi być znane
wskazanie (adres) p
początku listy
type
TypDanych = String[44];
Wskaznik
=^ElementListy;
ElementListy = record
D : TypDanych;
typ
"wskaźnikowy"
Nastepny : Wskaznik
end;
Jest to definicja rekurencyjna, bo:
wcześniej jest definiowany typ wskaźnikowy,
korzystający z nieznanej jeszcze definicji elementu
listy
następnie jest definiowany rekord, którego jedno z pól
jest wcześniej definiowanego typu wskaźnikowego
Lista jednokierunkowa może być "w przód" lub "wstecz",
czyli element może zawierać wskaźnik na następny lub
poprzedni element.
Tworzenie nowego elementu polega na stworzeniu nowego
początku, czyli:
var
q : Wskaznik;
begin
// tu stara lista z początkiem p
New (q); { Tworzymy nowy element, na razie nie związany z listą }
q^.N := p;
{ pole N wskazać ma na stary "początek" }
p := q;
{ teraz początkiem jest stworzony element}
q^.D := 'tekst' {wpisujemy dane, które będą w nim przechowywane }
// kontynuacja
end;
Inne struktury dynamiczne
Lista dwukierunkowa
liniowo uporządkowany zbiór składników, w którym dla
każdego składnika, poza pierwszym i ostatnim, jest
określony składnik poprzedni i następny.
Dla ostatniego składnika listy dwukierunkowej jest
określony tylko składnik poprzedni, a dla pierwszego
tylko następny.
dane
wskaźnik na poprzedni
wskaźnik na następny
Stos (stack)
to struktura danych, składająca się z liniowo
uporządkowanych zbiorów składników (elementów), z
których tylko ostatnio dołączony jest w danej chwili
dostępny.
Miejsce dostępu to wierzchołek stosu. Jest to jedyne
miejsce, do którego można dołączyć lub z którego
można usunąć elementy.
FILO lub LIFO
first in – last out
last in - first out
Kolejka (queue)
jest strukturą danych, składającą się z liniowo
uporządkowanych zbiorów składników, do której można
dołączyć składnik tylko na jednym końcu (koniec
kolejki), a usunąć tylko na drugim końcu (początek
kolejki).
Powiązanie między składnikami kolejki jest takie samo jak
pomiędzy składnikami stosu.
FIFO
first in – first out
Drzewo binarne
jest strukturą danych, składającą się nieliniowo uporządkowanych
zbiorów składników.
Do każdego składnika można dołączyć zero, jeden lub dwa składniki.
Drzewo ma swój "korzeń" z którego wyrasta struktura.
dane
wsk_lewe
wsk_prawe
dane
wsk_lewe
nil
dane
nil
nil
dane
wsk_lewe
wsk_prawe
dane
nil
nil
dane
nil
nil
Drzewo binarne, w którym liczba synów każdego wierzchołka
wynosi albo zero albo dwa, nazywane jest drzewem regularnym

Podobne dokumenty