Klasy oop. Programowanie zorientowane obiektowo

Warunki "obiekt" и "klasa" Każdy zna. Dla informatyków mają one jednak swoje własne konotacje. Są to podstawowe pojęcia w programowaniu obiektowym. Klasy to zdefiniowany przez dewelopera typ danych charakteryzujący się sposobem ich przekazywania i przechowywania, profilem użycia oraz zestawem akcji, które można z nimi wykonać. Różnią się tym, że mogą być zaimplementowane jako interfejs.

Czym jest OOP (programowanie zorientowane obiektowo)

Doświadczeni programiści znają COBOL i C. Programy w nich napisane były sekwencją instrukcji krok po kroku. Używali procedur i funkcji, aby uczynić oprogramowanie modułowym. Paradygmat ten skupiał się raczej na logice niż na danych oraz na metodach ich łączenia.

Zajęcia z programowania obiektowego

Współczesne języki programowania Delphi, Java, C# i inne stosują podejście obiektowe. Kiedy to znaczenie Podaje dane, a nie tylko pisze instrukcje do wykonania zadania. Obiekt to rzecz lub pomysł, który chcesz wymodelować. Może to być cokolwiek, na przykład pracownik, konto bankowe, samochód, różne umeblowanie i tak dalej.

Koncepcja programowania obiektowego (OOP) jest nieodłącznie związana z następującymi kryteriami:

  • Abstrakcja.
  • Encapsulation.
  • Dziedziczenie.
  • Polimorfizm.

Rozważmy szczegółowo każdy z nich.

Abstrakcja

To kryterium pozwala nam skupić się na tym, co robi sam obiekt, ale nie na sposobach, w jakie te działania są implementowane w programowaniu. OOP zakłada, że abstrakcja polega na poznaniu jak największej ilości danych o obiekcie. Pomaga w tworzeniu niezależnych modułów, które mogą wchodzić ze sobą w interakcje na kilka sposobów.

Staramy się selektywnie skupić tylko na tych rzeczach, które są dla nas ważne (w życiu) lub dla naszego modułu (w programowaniu). Zmiana jednego niezależnego modułu nie wpływa na pozostałe. Jedyną rzeczą jest musimy wiedzieć, - to jest to, co nam daje. Osoba korzystająca z tego modułu nie musi się martwić o to, jak rozwiązany jest problem, co dzieje się w tle.

Konstruktor klasy C

Przedmioty codziennego użytku, których używamy, posiadają abstrakcje stosowane na różnych poziomach. Jednym z przykładów programowania obiektowego jest zastosowanie hamowania w samochodzie. System ten jest abstrakcyjny: wystarczy, że kierowca naciśnie pedał, aby pojazd zwolnił i zatrzymał się. Zmiany w systemie przyspieszania nie mają wpływu na system hamowania, ponieważ są one niezależne. Kierowca nie musi rozumieć działania hamulców. Wszystko, co musi zrobić, to nacisnąć pedał w odpowiednim czasie. Hamulec (zarówno tarczowy jak i bębnowy) zostanie zwolniony, a maszyna zwolni.

Encapsulation

Pojęcie to jest ściśle związane z abstrakcją. Encapsulation to rozwinięcie rozwiązania problemów, które nie wymagają od użytkownika pełnego zrozumienia ich przedmiotu. Wiąże dane i zachowanie razem i uniemożliwia klientowi lub użytkownikowi modułu poznanie wewnętrznej reprezentacji, w której zaimplementowane jest zachowanie abstrakcji.

System programowania zorientowany obiektowo

Dane nie są bezpośrednio dostępne. Dostęp do nich można uzyskać za pomocą określonych funkcji. Ukrycie wewnętrznych elementów obiektu chroni jego integralność, uniemożliwiając użytkownikom wprowadzenie wewnętrznych danych komponentu w niedopuszczalny lub niezgodny ze stanem faktycznym stan.

Dziedziczenie

