Jak spodnie spadochronowe i Pac-Man, OOP (programowanie zorientowane obiektowo) miało swój początek w latach osiemdziesiątych. Ale w przeciwieństwie do modnych mód i postaci z gier wideo, ten model programowania po tylu latach wciąż ma się dobrze.
OOP stało się fundamentalną częścią rozwoju oprogramowania. Dzięki wszechobecności języków takich jak Java i C++, nie można tworzyć oprogramowania na urządzenia mobilne, jeśli nie rozumie się podejścia obiektowego. To samo dotyczy poważnego tworzenia stron internetowych, biorąc pod uwagę popularność języków OOP, takich jak Python, PHP i Ruby.
Zrozumienie idei programowania zorientowanego obiektowo może być wyzwaniem dla niektórych specjalistów IT. Możesz się zastanawiać, dlaczego w ogóle potrzebujesz obiektów, skoro możesz użyć podejścia top-down tradycyjnego programowania strukturalnego w językach takich jak Visual Basic.
Jeśli pisałeś tego rodzaju oprogramowanie, prawdopodobnie jesteś przyzwyczajony do rozbijania dużych problemów na podproblemy i rozwiązywania ich w oddzielnych jednostkach kodu. Możesz też mieć doświadczenie z programowaniem funkcyjnym, które traktuje elementy kodu jak precyzyjne funkcje matematyczne i nie pozwala im wpływać na inne elementy, czyli nie ma efektów ubocznych.
Zajmij się jednak OOP, a zobaczysz, że jest to zupełnie nowy sposób rozwiązywania problemów. Podstawowa koncepcja polega na tym, że zamiast pisać program, tworzysz klasę, która jest rodzajem szablonu zawierającego zmienne i funkcje. Obiekty są samowystarczalnymi instancjami tej klasy i możesz sprawić, by wchodziły ze sobą w interakcje w zabawny i ekscytujący sposób.
Zalety programowania zorientowanego obiektowo leżą w tym rodzaju hermetyzacji. Oto szczegółowe spojrzenie na niektóre z głównych korzyści OOP:
Modularność dla łatwiejszego rozwiązywania problemów
Coś poszło nie tak, a ty nie masz pojęcia, gdzie szukać. Czy problem jest w pliku Widget, czy może w WhaleFlumper? Czy będziesz musiał przebrnąć przez ten plik „sewage.c”? Mam nadzieję, że skomentowałeś swój kod!
Pracując z obiektowymi językami programowania, wiesz dokładnie, gdzie szukać. „O, zepsuł się obiekt samochodu? Problem musi leżeć w klasie Car!”. Nie musisz grzebać w niczym innym.
To jest właśnie piękno enkapsulacji. Obiekty są samowystarczalne, a każdy bit funkcjonalności robi swoje, pozostawiając inne bity w spokoju. Ponadto, ten sposób pozwala zespołowi IT pracować nad wieloma obiektami jednocześnie, minimalizując szansę, że jedna osoba może zduplikować czyjąś funkcjonalność.
Pomożemy Ci znaleźć następną pracę programistyczną:
Wykorzystanie kodu poprzez dziedziczenie
Załóżmy, że oprócz obiektu Samochód, jeden z kolegów potrzebuje obiektu Samochód wyścigowy, a inny obiektu Limuzyna. Każdy buduje swoje obiekty osobno, ale odkrywa między nimi cechy wspólne. W rzeczywistości, każdy obiekt jest tak naprawdę tylko innym rodzajem samochodu. To właśnie tutaj technika dziedziczenia oszczędza czas: Utwórz jedną klasę generyczną (Car), a następnie zdefiniuj podklasy (RaceCar i Limousine), które mają dziedziczyć cechy klasy generycznej.
Oczywiście, Limousine i RaceCar nadal mają swoje unikalne atrybuty i funkcje. Jeśli obiekt RaceCar potrzebuje metody do „fireAfterBurners”, a obiekt Limousine potrzebuje Chauffeur, każda klasa mogłaby zaimplementować oddzielne funkcje tylko dla siebie. Jednakże, ponieważ obie klasy dziedziczą kluczowe aspekty z klasy Car, na przykład metody „drive” lub „fillUpGas”, twoje klasy dziedziczące mogą po prostu ponownie wykorzystać istniejący kod zamiast pisać te funkcje od nowa.
Co jeśli chcesz dokonać zmiany we wszystkich obiektach Car, niezależnie od typu? Jest to kolejna zaleta podejścia OO. Po prostu dokonaj zmiany w klasie Samochód, a wszystkie obiekty samochodów po prostu odziedziczą nowy kod.
Elastyczność dzięki polimorfizmowi
Rozwijając się na tym przykładzie, potrzebujesz teraz tylko kilku sterowników lub funkcji, takich jak „driveCar,” driveRaceCar” i „DriveLimousine”. Kierowcy RaceCarDrivers dzielą niektóre cechy z LimousineDrivers, ale inne rzeczy, jak RaceHelmets i BeverageSponsorships, są unikalne.
To jest miejsce, gdzie słodki polimorfizm programowania obiektowego wchodzi do gry. Ponieważ pojedyncza funkcja może zmieniać kształt, aby dostosować się do każdej klasy, w której się znajduje, możesz stworzyć jedną funkcję w klasie macierzystej Car o nazwie „drive” – nie „driveCar” lub „driveRaceCar,” ale po prostu „drive”. Ta jedna funkcja działałaby z RaceCarDriver, LimousineDriver, itd. W rzeczywistości, mógłbyś nawet mieć „raceCar.drive(myRaceCarDriver)” lub „limo.drive(myChauffeur).”
Efektywne rozwiązywanie problemów
Język taki jak C ma niesamowite dziedzictwo w historii programowania, ale pisanie oprogramowania w języku top-down jest jak granie w Jenga podczas noszenia mitenek. Im bardziej skomplikowany się staje, tym większa szansa, że się zawali. Tymczasem pisanie programu w stylu funkcjonalnym w języku takim jak Haskell lub ML może być uciążliwe.
Programowanie zorientowane obiektowo jest często najbardziej naturalnym i pragmatycznym podejściem, gdy już się go opanuje. Języki OOP pozwalają rozbić oprogramowanie na problemy, które można rozwiązać – jeden obiekt na raz.
Nie oznacza to, że OOP jest jedyną prawdziwą drogą. Jednak zalety programowania zorientowanego obiektowo są liczne. Kiedy musisz rozwiązywać złożone wyzwania programistyczne i chcesz dodać narzędzia kodowe do swojego zestawu umiejętności, OOP jest twoim przyjacielem – i ma znacznie większą trwałość i użyteczność niż Pac-Man czy spodnie spadochronowe.
.