W tym artykule opiszę, czym jest programowanie obiektowe, jakie są różnice między programowaniem strukturalnym oraz czy rzeczywiście jest „lepsze” od strukturalnego.

Najpierw zacznijmy od definicji. Pozwolę sobie zacytować najlepszą przyjaciółkę uczniów i studentów, jaką jest „ciocia” Wikipedia:

Programowanie obiektowe (ang. object-oriented programming, OOP) – paradygmat programowania, w którym programy definiuje się za pomocą obiektów – elementów łączących stan (czyli dane, nazywane najczęściej polami) i zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań.​<span class="su-quote-cite">Wikipedia</span>

Ok, „fachową” definicję mamy za sobą, tylko nie wiem jak Wy, drodzy czytelnicy, ale ja nie przepadam za tak „fachowymi”, typowo książkowymi definicjami i wolę, gdy coś jest rozłożone na czynniki pierwsze i jednocześnie wyjaśnione w prosty i przystępny sposób bez zbędnego lania wody.

Tak też zrobię w tym artykule … a przynajmniej się postaram

Czym zatem jest programowanie obiektowe?

Przede wszystkim zacznijmy od tego, że programowanie obiektowe opiera się na strukturalnym. A czym jest programowanie strukturalne? Już wyjaśniam.

O programowaniu strukturalnym, czyli kiedyś to się programowało...

Dawno, dawno temu… kiedy języki programowania dopiero raczkowały, programiści niespecjalnie przywiązywali uwagę na jakość kodu, a zwłaszcza na jego wygląd. Przede wszystkim dlatego, że nie było takiej potrzeby, skoro programy były na tyle krótkie, iż wystarczyła jedna kartka, aby pomieścić taki kod.

Galopujący postęp technologiczny wymuszał na programistach pisanie coraz to bardziej zawiłego kodu i zarazem dłuższych programów. W związku z tym powstawał tzw. spaghetti code, czyli kod zabałaganiony i tak poplątany, że ciężko czegokolwiek się w nim doszukać, przed którym przestrzegani są współcześni programiści, zwłaszcza ci początkujący.Takie zjawisko można było zaobserwować już w latach 50. XX wieku.

Programowanie strukturalne było pierwszą próbą nadania struktury coraz większym programom. Założeniem programowania strukturalnego jest dzielenie kodu programu za pomocą struktur kontrolnych na procedury i bloki.

W programie strukturalnym znajdują się hierarchicznie zorganizowane proste struktury przepływu programu, do których należą:

  • Sekwencja – kolejność instrukcji
  • Selekcja – wybranie instrukcji z zestawu instrukcji bazując na bieżącym stanie programu (np. użycie instrukcji warunkowej if)
  • Powtarzanie – powtarzanie czynności aż do osiągnięcia określonego stanu (np. pętla for, while, do… while itp.)
Przykład programu strukturalnego w języku C++

Wróćmy do programowania obiektowego

Jak już wspomniałem, programowanie obiektowe opiera się na strukturalnym, a dokładniej jest typem programowania strukturalnego.

Tutaj mamy do czynienia z takimi pojęciami, jak klasa i obiekt. Programista, który chce napisać program obiektowy rozpatruje rozwiązanie koderskiego problemu w kategoriach elementów świata rzeczywistego. Problem ten jest reprezentowany jako obiekty i ich zachowania.

Klasa jest pewnego rodzaju szablonem lub planem. Myślę, że można nawet użyć słowa „kategoria”, o czym pisze w swojej książce Alex Alain (którą przy okazji polecam osobom zaczynającym przygodę z językiem C++ ):

Możesz uważać, że słowo „klasa” ma podobne znaczenie do słowa „kategoria”. Kiedy definiujesz klasę, tworzysz całkowicie nową kategorię lub rzecz.<span class="su-quote-cite">Alex Alain, „C++. Przewodnik dla początkujących”</span>

Klasy posiadają właściwości zwane atrybutami, które implementuje się jako zmienne globalne i zmienne instancji.

W klasach można znaleźć także funkcje zwane metodami, które obrazują zachowanie danych klas.

Czym zatem jest obiekt? Obiekt to instancja danej klasy.

