З вашого блогу, здається, ви знайомі як з імперативними, так і з функціональними програмами, і що ви ознайомилися з основними поняттями, що беруть участь в об'єктно-орієнтованому програмуванні, але ви просто ніколи насправді не мали "натиснути" на те, що робить його корисним. Я спробую пояснити з точки зору цих знань і сподіваюся, що це вам корисно.
По суті, OOP - це спосіб використовувати імперативну парадигму для кращого управління високими ступенями складності, створюючи «розумні» структури даних, що моделюють проблемну область. У (стандартній процедурній, не орієнтованій на об'єкт) програмі у вас є дві основні речі: змінні та код, який знає, що з ними робити. Код приймає дані від користувача та різних інших джерел, зберігає його у змінних, оперує ним і виробляє вихідні дані, які надходять до користувача або різних інших локацій.
Об'єктно-орієнтоване програмування - це спосіб спростити свою програму, взявши цей основний зразок і повторивши його в меншому масштабі. Так само, як програма - це велика колекція даних з кодом, яка знає, що з нею робити, кожен об'єкт - це невеликий фрагмент даних, прив’язаний до коду, який знає, що з ним робити.
Розбивши проблемний домен на більш дрібні фрагменти і переконавшись, що якомога більше даних прив’язане безпосередньо до коду, який знає, що з ним робити, ви набагато простіше міркувати про процес в цілому, а також про підрозділ, питання, що складають процес.
Групуючи дані в об’єктні класи, ви можете централізувати код, пов’язаний з цими даними, полегшивши пошук і налагодження відповідного коду. І, капсулюючи дані за специфікаторами доступу та отримуючи доступ до них лише методами (або властивостями, якщо ваша мова їх підтримує), ви значно знижуєте потенціал для пошкодження даних або порушення інваріантів.
І, використовуючи успадкування та поліморфізм, ви можете повторно використовувати наявні класи, налаштовуючи їх під ваші конкретні потреби, не змінюючи оригінали або переписувати все з нуля. (Що таке річ, якої ви ніколи не повинні робити , якщо зможете цього уникнути.) Будьте обережні, розуміючи свій базовий об'єкт, інакше ви можете опинитися у кенгуру-вбивці .
Для мене це основні принципи об'єктно-орієнтованого програмування: управління складністю, централізація коду та вдосконалене моделювання проблемних доменів шляхом створення об’єктних класів, успадкування та поліморфізму та підвищення безпеки без шкоди владі чи контролю за допомогою інкапсуляції та властивості. Сподіваюся, це допоможе вам зрозуміти, чому стільки програмістів вважають це корисним.
EDIT: У відповідь на запитання Джоела в коментарях,
Чи можете ви пояснити, що містить "об'єктно-орієнтована програма" (крім цих фантазійних визначень, які ви окреслили), що принципово відрізняється від імперативної програми? Як ви "змушуєте котитися кульки?"
Трохи відмови тут. Моя модель "об'єктно-орієнтованої програми" - це в основному модель Delphi, яка дуже схожа на модель C # /. NET, оскільки їх створили колишні члени команди Delphi. Те, що я тут кажу, може не застосовуватись або не застосовуватись в інших мовах ОО.
Об'єктно-орієнтована програма - це та, в якій вся логіка структурована навколо об'єктів. Звичайно, це треба кудись завантажувати. Ваша типова програма Delphi містить код ініціалізації, який створює одиночний об'єкт, який називається Application
. На початку програми він дзвонить Application.Initialize
, потім дзвінок до Application.CreateForm
кожної форми, яку ви бажаєте завантажити з пам'яті спочатку, а потім, Application.Run,
яка відображає основну форму на екрані, і запускає цикл введення / події, що утворює ядро будь-якої інтерактивні комп’ютерні програми.
Додаток та ваші форми опитують на вхідні події з ОС та переводять їх у виклики методів на ваш об'єкт. Одне, що дуже часто зустрічається - це використання обробників подій або "делегатів" у .NET-говорінні. Об'єкт має метод, який говорить: "зробіть X і Y, але також перевірте, чи призначений цей обробник подій, і зателефонуйте, якщо він є". Обробник подій - це покажчик методу - дуже просте закриття, яке містить посилання на метод та посилання на екземпляр об'єкта - що використовується для розширення поведінки об'єктів. Наприклад, якщо у мене є об’єкт кнопки у моїй формі, я налаштовую її поведінку, додаючи обробник подій OnClick, який призводить до того, що якийсь інший об'єкт виконує метод при натисканні кнопки.
Таким чином, в об'єктно-орієнтованій програмі більшість робіт виконується шляхом визначення об'єктів з певними обов'язками та з'єднання їх між собою, або через покажчики методів, або через один об'єкт, безпосередньо викликаючи метод, визначений у загальнодоступному інтерфейсі іншого об'єкта. (А тепер ми повернулися до інкапсуляції.) Це ідея, яку я не мав поняття назад до того, як я взяв заняття OOP в коледжі.