Jest to mechanizm ponownego wykorzystania kodu, który może pomóc w zmniejszeniu duplikacji kodu. Ta koncepcja jest potężną cechą obiektowych języków programowania. Pomaga organizować klasy w hierarchię, pozwalając im dziedziczyć atrybuty i zachowanie z komponentów upstreamowych.

Przykład dziedziczenia: papuga to ptak, rubel rosyjski to rodzaj waluty. Jednakże zwrot "bank to konto bankowe" nie jest prawdą. Ta zależność jest oczywista, gdy chcemy opisać podmiot w danej wypowiedzi problemowej. Dzięki dziedziczeniu możesz zdefiniować ogólną implementację OOP i jej zachowanie, a następnie dla wyspecjalizowanych klas nadpisać lub zmienić je na coś bardziej konkretnego. Dziedziczenie nie działa wstecz. Źródło (tzw. rodzic) nie będzie posiadał właściwości klasy pochodnej (dziecka).

Ważne jest, aby zauważyć, że próbując modelować rozwiązanie, nie powinniśmy dodawać wielu poziomów dziedziczenia. Musimy spróbować określić wspólne atrybuty i zachowania w modelowanych obiektach. Następnie, na podstawie tego, kod może być dalej refaktoryzowany, definiując odpowiednią klasę nadrzędną. Można do niego przenieść wspólną implementację.

Polimorfizm

Koncepcja ta umożliwia rozbudowę systemów komputerowych poprzez tworzenie nowych, wyspecjalizowanych obiektów. Jednocześnie umożliwia interakcję obecnej wersji z nową, bez zwracania uwagi na jej specyficzne właściwości.

Na przykład, jeśli zadanie polega na napisaniu wiadomości na kartce papieru, można użyć długopisu, ołówka, markera lub rysika. Wystarczy, że narzędzie mieści się w dłoni i ma możliwość pozostawienia śladu po zetknięciu z papierem. Okazuje się, że pewne działania człowieka robią za zapis na kartce papieru, a to, jakie narzędzie zostanie użyte, nie jest tak istotne w przekazywaniu informacji.

Innym przykładem polimorfizmu w systemie programowania obiektowego jest samolot i prom kosmiczny, które można nazwać obiektami latającymi. Jak dokładnie poruszają się w przestrzeni? Oczywiście jest duża różnica w sposobie ich działania. To znaczy, że sposoby realizacji ich ruchu nie są takie same. Jednak z punktu widzenia widza, oba obiekty lecą.

Implementacja OOP

Dziedziczenie jest jednym ze sposobów osiągnięcia polimorfizmu, gdzie zachowanie zdefiniowane w odziedziczonej klasie może być nadpisane poprzez napisanie własnej implementacji metody. To się nazywa nadpisywanie (polimorfizm w czasie kompilacji).

Istnieje inna forma polimorfizmu zwana przeciążeniem, w którym nie uwzględnia się dziedziczenia. Nazwa metody będzie taka sama, ale argumenty w metodzie są różne.

Cechy koncepcji "klasa" и "obiekt"

Aby rozpocząć programowanie zorientowane obiektowo, musimy zrozumieć, czym jest klasa OOP i obiekt. Ważne jest, aby zrozumieć różnicę między nimi. Klasa to schemat tworzenia obiektu. Określa atrybuty i zachowanie. Jest to podobne do inżynierskiego rysunku domu. Obiekt jest instancją. To jest różnica między nimi. Poniższy przykład pokazuje, jak klasa "TForml" i zmienną "Forml" na stronie język programowania Delphi:

typeTForml =klasa(TForm)Buttonl: TButton;procedura ButtonlClick(Nadawca: TObject);koniec;varForml: TForml;

Jeśli chcemy zasymulować w naszym programie np. samochód, musimy określić go atrybuty: model, paliwo, marka, kolor, jego zachowanie, jak również tzw. metody: rozruchu silnika, hamowania, przyspieszania i tak dalej. Łatwo zauważyć, że podane liczby nie są charakterystyczne tylko dla jednej marki czy modelu pojazd.