To tyle z teorii. Przejdźmy teraz do praktycznego przykładu, gdyż nic tak dobrze się nie utrwala w pamięci, jak przedstawienie danego zagadnienia na przykładzie.

Klasa i obiekt - przykład

class Zwierze
{
    string imie;
    int wiek;
    string dzwiek;
    
public:
    void nadajImie(string imie);
    void ustalWiek(int wiek);
    void ustalJakiDzwiekWydajeZwierze(string dzwiek);
    string pokazImie();
    int pokazWiek();
    void dajGlos();
} 

Powyższy kod jest przykładem deklarowania klasy w C++. Zmienne w klasie „Zwierze” są atrybutami, natomiast funkcje znajdujące się pod nimi to metody.

Utwórzmy teraz instancję, czyli obiekt danej klasy i wywołajmy parę metod.

Zwierze kot;
kot.nadajImie("Gizmo");

cout << "Moj kot ma na imie " << kot.pokazImie() << endl;

kot.ustalJakiDzwiekWydajeZwierze("Miau!");
cout << kot.pokazImie() << ", daj glos" << endl;
cout << kot.pokazImie() << ": "; 
kot.dajGlos(); 

Jak widać na powyższym prostym przykładzie, „kot” jest obiektem klasy „Zwierze”. Wywołane metody, jak mówi definicja, są reprezentowane lub definiowane przez zachowanie klasy. No i to by się zgadzało w tym przypadku.

Metody „pokazImie” oraz „nadajImie” są przykładami tzw. getterów i setterów, o których będziecie mogli przeczytać w artykule o dobrych praktykach w programowaniu obiektowym. Tam poruszę takie tematy, jak abstrakcja, hermetyzacja (czy jak, kto woli enkapsulacja), polimorfizm i dziedziczenie, które należą do charakterystycznych cech programowania zorientowanego obiektowo.

Programowanie strukturalne i obiektowe - różnice

Podstawową różnicą między programowaniem strukturalnym a OOP jest to, że w tym pierwszym skupia się na ułożeniu w hierarchię podprogramów, natomiast w drugim podejściu, zadanie programistyczne rozbija się na obiekty zawierające dane i metody.

Pozostałe różnice przedstawię w poniższej tabeli

Programowanie strukturalne Programowanie obiektowe
Dzieli program na strukturę programu w hierarchii Dzieli program na sieć podsystemów
Podejście top down (z góry na dół). Programista kładzie nacisk przede wszystkim na pisaniu funkcji. Programy budowane są od dołu, początkowo od małych elementów, które składa się w całość. Programista kładzie nacisk na tworzenie klas i obiektów.
Niewielka zmiana w bardzo dużym programie strukturalnym może powodować konieczność zmiany wielu podprogramów Lepsza czytelność kodu przy większych programach i łatwiejsza edycja programu, automatyzacja tego, co równie dobrze można napisać strukturalnie

Które programowanie jest lepsze?

Na to pytanie nie ma jednoznacznej odpowiedzi. Wszystko zależy od tego, co chcemy osiągnąć pisząc dany program i jak bardzo ma być rozbudowany. Kolejnym kryterium jest „skill”, czyli umiejętności programisty. Stanowczo odradzam osobom stawiającym pierwsze kroki w programowaniu zaczynanie od programowania obiektowego! Ze względu na prostotę, paradygmat strukturalny jest moim zdaniem zdecydowanie lepszy dla kompletnych żółtodziobów.

Podsumowanie

Pojawienie się programowania strukturalnego znacznie ułatwiło pisanie i czytelność kodu, jednak wraz z powstaniem paradygmatu obiektowego kod stawał się jeszcze łatwiejszy do uporządkowania i wielokrotnej edycji. Pisząc programy obiektowo nie sposób uniknąć elementów strukturalnych, gdyż oba paradygmaty ze sobą koegzystują i wzajemnie się uzupełniają. W niektórych zadaniach programistycznych, zwłaszcza tych mniej złożonych, programowanie strukturalne może być bardziej przydatne niż obiektowe, jednak  nie można jednoznacznie stwierdzić, że jedno jest zawsze lepsze od drugiego.


0 komentarzy

Dodaj komentarz

Avatar placeholder

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *