Z twojego bloga wygląda na to, że znasz zarówno programowanie imperatywne, jak i funkcjonalne oraz że znasz podstawowe pojęcia związane z programowaniem obiektowym, ale tak naprawdę nigdy tak naprawdę nie klikałeś tego, co czyni to użytecznym. Spróbuję wyjaśnić tę wiedzę i mam nadzieję, że będzie ona dla ciebie pomocna.
U podstaw OOP jest sposób na zastosowanie imperatywnego paradygmatu, aby lepiej zarządzać wysokim stopniem złożoności poprzez tworzenie „inteligentnych” struktur danych, które modelują dziedzinę problemową. W (standardowym proceduralnym, nieobiektywowym) programie masz dwie podstawowe rzeczy: zmienne i kod, który wie, co z nimi zrobić. Kod pobiera dane wejściowe od użytkownika i różnych innych źródeł, przechowuje je w zmiennych, operuje na nim i generuje dane wyjściowe, które trafiają do użytkownika lub różnych innych lokalizacji.
Programowanie obiektowe jest sposobem na uproszczenie programu, biorąc ten podstawowy wzorzec i powtarzając go na mniejszą skalę. Podobnie jak program to duży zbiór danych z kodem, który wie, co z nim zrobić, każdy obiekt to niewielki kawałek danych powiązany z kodem, który wie, co z nim zrobić.
Dzieląc problematyczną domenę na mniejsze części i upewniając się, że jak najwięcej danych jest związanych bezpośrednio z kodem, który wie, co z nim zrobić, znacznie ułatwiasz rozumowanie całego procesu, a także podrzędnych problemy, które składają się na proces.
Grupując dane w klasy obiektów, można scentralizować kod związany z tymi danymi, co ułatwia znajdowanie i debugowanie odpowiedniego kodu. A poprzez enkapsulację danych za specyfikatorami dostępu i dostęp do nich jedynie metodami (lub właściwościami, jeśli obsługuje je Twój język), znacznie zmniejszasz ryzyko uszkodzenia danych lub naruszenia niezmienników.
A dzięki dziedziczeniu i polimorfizmowi można ponownie wykorzystać istniejące klasy, dostosowując je do własnych potrzeb, bez konieczności modyfikowania oryginałów lub przepisywania wszystkiego od podstaw. (Co jest rzeczą, której nigdy nie powinieneś robić , jeśli możesz tego uniknąć.) Bądź ostrożny, rozumiesz swój podstawowy obiekt, bo możesz skończyć z zabójczymi kangurami .
Dla mnie są to podstawowe zasady programowania obiektowego: zarządzanie złożonością, centralizacja kodu i ulepszone modelowanie domen problemowych poprzez tworzenie klas obiektów, dziedziczenie i polimorfizm oraz zwiększone bezpieczeństwo bez poświęcania mocy lub kontroli poprzez zastosowanie enkapsulacji i nieruchomości. Mam nadzieję, że to pomoże ci zrozumieć, dlaczego tak wielu programistów uważa to za przydatne.
EDYCJA: W odpowiedzi na pytanie Joela w komentarzach,
Czy potrafisz wyjaśnić, co zawiera „program obiektowy” (oprócz tych wymyślonych przez ciebie definicji), który zasadniczo różni się od programu imperatywnego? Jak „wprawić piłkę w ruch”?
Małe zastrzeżenie tutaj. Mój model „programu obiektowego” to w zasadzie model Delphi, który jest bardzo podobny do modelu C # / .NET, ponieważ zostały one utworzone przez byłych członków zespołu Delphi. To, co tu mówię, może nie mieć zastosowania lub nie dotyczyć tak dużo w innych językach OO.
Program zorientowany obiektowo to taki, w którym cała logika jest zorganizowana wokół obiektów. Oczywiście trzeba to gdzieś zabrać ze sobą. Twój typowy program Delphi zawiera kod inicjujący, który tworzy obiekt singleton o nazwie Application
. Na początku programu wywołuje Application.Initialize
, a następnie wezwanie do Application.CreateForm
każdego formularza, który chcesz załadować do pamięci od początku, a następnie Application.Run,
wyświetla główny formularz na ekranie i uruchamia pętlę wejścia / zdarzenia, która tworzy rdzeń dowolnego interaktywne programy komputerowe.
Aplikacja i formularze sprawdzają przychodzące zdarzenia z systemu operacyjnego i tłumaczą je na wywołania metod na obiekcie. Jedną z rzeczy, która jest bardzo powszechna, jest użycie procedur obsługi zdarzeń lub „delegatów” w .NET-speak. Obiekt ma metodę, która mówi: „wykonaj X i Y, ale sprawdź również, czy jest przypisana ta konkretna procedura obsługi zdarzeń, i wywołaj ją, jeśli jest”. Moduł obsługi zdarzeń jest wskaźnikiem metody - bardzo prostym zamknięciem zawierającym odwołanie do metody i odwołanie do instancji obiektu - która służy do przedłużenia zachowania obiektów. Na przykład, jeśli w formularzu mam obiekt przycisku, dostosowuję jego zachowanie, dołączając moduł obsługi zdarzeń OnClick, który powoduje, że jakiś inny obiekt wykonuje metodę po kliknięciu przycisku.
Tak więc w programie zorientowanym obiektowo większość pracy wykonuje się poprzez zdefiniowanie obiektów z pewnymi obowiązkami i połączenie ich ze sobą, albo poprzez wskaźniki metod, albo przez jeden obiekt bezpośrednio wywołujący metodę zdefiniowaną w publicznym interfejsie innego obiektu. (A teraz wracamy do enkapsulacji.) Jest to pomysł, że nie miałem pojęcia powrotu, zanim zacząłem zajęcia OOP na studiach.