W podejściu obiektowym staramy się uogólnić nasz obiekt (maszynę) stwierdzając, że ta, którą będziemy modelować w naszym programie będzie miała pewną liczbę atrybutów i metod. Mogą istnieć inne wskaźniki i cechy pojazdu, ale te wymienione powyżej są wystarczające dla nas, aby zrozumieć, jak klasa działa w OOP.

Gdy korzystamy z tych danych, tworzymy pojazd o określonych parametrach. Programując ten sam obiekt (samochód) możemy przyjąć różne cechy, co przedstawia poniższa tabela:

Obiekt 1Obiekt 2
Model: VAZ 2107model: VAZ 2109
paliwo: benzynapaliwo: olej napędowy
kolor: czerwonyKolor: Zielony
sposób uruchamiania silnika: Start ()sposób uruchamiania silnika: Start ()
sposób hamowania: Break ()sposób hamowania: Break ()
metoda przyspieszania: przyspieszenie ()metoda przyspieszania: przyspieszenie ()

W ten sposób programowanie obiektowe pozwala na łatwe symulowanie zachowania złożonego systemu świata rzeczywistego. W OOP dane i funkcje (atrybuty i metody) są połączone w obiekcie. Zapobiega to potrzebie jakichkolwiek generycznych lub globalnych danych z OOP. To podejście jest główną różnicą między podejściem obiektowym i proceduralnym.

Czym jest klasa w OOP?

Klasy OOP składają się z elementów różnych typów:

  1. Pola danych: przechowywanie stanu klasy za pomocą zmiennych i struktur.
  2. Metody: podprogramy do manipulowania określonymi danymi.
  3. Niektóre języki pozwalają na trzeci typ - właściwości. To jest gdzieś pomiędzy pierwszymi dwoma.

Metody

Zachowanie klasy lub jej instancji jest definiowane za pomocą metod. Są to podprogramy mające możliwość manipulowania obiektami. Operacje te mogą zmienić stan obiektu lub po prostu zapewnić dostęp do niego.

Istnieje wiele metod. Ich wsparcie zależy od języka. Niektóre z nich są tworzone i wywoływane przez kod programisty, inne (specjalne, takie jak konstruktory, destruktory i operatory przekształceń) są tworzone i wywoływane przez kod generowany przez kompilator. Język może pozwolić programiście na zdefiniowanie tych specjalnych metod.

Interfejs

Jest to definicja grupy działań abstrakcyjnych. Jest to określenie, jakie zachowanie powinien wykazywać dany obiekt bez określenia, jak powinien być zaimplementowany.

Obiekt może mieć kilka ról, a użytkownicy mają możliwość korzystania z niego z różnych perspektyw. Na przykład, obiekt typu "człowiek" może mieć role:

  • Żołnierz (z zachowaniem "strzelać do wroga").
  • Mąż (z zachowaniem "kochaj swoją żonę").
  • Podatnik (z zachowaniem "płacić podatki") itp.

Ale każdy obiekt realizuje swoje zachowanie inaczej: Misza płaci podatki na czas, Andrzej się spóźnia, a Piotr nie robi tego wcale. To samo można powiedzieć o każdym obiekcie i innych rolach.

Czym jest OOP

Pojawia się pytanie, dlaczego klasa bazowa wszystkich obiektów nie jest interfejsem. Powodem jest to, że w takim przypadku każda klasa musiałaby zaimplementować małą, ale bardzo ważną grupę metod, co zajęłoby niepotrzebnie dużo czasu. Okazuje się, że nie wszystkie klasy potrzebują konkretnej implementacji - w większości przypadków wystarczy wspólna domyślna. Nie ma potrzeby nadpisywania żadnych metod, ale jeśli sytuacja tego wymaga, można zaimplementować.

Dobrym przykładem są przyciski z przodu telewizora. Można powiedzieć, że stanowią one interfejs pomiędzy użytkownikiem a okablowaniem znajdującym się po drugiej stronie korpusu urządzenia. Osoba naciska przycisk zasilania, aby włączyć lub wyłączyć urządzenie elektryczne. W tym przykładzie konkretny telewizor jest instancją, każda metoda jest reprezentowana przez przycisk, a razem tworzą one interfejs. W jego najczęściej spotykany forma, jest to specyfikacja grupy powiązanych metod bez ich implementacji.

