Klasy OOP. Programowanie obiektowe

Pojęcia "przedmiot" i "klasa" są znane każdej osobie. Jednak dla projektantów komputerowych mają one swój własny podtekst. Są to podstawowe pojęcia w programowaniu obiektowym. Klasy - rodzaj danych jest określany przez programistę, który charakteryzuje sposób ich przesyłania i przechowywania, profil użytkowania i zestaw działań, które mogą wykonać. Różnią się tym, co można zaimplementować jako interfejs.

Co to jest OOP (programowanie obiektowe)

Doświadczeni programiści dobrze znają języki w języku COBOL i C. Programy tam napisane reprezentują sekwencję instrukcji krok po kroku. Zastosowali procedury i funkcje, aby program był modułowy. Ten paradygmat skupiał się na logice, a nie na danych, ale na metodach ich powiązania.


Nowoczesne języki programowania Delphi, Java, C # i inne stosują podejście obiektowe. Jednocześnie podana jest ważność danych, a nie tylko pisanie instrukcji do zadania. Obiekt to rzecz lub idea, którą chcesz symulować. Mogą to być wszystko, na przykład pracownik, konto bankowe, samochód, różne elementy sytuacji i tak dalej. Pojęcie programowania obiektowego (OOP) jest nierozerwalnie związane z następującymi kryteriami:
  • Abstrakcja.
  • Enkapsulacja.
  • Dziedziczenie.
  • Polimorfizm.
  • Rozważ każdą z nich bardziej szczegółowo.

    Abstrakcja

    To kryterium pozwala skupić się na tym, co robi sam obiekt, ale nie na czymW ten sposób działania te realizowane są w programowaniu. OOP zakłada, że ​​abstrakcja jest wiedzą o przedmiocie maksymalnej ilości danych. Pomaga w tworzeniu niezależnych modułów, które mogą współpracować ze sobą w pewien sposób.


    Staramy się selektywnie skupiać wyłącznie na tych rzeczach, które są dla nas ważne (w życiu) lub na naszym module (w programowaniu). Zmiana jednego niezależnego modułu nie wpływa na inne. Jedyne, co musisz wiedzieć, to to, co nam daje. Osoba korzystająca z tego modułu nie musi się martwić o to, jak zadanie zostanie rozwiązane, co dzieje się w tle.
    Codzienne obiekty, z których korzystamy, mają abstrakcje, które są stosowane na różnych poziomach. Jednym z przykładów programowania obiektowego jest zastosowanie hamowania w samochodzie. System ten jest abstrakcyjny: wystarczy nacisnąć pedał, aby pojazd zwolnił prędkość i zatrzymał się. Wprowadzanie zmian w układzie przyspieszającym nie wpływa na układ hamulcowy, ponieważ są one niezależne. Kierowca nie musi rozumieć wewnętrznej pracy hamulców. Wystarczy nacisnąć pedał na czas. W takim przypadku hamulce (zarówno tarcza, jak i bęben) będą działać, a samochód spowolni prędkość.

    Enkapsulacja

    Pojęcie to jest ściśle związane z abstrakcją. Enkapsulacja jest rozwiązaniem problemu i nie wymaga od użytkownika pełnego zrozumienia jego obszaru tematycznego. Łączy dane i zachowanie z pojedynczą jednostką i uniemożliwia klientowi lub użytkownikowi modułu poznanie wewnętrznych danychreprezentacja, w której realizowane są zachowania abstrakcji.
    Dane nie są dostępne bezpośrednio. Dostęp do nich odbywa się za pośrednictwem określonych funkcji. Ukrywanie wewnętrznych elementów obiektu chroni jego integralność, uniemożliwiając użytkownikom przekształcenie wewnętrznych danych komponentów w stan nieprawidłowy lub niekompatybilny.

    Dziedziczenie

    Jest to mechanizm ponownego użycia kodu, który może pomóc w ograniczeniu jego powielania. Ta koncepcja jest potężną cechą języków programowania obiektowego. Pomaga organizować klasy w hierarchii, pozwalając im na naśladowanie atrybutów i zachowań z komponentów, które są wyższe. Przykład imitacji: papuga jest ptakiem, rosyjski rubel jest rodzajem waluty. Jednak wyrażenie "bank jest kontem bankowym" jest nieprawidłowe. To połączenie jest oczywiste, gdy konieczne jest opisanie jakiejś istoty w tym stwierdzeniu problemu. Dziedziczenie pozwala określić ogólną implementację OOP i jego zachowanie, a następnie dla wyspecjalizowanych klas, aby anulować lub zmodyfikować te wskaźniki w celu uzyskania czegoś bardziej konkretnego. Dziedziczenie nie działa wstecz. Źródło (tak zwany ojciec) nie będzie miało właściwości pochodnej (klasy potomnej). Należy pamiętać, że podczas próby symulacji rozwiązania nie należy dodawać wielu poziomów dziedziczenia. Musisz spróbować określić ogólne atrybuty i zachowanie w modelowanych obiektach. Następnie na tej podstawie można kontynuować przekształcanie kodu, który definiuje odpowiednią klasę rodzicielską. Ogólne wdrożenie można przenieść do niego.

    Polimorfizm

    Ta koncepcja pozwalarozbudować systemy komputerowe, tworząc nowe, wyspecjalizowane obiekty. Jednocześnie umożliwia bieżącą wersję interakcji z nowym, bez zwracania uwagi na jego szczególne właściwości. Na przykład, jeśli masz zadanie pisania wiadomości na kartce papieru, możesz użyć długopisu, ołówka, markera lub długopisu. Wystarczy, że narzędzie mieści się w dłoni i może pozostawić ślad po kolizji z papierem. Okazuje się, że pewne czynności danej osoby odnotowują na arkuszu, a podczas korzystania z narzędzia nie jest to tak ważne dla przekazywania informacji. Innym przykładem polimorfizmu w systemie programowania obiektowego są samoloty i wahadłowce kosmiczne, które można nazwać latającymi obiektami. Jak dokładnie poruszają się w kosmosie? Oczywiste jest, że istnieje duża różnica w ich pracy. Oznacza to, że sposoby realizacji ich ruchów są różne. Jednak z punktu widzenia widza oba obiekty latają.
    Dziedziczenie jest jednym ze sposobów osiągnięcia polimorfizmu, gdy zachowanie zdefiniowane w odziedziczonej klasie można przedefiniować, pisząc użytkownika, aby zaimplementował metodę. Nazywa się to przedefiniowaniem (polimorfizm czasu kompilacji). Istnieje inna forma polimorfizmu, zwana przeciążeniem, w której dziedziczenie nie jest brane pod uwagę. Nazwa metody będzie taka sama, ale argumenty w tej metodzie są różne.

    Cechy pojęć "klasa" i "przedmiot"

    Aby rozpocząć pracę z programowaniem obiektowym, musimy dowiedzieć się, co jest klasą obiektu rzutowanego i obiektu. Ważne jest, aby zrozumieć różnicę między nimi. Klasa jest planem dlatworzenie obiektu. Definiuje atrybuty i zachowanie. Wygląda jak rysunek techniczny domu. Obiekt jest instancją klasy. Oto różnica między nimi. Poniższy przykład pokazuje, w jaki sposób deklarowane są klasy TForml i Forml w języku programowania Delphi:



    typ
    TForml = klasa (TForm)
    Buttonl: TButton;
    procedura ButtonlClick (Sender: TObject);
    koniec;
    może
    Forml: TForml;

    Jeżeli chcemy modelować w naszym programie, takich jak samochód, musi zdefiniować swoje atrybuty: model, paliwo, markę, kolor, jego zachowanie i tzw, począwszy od silnika, hamowanie, przyspieszanie, etc. . Oczywiste jest, że wskaźniki te są charakterystyczne nie tylko dla jednej marki lub modelu pojazdu.

    W podejściu obiektowym staramy się uogólniać nasz obiekt (samochód), twierdząc, że będziemy modelować w naszym programie będzie miał liczbę atrybutów i metod. Mogą być też inne parametry i charakterystyki pojazdu, ale mamy wymienione na tyle, aby zrozumieć, jak klasa w OWP.

    Kiedy używamy tych danych, tworzymy samochód o określonych parametrach. Podczas programowania sam obiekt (samochód), można wziąć inne cechy, jak pokazano w poniższej tabeli:

    Przedmiot 1 Przedmiot 2
    model: Vaz 2107 model: Vaz 2109
    paliwo: benzyna paliwo: olej napędowy
    kolor: czerwony kolor: zielony
    metoda uruchamiania silnika: Start () sposób uruchomienia silnika: Start()
    metoda hamowania: przerwa () metoda hamowania: przerwa ()
    Metoda przyspieszania: Przyspieszenie () Metoda przyspieszania: Przyspieszenie ()

    Zatem programowanie obiektowe ułatwia symulację zachowania złożonego systemu w świecie rzeczywistym. Z danych OOP i funkcji (atrybuty i metody) są połączone w obiekcie. Zapobiega to potrzebom jakichkolwiek ogólnych lub globalnych danych OOP. Podejście to jest główną różnicą między podejściami obiektowymi i proceduralnymi.

    Na klasy OOP składają się elementy różnych typów:

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

    Metody

    Zachowanie klasy lub jej wystąpień określa się za pomocą metod. Jest to podprogram z możliwością obsługi obiektów. Operacje te mogą zmienić status obiektu lub po prostu zapewnić sposoby dostępu do niego.


    & lt; script type = "text /javascript" & gt;
    blockSettings var = {blockID "R-A-70350-45" renderTo "yandex_rtb_R-A-70350-45", asynchroniczny :! 0};
    jeśli (document.cookie.indexOf ("abmatch =") i GT = 0) blockSettings.statId = 70350;
    ! Zastosowanie (a, b, c, d, e) {A [c] = A [c] || [] A [c] .Push (funkcja () {Ya.Context.AdvManager.render (blockSettings)}), e = b.getElementsByTagName ("scenariusz")d = b.createElement ("scenariusz") d.type = "text /JavaScript" d.src = „//an.yandex .ru /System /context.js "d.async = 0e.parentNode.insertBefore (d, e)} (to this.document," yandexContextAsyncCallbacks „);

    Istnieje wiele metod. Ich wsparcie zależy od języka. Niektóre są tworzone i wywoływane przez kod programisty, inne (specjalne, takie jak konstruktory,destruktory i operatory konwersji) są tworzone i wywoływane przez wygenerowany kod kompilatora. Język może pozwolić programistowi na zdefiniowanie tych specjalnych metod.

    Interfejs

    Jest to definicja grupy działań abstrakcyjnych. Dowiaduje się, jakie zachowanie powinien wyświetlać dany obiekt, bez określania sposobu jego implementacji.

    Obiekt może mieć wiele ról, a użytkownicy mogą go używać z różnych punktów widzenia. Na przykład obiekt typu "człowiek" może odgrywać rolę:

    • Żołnierz (z zachowaniem "strzelaj do wroga").
    • Mężczyzna (z zachowaniem "kochaj swoją żonę").
    • Podatnik (z zachowaniem "płacenia podatków") i tak dalej.

    Jednak każdy obiekt realizuje swoje zachowanie na swój własny sposób: Misha płaci podatki na czas, Andrew z opóźnieniem, a Peter nie robi tego w ogóle. To samo można powiedzieć o każdym przedmiocie i innych rolach.

    Powstaje pytanie, dlaczego klasa bazowa wszystkich obiektów nie jest interfejsem. Powodem jest to, że w tym przypadku każda klasa będzie musiała wdrożyć małą, ale bardzo ważną grupę metod, która zajmie niepotrzebne ilości czasu. Okazuje się, że nie wszystkie klasy wymagają konkretnej implementacji - domyślnie domyślnie w większości przypadków wystarczy. Nie ma potrzeby ignorowania jakichkolwiek metod, ale jeśli sytuacja tego wymaga, możliwe jest wdrożenie ich zastąpienia.

    Dobrym przykładem są przyciski z przodu telewizora. Można powiedzieć, że są one interfejsem między użytkownikiem a okablowaniem po drugiej stronie obudowy urządzenia.Osoba klika przycisk zasilania, aby włączyć i wyłączyć urządzenie. W tym przykładzie konkretny telewizor jest instancją, każda metoda reprezentowana przez przycisk, a wszystkie razem tworzą interfejs. W najpowszechniejszej formie jest to specyfikacja grupy powiązanych metod bez ich implementacji.

    Projektant

    Kryterium to jest odpowiedzialne za przygotowanie obiektu do działania, na przykład do ustawienia wartości początkowych dla wszystkich jego danych i ich elementów. Chociaż odgrywa on szczególną rolę, konstruktor jest po prostu kolejną funkcją, która pozwala przekazywać informacje poprzez listę argumentów. Możesz ich użyć do zainicjowania ich. Nazwisko projektanta klasy jest takie samo.

    W poniższym przykładzie wyjaśniono pojęcie konstruktora klasy w C ++ (wspólny język programowania):

    #include
    using namespace std;

    wiersz klasy {
    publiczny:
    void setLength (double len);
    double getLength (void);
    Linia (); //Deklaracja projektanta
    prywatna: podwójna długość;
    };


    //Definicja funkcji, w tym konstruktor

    Linia :: Linia (void) {
    cout "Object created" endl;
    }

    void Line :: setLength (double len) {
    length = len;
    }

    double Line :: getLength (void) {
    return length;
    }

    //Treść programu

    int main () {
    Linia prosta;

    //Długość linii

    line.setLength (6.0);
    cout "Length of line:" line.getLength () endl;
    return 0;
    }

    Po skompilowaniu i wykonaniu powyższego kodu otrzymuje następujący wynik:

    Obiekt utworzony

    Długość linii: 6

    Destruktor

    Jest to specjalna funkcja klasy, która niszczy obiekt jakotylko obszar jego działania się kończy. Destruktor przez kompilator jest wywoływany automatycznie, gdy obiekt jest poza zasięgiem wzroku.

    Składnia destruktora jest taka sama jak dla projektanta, ale nazwa klasy stosowanej w tym przypadku dla niego znak tyldy „~” jako przedrostek.

    Następujący przykład w języku C ++ destructor wyjaśnia koncepcję:

    # include
    za pomocą namespace std;

    wiersz klasy {
    publiczny: void setLength (double len);
    double getLength (void);
    Linia (); //Adnotacje projektanta
    ~ Linia (); //Ogłoszenie Destroyer
    prywatne: podwójna długość;
    }

    //Definicja funkcji, oraz z konstrukcją

    Linia :: linii (void) {
    Cout "utworzonego obiektu" endl;
    }

    Line :: ~ Line (void) {
    cout "Obiekt jest zdalny" endl;
    }

    void Line :: setLength (double len) {
    length = len;
    }

    podwójna linia :: getLength (void) {
    długość powrotu;
    }

    //Ciało programu

    int main () {
    Linia prosta;

    //Długość linii

    line.setLength (6.0);
    cout "Length of line:" line.getLength () endl;
    return 0;

    }
    ,

    , podczas stosowania powyższego kompilacji kodu i wykonany, to daje następujące wyniki:

    przeznaczony ustalone [193 ]

    Długość linii: 6

    odległy obiekt

    , jakie są zalety klas

    korzyści z organizowania programu w klasach o ' obiekty są podzielone na trzy kategorie:
  • Szybki rozwój.
  • Łatwa konserwacja.
  • Ponowne użycie kodu i projektu.
  • Klasy i OWP generalnie przyczyniają się do szybkiego rozwoju, ponieważ zmniejszają różnicę semantyczną między kodem a użytkownikami. Wartooceniane przez wielu programistów. Dzięki temu systemowi analitycy mogą komunikować się z programistami i użytkownikami za pomocą tego samego słownika, mówiąc o kontach, klientach, kontach itd. Klasy obiektów często przyczyniają się do szybkiego rozwoju, ponieważ większość środowisk zorientowanych obiektowo ma rozbudowane narzędzia do debugowania i testowania. Instancje klasy można sprawdzić podczas wykonywania, aby upewnić się, że system działa poprawnie. Ponadto, zamiast pobierania zrzutu jądra, większość środowisk zorientowanych obiektowo interpretuje możliwości debugowania. W rezultacie programiści mogą dokładnie przeanalizować miejsce wystąpienia błędu w programie i sprawdzić, jakie metody, argumenty i wartości zostały użyte.

    Powiązane publikacje