Из вашего блога кажется, что вы знакомы как с императивным, так и с функциональным программированием, и что вы знакомы с основными понятиями, связанными с объектно-ориентированным программированием, но у вас просто никогда не было этого «щелчка» относительно того, что делает это полезным. Я постараюсь объяснить с точки зрения этих знаний, и надеюсь, что это полезно для вас.
По своей сути ООП - это способ использования императивной парадигмы для лучшего управления высокой степенью сложности путем создания «умных» структур данных, которые моделируют проблемную область. В (стандартной процедурной не объектно-ориентированной) программе у вас есть две основные вещи: переменные и код, который знает, что с ними делать. Код принимает входные данные от пользователя и различных других источников, сохраняет их в переменных, обрабатывает их и создает выходные данные, которые отправляются пользователю или в различные другие местоположения.
Объектно-ориентированное программирование - это способ упростить вашу программу, взяв этот базовый шаблон и повторяя его в меньшем масштабе. Так же, как программа представляет собой большой набор данных с кодом, который знает, что с ним делать, каждый объект представляет собой небольшой фрагмент данных, привязанный к коду, который знает, что с ним делать.
Разбивая проблемную область на более мелкие части и следя за тем, чтобы как можно больше данных было напрямую связано с кодом, который знает, что с ним делать, вы значительно облегчаете рассуждения о процессе в целом, а также о подзадаче. вопросы, которые составляют процесс.
Группируя данные в классы объектов, вы можете централизовать код, связанный с этими данными, упрощая поиск и отладку соответствующего кода. А инкапсулируя данные за спецификаторами доступа и обращаясь к ним только через методы (или свойства, если ваш язык их поддерживает), вы значительно уменьшаете вероятность повреждения данных или нарушения инвариантов.
А используя наследование и полиморфизм, вы можете повторно использовать существующие классы, настраивая их в соответствии с вашими потребностями, без необходимости изменять оригиналы или переписывать все с нуля. (Это то, что вы никогда не должны делать , если можете избежать этого.) Просто будьте осторожны, вы понимаете свой базовый объект, иначе вы можете получить убийственные кенгуру .
Для меня это фундаментальные принципы объектно-ориентированного программирования: управление сложностью, централизация кода и улучшенное моделирование проблемной области посредством создания классов объектов, наследования и полиморфизма, а также повышение безопасности без ущерба для мощности или контроля за счет использования инкапсуляции и свойства. Я надеюсь, что это поможет вам понять, почему так много программистов считают это полезным.
РЕДАКТИРОВАТЬ: В ответ на вопрос Джоэля в комментариях,
Можете ли вы объяснить, что содержит «объектно-ориентированная программа» (кроме этих причудливых определений, которые вы наметили), которая принципиально отличается от императивной программы? Как ты "получаешь мяч?"
Небольшой отказ от ответственности здесь. Моя модель «объектно-ориентированной программы» - это в основном модель Delphi, которая очень похожа на модель C # / .NET, так как они были созданы бывшими членами команды Delphi. То, что я здесь говорю, может не применяться или не применяться так же на других ОО-языках.
Объектно-ориентированная программа - это программа, в которой вся логика структурирована вокруг объектов. Конечно, это должно быть где-то загружено. Ваша типичная Delphi-программа содержит код инициализации, который создает одноэлементный объект с именем Application
. В начале программы она вызывает Application.Initialize
, затем вызывает Application.CreateForm
для каждой формы, которую вы хотите загрузить в память с самого начала, а затем Application.Run,
которая отображает основную форму на экране и запускает цикл ввода-вывода, который формирует ядро любого интерактивные компьютерные программы.
Приложение и ваши формы опрашивают входящие события из ОС и переводят их в вызовы методов вашего объекта. Одна вещь, которая очень распространена, - это использование обработчиков событий или «делегатов» в .NET-говорящих. У объекта есть метод, который говорит: «делайте X и Y, но также проверяйте, назначен ли этот конкретный обработчик события, и вызывайте его, если он есть». Обработчик событий - это указатель на метод - очень простое замыкание, которое содержит ссылку на метод и ссылку на экземпляр объекта - которое используется для расширения поведения объектов. Например, если у меня есть объект кнопки в моей форме, я настраиваю его поведение, подключая обработчик события OnClick, который заставляет некоторый другой объект выполнять метод при нажатии кнопки.
Таким образом, в объектно-ориентированной программе большая часть работы выполняется путем определения объектов с определенными обязанностями и связывания их вместе либо с помощью указателей на методы, либо с помощью одного объекта, напрямую вызывающего метод, определенный в открытом интерфейсе другого объекта. (И теперь мы вернулись к инкапсуляции.) Это идея, о которой я понятия не имел до того, как начал посещать уроки ООП в колледже.