Konstruktor

Kryterium to odpowiada za przygotowanie obiektu do działania, np. poprzez ustawienie wartości początkowych dla wszystkich jego danych i elementów. Chociaż odgrywa szczególną rolę, konstruktor jest po prostu kolejną funkcją, która może być użyta do przekazania informacji za pomocą listy argumentów. Można je wykorzystać do inicjalizacji. Nazwa funkcji konstruktora i nazwa klasy są takie same.

Poniższy przykład wyjaśnia pojęcie konstruktora klasy w C++ (popularnym języku programowania):

#włączużywającprzestrzeń nazw std;klasaLinia{public:voidsetLength(podwójny len );podwójnygetLength(void);Linia();// deklaracja konstruktoraprywatny:podwójny długość;};// Definicja funkcji, w tym konstruktoraLinia::Linia(void){cout <<"Obiekt jest tworzony przez"<< endl;}void Linia::setLength(podwójny len ){długość = len;}podwójny Linia::getLength(void){powrót długość;}/Ciało programoweintgłówna(){Linia;// Długość łańcuchalinia.setLength(6.0);cout <<"Długość linii : "<< linia.getLength()<<endl;powrót0;}

Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik:

utworzony obiekt

Długość linii: 6

Destruktor

Jest to funkcja klasy specjalnej, która niszczy obiekt, gdy tylko jego zakres wygasa. Destruktor jest automatycznie wywoływany przez kompilator, gdy obiekt opuszcza zakres.

Składnia dla destruktora jest taka sama jak dla konstruktora, ale nazwa klasy jest używana z tyldą w tym przypadku "~" jako prefiks.

Poniższy przykład w języku C++ wyjaśnia pojęcie destruktora:

#włączużywającprzestrzeń nazw std;klasaLinia{public:voidsetLength(podwójny len );podwójnygetLength(void);Linia();// deklaracja konstruktora~Linia();// deklaracja destruktoraprywatny:podwójny długość;}// Definicja funkcji, w tym konstruktoraLinia::Linia(void){cout <<"Obiekt jest tworzony"<< endl;}Linia::~Linia(void){cout <<"Obiekt usunięty"<< endl;}void Linia::setLength(podwójny len ){długość = len;}podwójny Linia::getLength(void){powrót długość;}/Ciało programoweintgłówna(){Linia linia;// długość liniilinia.setLength(6.0);cout <<"Długość linii : "<< linia.getLength()<<endl;powrót0;}

Gdy powyższy kod zostanie skompilowany i wykonany, da następujący wynik:

utworzony obiekt

Długość linii: 6

Obiekt usunięty

Jakie są zalety zajęć

Zalety organizacji oprogramowanie Klasy obiektów podzielone są na trzy kategorie:

  • Szybki rozwój.
  • łatwy w utrzymaniu.
  • Ponowne wykorzystanie kodu i projektu.
Podstawowe pojęcia z zakresu programowania obiektowego

Klasy i OOP w ogóle promują szybki rozwój, ponieważ zmniejszają semantyczną lukę między kodem a użytkownikami. Jest to doceniane przez wielu programistów. Dzięki temu systemowi analitycy mogą komunikować się zarówno z programistami, jak i użytkownikami, używając tego samego słownictwa, odnosząc się do kont, klientów, rachunków itd.

Klasy obiektów często ułatwiają szybki rozwój, ponieważ większość środowisk zorientowanych obiektowo posiada potężne możliwości debugowania i testowania. Instancje klas mogą być sprawdzane w czasie pracy, aby zapewnić, że system działa poprawnie. Ponadto, zamiast pobierać zrzuty pamięci jądra, większość środowisk zorientowanych obiektowo interpretuje możliwości debugowania. W rezultacie programiści mogą przeanalizować dokładnie, gdzie w programie wystąpił błąd i zobaczyć, jakie metody, argumenty i wartości zostały użyte.

Artykuły na ten temat