Принципы объектно-ориентированного программирования / Хабр
Привет, Хабр! Меня зовут Владислав Родин. В настоящее время я являюсь руководителем курса «Архитектор высоких нагрузок» в OTUS, а также преподаю на курсах, посвященных архитектуре ПО.
Специально к старту занятий в новом потоке курса «Архитектура и шаблоны проектирования» я подготовил еще один авторский материал.
Введение
Когда речь заходит о классических паттернах проектирования, нельзя не вспомнить о самом объектно-ориентированном программировании. Ведь паттерны GoF являются паттернами именно объектно-ориентированного программирования. В функциональном же программировании есть свои собственные паттерны.
Вообще устроено все следующим образом: есть само объектно-ориентированное программирование. У него есть принципы. Из принципов объектно-ориентированного программирования следуют разобранные нам шаблоны GRASP (как вариант — SOLID принципы), из которых, в свою очередь, следуют шаблоны GoF. Из них же следует ряд интересных вещей, например, enterprise паттерны.
Объектно-ориентированная парадигма
Определение гласит, что «Объектно-ориентированное программирование – это парадигма программирования, в которой основной концепцией является понятие объекта, который отождествляется с предметной областью.»
Таким образом, система представляется в виде набора объектов предметной области, которые взаимодействуют между собой некоторым образом. Каждый объект обладает тремя cоставляющими: идентичность (identity), состояние (state) и поведение (behaviour).
Состояние объекта — это набор всех его полей и их значений.
Поведение объекта — это набор всех методов класса объекта.
Идентичность объекта — это то, что отличает один объект класса от другого объекта класса. С точки зрения Java, именно по идентичности определяется метод equals.
Принципы объектно-ориентированного программирования
Объектно-ориентированное программирование обладает рядом принципов. Представление об их количестве расходится. Кто-то утверждает, что их три (старая школа программистов), кто-то, что их четыре (новая школа программистов):
- Абстрация
- Инкапсуляция
- Наследование
- Полиморфизм
Предлагаю поговорить о них подробнее. Единственное что — я предлагаю не рассматривать абстракцию, потому как отношу себя к старой школе программистов.
Инкапсуляция
Вопреки мнению многих собеседующихся (а иногда и собеседуемых), инкапсуляция это не «когда все поля приватные». Инкапсуляция является фундаментальнейшим принципом проектирования ПО, ее следы наблюдаются на только на уровне микро-, но и на уровне макропроектирования.
Научное определение гласит, что «Инкапсуляция – это принцип, согласно которому любой класс и в более широком смысле – любая часть системы должны рассматриваться как «черный ящик»: пользователь класса или подсистемы должен видеть только интерфейс (т. е. список декларируемых свойств и методов) и не вникать во внутреннюю реализацию.»
Таким образом, получается, что если класс A обращается к полям класса B напрямую, это приводит не к тому, что «нарушается информационная безопасность», а к тому, что класс A завязывается на внутренне устройство класса B, и попытка изменить внутреннее устройство класса B приведет к изменению класса А. Более того, класс A не просто так работает с полями класса B, он работает по некоторой бизнес-логике. То есть логика по работе с состоянием класса В лежит в классе А, и когда мы захотим переиспользовать класс В, это не удастся сделать, ведь без кусочка класса А класс В может быть бесполезным, что приведет к тому, что класс В придется отдавать вместе с классом А. Экстраполируя это на всю систему, получается, что переиспользовать можно будет только всю систему целиком.
Инкапсуляция является самым недооцененным принципом, который, к сожалению, мало кем интерпретируется правильно. Она позволяет минимизировать число связей между классами и подсистемами и, соответственно, упростить независимую реализацию и модификацию классов и подсистем.
Наследование
Наследование — это возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (суперкласса), добавляя при необходимости новые свойства и
методы.
Наследование является самым переоцененным принципом. Когда-то считалось, что «У идеального программиста дерево наследования уходит в бесконечность и заканчивается абсолютно пустым объектом», потому как когда-то люди не очень хорошо понимали то, что наследование — это способ выразить такое свойство реального мира как иерархичность, а не способ переиспользовать код, отнаследовав машину от холодильника, потому что у обоих предметов есть ручка. Наследования желательно по возможности избегать, потому что наследование является очень сильной связью. Для уменьшения количества уровней наследования рекомендуется строить дерево «снизу-вверх».
Полиморфизм
Полиморфизм — это возможность использовать классы – потомки в контексте, который был предназначен для класса – предка.
За самым садистским определением кроется возможность языка программирования для декомпозиции задачи и рефакторинга if’ов и switch’ей.
Руководство C# | Основы объектно-ориентированного программирования
99
C# — Руководство по C# — Основы объектно-ориентированного программирования
Все основанные на объектах языки (C#, Java, С++, Smalltalk, Visual Basic и т.п.) должны отвечать трем основным принципам объектно-ориентированного программирования (ООП), которые перечислены ниже:
- Инкапсуляция
-
Как данный язык скрывает детали внутренней реализации объектов и предохраняет целостность данных?
- Наследование
Как данный язык стимулирует многократное использование кода?
- Полиморфизм
Как данный язык позволяет трактовать связанные объекты сходным образом?
Прежде чем погрузиться в синтаксические детали реализации каждого принципа, важно понять базовую роль каждого из них.
Роль инкапсуляции
Инкапсуляция — это механизм программирования, объединяющий вместе код
и данные, которыми он манипулирует, исключая как вмешательство извне, так и неправильное использование данных. В объектно-ориентированном языке данные и код
могут быть объединены в совершенно автономный черный ящик. Внутри такого ящика
находятся все необходимые данные и код. Когда код и данные связываются вместе подобным образом, создается объект. Иными словами,
Т.е. инкапсуляция представляет собой способности языка скрывать излишние детали реализации от пользователя объекта. Например, предположим, что используется класс по имени DatabaseReader, который имеет два главных метода: Open() и Close().
Фиктивный класс DatabaseReader инкапсулирует внутренние детали нахождения, загрузки, манипуляций и закрытия файла данных. Программистам нравится инкапсуляция, поскольку этот принцип ООП упрощает кодирование. Нет необходимости беспокоиться о многочисленных строках кода, которые работают «за кулисами», чтобы реализовать функционирование класса DatabaseReader. Все, что потребуется — это создать экземпляр и отправлять ему соответствующие сообщения (например, «открыть файл по имени AutoLot.mdf, расположенный на диске С:»).
С идеей инкапсуляции программной логики тесно связана идея защиты данных. В идеале данные состояния объекта должны быть специфицированы с использованием ключевого слова private (или, возможно, protected). Таким образом, внешний мир должен вежливо попросить, если захочет изменить или получить лежащее в основе значение. Это хороший принцип, поскольку общедоступные элементы данных можно легко повредить (даже нечаянно, а не преднамеренно).
Основной единицей инкапсуляции в C# является класс, который определяет форму объекта. Он описывает данные, а также код, который будет ими оперировать. В C# описание класса служит для построения объектов, которые являются экземплярами класса. Следовательно, класс, по существу, представляет собой ряд схематических описаний способа построения объекта.
Код и данные, составляющие вместе класс, называют членами. Данные, определяемые классом, называют полями, или переменными экземпляра. А код, оперирующий данными, содержится в функциях-членах, самым типичным представителем которых является метод. В C# метод служит в качестве аналога подпрограммы. (К числу других функций-членов относятся свойства, события и конструкторы.) Таким образом, методы класса содержат код, воздействующий на поля, определяемые этим классом.
Роль наследования
Следующий принцип ООП — наследование — касается способности языка позволять строить новые определения классов на основе определений существующих классов. По сути, наследование позволяет расширять поведение базового (или родительского) класса, наследуя основную функциональность в производном подклассе (также именуемом дочерним классом):
Т. е. наследование представляет собой процесс, в ходе которого один объект приобретает свойства другого объекта. Это очень важный процесс, поскольку он обеспечивает принцип иерархической классификации. Если вдуматься, то большая часть знаний поддается систематизации благодаря иерархической классификации по нисходящей.
Если не пользоваться иерархиями, то для каждого объекта пришлось бы явно определять все его свойства. А если воспользоваться наследованием, то достаточно определить лишь те свойства, которые делают объект особенным в его классе. Он может также наследовать общие свойства своего родителя. Следовательно, благодаря механизму наследования один объект становится отдельным экземпляром более общего класса.
Роль полиморфизма
Последний принцип ООП — полиморфизм. Он обозначает способность языка трактовать связанные объекты в сходной манере. В частности, этот принцип ООП позволяет базовому классу определять набор членов (формально называемый
По сути, виртуальный член — это член базового класса, определяющий реализацию по умолчанию, которая может быть изменена (или, говоря более формально, переопределена) в производном классе. В отличие от него, абстрактный метод — это член базового класса, который не предусматривает реализации по умолчанию, а предлагает только сигнатуру. Когда класс наследуется от базового класса, определяющего абстрактный метод, этот метод обязательно должен быть переопределен в производном классе. В любом случае, когда производные классы переопределяют члены, определенные в базовом классе, они по существу переопределяют свою реакцию на один и тот же запрос.
Рассмотрим для примера стек, т.е. область памяти, функционирующую по принципу «последним пришел — первым обслужен». Допустим, что в программе требуются три разных типа стеков: один — для целых значений, другой — для значений с плавающей точкой, третий — для символьных значений. В данном примере алгоритм, реализующий все эти стеки, остается неизменным, несмотря на то, что в них сохраняются разнотипные данные. В языке, не являющемся объектно-ориентированным, для этой цели пришлось бы создать три разных набора стековых подпрограмм с разными именами. Но благодаря полиморфизму для реализации всех трех типов стеков в C# достаточно создать лишь один общий набор подпрограмм. Зная, как пользоваться одним стеком, вы сумеете воспользоваться и остальными.
В более общем смысле понятие полиморфизма нередко выражается следующим образом: «один интерфейс — множество методов«. Это означает, что для группы взаимосвязанных действий можно разработать общий интерфейс. Полиморфизм помогает упростить программу, позволяя использовать один и тот же интерфейс для описания общего класса действий. Выбрать конкретное действие (т.е. метод) в каждом отдельном случае — это задача компилятора. Программисту не нужно делать это самому. Ему достаточно запомнить и правильно использовать общий интерфейс.
404: Страница не найдена
Архитектура приложенияСтраница, которую вы пытались открыть по этому адресу, похоже, не существует. Обычно это результат плохой или устаревшей ссылки. Мы приносим свои извинения за доставленные неудобства.
Что я могу сделать сейчас?
Если вы впервые посещаете TechTarget, добро пожаловать! Извините за обстоятельства, при которых мы встречаемся. Вот куда вы можете пойти отсюда:
Поиск- Узнайте последние новости.
- Наша домашняя страница содержит последнюю информацию об архитектуре приложений.
- Наша страница «О нас» содержит дополнительную информацию о сайте, на котором вы находитесь, «Архитектура приложений».
- Если вам нужно, свяжитесь с нами, мы будем рады услышать от вас.
Просмотр по категории
Качество ПО
- Microsoft предлагает руководство для разработчиков по экологичным программным инструментам
Microsoft, UBS и другие поддерживают использование разработчиками инструментов с открытым исходным кодом, учитывающих выбросы углерода. Два тематических исследования — одно предприятие и одно …
- 3 цели разработчика программного обеспечения, которые важнее всего в 2023 году
Как и многие люди, профессионалы в области программного обеспечения имеют свои собственные цели на 2023 год, включая акцент на управлении проектами, программном обеспечении…
- Эксперты оценивают языки программирования для начинающих в 2023 году
По мнению экспертов-разработчиков, Python и JavaScript — два выдающихся продукта для новичков. А вот начинающим кодерам стоит разнообразить свои…
Облачные вычисления
- Последний Google Cloud AI проливает свет на автоматизацию розничной торговли
Автоматизированные системы отслеживания запасов на базе искусственного интеллекта не идеальны. Однако ритейлерам с высокими показателями упущенных продаж не хватает…
- Как настроить автомасштабирование в службе Azure Kubernetes
Изучите параметры масштабирования в AKS, такие как горизонтальный модуль и средство автомасштабирования кластера. Затем следуйте пошаговому руководству по …
- Варианты IaaS и PaaS на AWS, Azure и Google Cloud Platform
Хотите перенести рабочие нагрузки вашей организации в облако? Узнайте о преимуществах и недостатках вариантов IaaS и PaaS…
TheServerSide.com
- Кто должен быть владельцем продукта в Scrum?
Кто должен быть владельцем продукта Scrum и как организация выбирает подходящего человека для этой работы? Это не просто…
- Советы и рекомендации по программированию на TypeScript
Для тех, кто плохо знаком с TypeScript или для разработчиков Java, переходящих на JavaScript, эти три современных совета и рекомендации по TypeScript…
- 11 уроков, извлеченных из написания моей первой Java-программы
Вы будете поражены тем, насколько легко изучать Java и писать мощные кросс-платформенные приложения при написании своей первой программы на Java. ..
Концепции ООП Java — Javatpoint
следующий → ← предыдущая
На этой странице мы узнаем об основах ООП. Объектно-ориентированное программирование — это парадигма, которая предоставляет множество концепций, таких как наследование , привязка данных , полиморфизм и т. д. Simula считается первым объектно-ориентированным языком программирования. Парадигма программирования, в которой все представляется в виде объекта, известна как истинно объектно-ориентированный язык программирования. Smalltalk считается первым действительно объектно-ориентированным языком программирования. Популярными объектно-ориентированными языками являются Java, C#, PHP, Python, C++ и т. д. Основной целью объектно-ориентированного программирования является реализация реальных сущностей, например объектов, классов, абстракций, наследования, полиморфизма и т. д. ООП (система объектно-ориентированного программирования)Объект означает объект реального мира, такой как ручка, стул, стол, компьютер, часы и т. д. Объектно-ориентированное программирование — это методология или парадигма разработки программы с использованием классов и объектов. Он упрощает разработку и обслуживание программного обеспечения, предоставляя некоторые концепции:
Помимо этих понятий, в объектно-ориентированном проектировании используются и другие термины:
ОбъектЛюбая сущность, имеющая состояние и поведение, называется объектом. Например, стул, ручка, стол, клавиатура, велосипед и т. д. Оно может быть физическим или логическим. Объект может быть определен как экземпляр класса. Объект содержит адрес и занимает некоторое место в памяти. Объекты могут общаться, не зная деталей данных или кода друг друга. Единственная необходимая вещь — это тип принимаемого сообщения и тип ответа, возвращаемого объектами. Пример: Собака является объектом, потому что у нее есть такие состояния, как цвет, имя, порода и т. д., а также поведение, такое как виляние хвостом, лай, еда и т. д. КлассКоллекция объектов называется классом. Это логическая сущность. Класс также можно определить как схему, из которой можно создать отдельный объект. Класс не занимает места. НаследствоКогда один объект приобретает все свойства и поведение родительского объекта , это известно как наследование. Он обеспечивает возможность повторного использования кода. Он используется для достижения полиморфизма во время выполнения. ПолиморфизмЕсли одна задача выполняется разными способами , это называется полиморфизмом. Например: убедить заказчика в другом, нарисовать что-то, например, фигуру, треугольник, прямоугольник и т.д. В Java мы используем перегрузку методов и переопределение методов для достижения полиморфизма. Другим примером может быть что-то сказать; например, кошка мяукает, собака гавкает и т. д. АбстракцияСокрытие внутренних деталей и демонстрация функциональности называется абстракцией. Например, телефонный звонок, внутреннюю обработку мы не знаем. В Java мы используем абстрактный класс и интерфейс для достижения абстракции. ИнкапсуляцияСвязывание (или упаковка) кода и данных вместе в единое целое называется инкапсуляцией . Например, капсула, в нее заворачивают разные лекарства. Класс Java является примером инкапсуляции. Java bean — это полностью инкапсулированный класс, потому что все данные-члены здесь закрыты. МуфтаСвязывание относится к знанию, информации или зависимости другого класса. Он возникает, когда классы знают друг о друге. Если класс имеет подробную информацию о другом классе, существует сильная связь. В Java мы используем модификаторы private, protected и public для отображения уровня видимости класса, метода и поля. Вы можете использовать интерфейсы для более слабой связи, потому что нет конкретной реализации. СплоченностьСплоченность относится к уровню компонента, который выполняет одну четко определенную задачу. Единая четко определенная задача выполняется с помощью очень согласованного метода. Слабо связный метод разделит задачу на отдельные части. Пакет java.io является очень связным пакетом, поскольку он имеет классы и интерфейс, связанные с вводом-выводом. Однако пакет java.util является слабо связным пакетом, поскольку он имеет несвязанные классы и интерфейсы. АссоциацияАссоциация представляет отношения между объектами. Здесь один объект может быть связан с одним объектом или со многими объектами. Между объектами может быть четыре типа ассоциации:
Давайте разберемся с отношениями на примерах реального времени. Например, в одной стране может быть один премьер-министр (один к одному), а у премьер-министра может быть много министров (один ко многим). Кроме того, у многих депутатов может быть один премьер-министр (многие к одному), а у многих министров может быть много департаментов (многие ко многим). Ассоциация может быть однонаправленной или двунаправленной. АгрегацияАгрегация — это способ достижения ассоциации. Агрегация представляет собой отношение, в котором один объект содержит другие объекты как часть своего состояния. Он представляет собой слабую связь между объектами. Это также называется отношением имеет- в Java. Например, наследование представляет собой отношение есть . Это еще один способ повторного использования объектов. СоставКомпозиция также является способом достижения ассоциации. Композиция представляет собой отношение, в котором один объект содержит другие объекты как часть своего состояния. Существует сильная связь между содержащим объектом и зависимым объектом. Это состояние, в котором содержащие объекты не имеют независимого существования. Если вы удалите родительский объект, все дочерние объекты будут удалены автоматически. Преимущество ООП перед процедурно-ориентированным языком программирования1) ООП упрощает разработку и обслуживание, тогда как в процедурно-ориентированном языке программирования непросто управлять, если код растет по мере увеличения размера проекта. 2) ООП обеспечивает сокрытие данных, тогда как в процедурно-ориентированном языке программирования доступ к глобальным данным возможен из любого места. Оставить комментарий
|