ООП с примерами (часть 1) / Хабр
Волею судьбы мне приходится читать спецкурс по паттернам проектирования в вузе. Спецкурс обязательный, поэтому, студенты попадают ко мне самые разные. Конечно, есть среди них и практикующие программисты. Но, к сожалению, большинство испытывают затруднения даже с пониманием основных терминов ООП.Для этого я постарался на более-менее живых примерах объяснить базовые понятия ООП (класс, объект, интерфейс, абстракция, инкапсуляция, наследование и полиморфизм).
Первая часть, представленная ниже, посвящена классам, объектам и интерфейсам.
Вторая часть иллюстрирует инкапсуляцию, полиморфизм и наследование
Основные понятия ООП
Класс
Представьте себе, что вы проектируете автомобиль. Вы знаете, что автомобиль должен содержать двигатель, подвеску, две передних фары, 4 колеса, и т.д. Ещё вы знаете, что ваш автомобиль должен иметь возможность набирать и сбавлять скорость, совершать поворот и двигаться задним ходом. И, что самое главное, вы точно знаете, как взаимодействует двигатель и колёса, согласно каким законам движется распредвал и коленвал, а также как устроены дифференциалы. Вы уверены в своих знаниях и начинаете проектирование.Вы описываете все запчасти, из которых состоит ваш автомобиль, а также то, каким образом эти запчасти взаимодействуют между собой. Кроме того, вы описываете, что должен сделать пользователь, чтобы машина затормозила, или включился дальний свет фар. Результатом вашей работы будет некоторый эскиз. Вы только что разработали то, что в ООП называется класс.
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).
С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов).
С точки зрения структуры программы, класс является сложным типом данных.
В нашем случае, класс будет отображать сущность – автомобиль. Атрибутами класса будут являться двигатель, подвеска, кузов, четыре колеса и т.д. Методами класса будет «открыть дверь», «нажать на педаль газа», а также «закачать порцию бензина из бензобака в двигатель». Первые два метода доступны для выполнения другим классам (в частности, классу «Водитель»). Последний описывает взаимодействия внутри класса и не доступен пользователю.
В дальнейшем, несмотря на то, что слово «пользователь» ассоциируется с пасьянсом «Косынка» и «Microsoft Word», мы будем называть пользователями тех программистов, которые используют ваш класс, включая вас самих. Человека, который является автором класса, мы будем называть разработчиком.
Объект
Вы отлично потрудились и машины, разработанные по вашим чертежам, сходят с конвейера. Вот они, стоят ровными рядами на заводском дворе. Каждая из них точно повторяет ваши чертежи. Все системы взаимодействуют именно так, как вы спроектировали. Но каждая машина уникальна. Они все имеют номер кузова и двигателя, но все эти номера разные, автомобили различаются цветом, а некоторые даже имеют литьё вместо штампованных дисков. Эти автомобили, по сути, являются объектами вашего класса.Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.
Говоря простым языком, объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе. В данном примере, если класс – это некоторый абстрактный автомобиль из «мира идей», то объект – это конкретный автомобиль, стоящий у вас под окнами.
Интерфейс
Когда мы подходим к автомату с кофе или садимся за руль, мы начинаем взаимодействие с ними. Обычно, взаимодействие происходит с помощью некоторого набора элементов: щель для приёмки монеток, кнопка выбора напитка и отсек выдачи стакана в кофейном автомате; руль, педали, рычаг коробки переключения передач в автомобиле. Всегда существует некоторый ограниченный набор элементов управления, с которыми мы можем взаимодействовать.Интерфейс – это набор методов класса, доступных для использования другими классами.
Очевидно, что интерфейсом класса будет являться набор всех его публичных методов в совокупности с набором публичных атрибутов. По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним.
При описании интерфейса класса очень важно соблюсти баланс между гибкостью и простотой. Класс с простым интерфейсом будет легко использовать, но будут существовать задачи, которые с помощью него решить будет не под силу. В то же время, если интерфейс будет гибким, то, скорее всего, он будет состоять из достаточно сложных методов с большим количеством параметров, которые будут позволять делать очень многое, но использование его будет сопряжено с большими сложностями и риском совершить ошибку, что-то перепутав.
Примером простого интерфейса может служить машина с коробкой-автоматом. Освоить её управление очень быстро сможет любая блондинка, окончившая двухнедельные курсы вождения. С другой стороны, чтобы освоить управление современным пассажирским самолётом, необходимо несколько месяцев, а то и лет упорных тренировок. Не хотел бы я находиться на борту Боинга, которым управляет человек, имеющий двухнедельный лётный стаж. С другой стороны, вы никогда не заставите автомобиль подняться в воздух и перелететь из Москвы в Вашингтон.
ООП (объектно-ориентированное программирование): что это
Объектно-ориентированное программирование (ООП) — это подход, при котором программа рассматривается как набор объектов, взаимодействующих друг с другом. У каждого есть свойства и поведение. ООП ускоряет написание кода и делает его более читаемым.
Идеология объектно-ориентированного программирования (ООП) разрабатывалась, чтобы связать поведение определенного объекта с его классом. Людям проще воспринимать окружающий мир как объекты, которые поддаются определенной классификации (например, разделение на живую и неживую природу).
Зачем нужно ООП
До ООП в разработке использовался другой подход — процедурный. Программа представляется в нем как набор процедур и функций — подпрограмм, которые выполняют определенный блок кода с нужными входящими данными. Процедурное программирование хорошо подходит для легких программ без сложной структуры. Но если блоки кода большие, а функций сотни, придется редактировать каждую из них, продумывать новую логику. В результате может образоваться много плохо читаемого, перемешанного кода — «спагетти-кода» или «лапши».
Пример «спагетти-кода»В отличие от процедурного, объектно-ориентированное программирование позволяет вносить изменения один раз — в объект. Именно он — ключевой элемент программы. Все операции представляются как взаимодействие между объектами. При этом код более читаемый и понятный, программа проще масштабируется.
Объектно-ориентированное программирование используется, чтобы:
- структурировать информацию и не допускать путаницы;
- точно определять взаимодействие одних элементов с другими;
- повышать управляемость программы;
- быстрее масштабировать код под различные задачи;
- лучше понимать написанное;
- эффективнее поддерживать готовые программы;
- внедрять изменения без необходимости переписывать весь код.
Возможности ООП поддерживает большинство популярных языков программирования, включая JavaScript, PHP, Python и другие.
Структура ООП
Объекты и классы
Чтобы сделать код проще, программу разбивают на независимые блоки — объекты. В реальной жизни это может быть стол, чашка, человек, книга, здание и многое другое. В программировании объекты — это структуры данных: пользователь, кнопка, сообщение. У них, как и у реальных предметов, могут быть свойства: цвет, содержание или имя пользователя. А чтобы объединить между собой объекты с похожими свойствами, существуют классы.
Класс — это «шаблон» для объекта, который описывает его свойства. Несколько похожих между собой объектов, например профили разных пользователей, будут иметь одинаковую структуру, а значит, принадлежать к одному классу. Каждый объект — это экземпляр какого-нибудь класса.
Понять, что такое ООП, поможет аналогия.
- Понятие «программист» — это класс.
- Конкретный разработчик по имени Иван — это объект, принадлежащий к классу «программист» (экземпляр класса).
- Зарплата, рабочие обязанности, изученные технологии и должность в компании — это свойства, которые есть у всех объектов класса «программист», в том числе у Ивана. У разных объектов свойства различаются: зарплата и обязанности Ивана будут отличаться от таковых у другого разработчика Миши.
Атрибуты и методы
Объект — это набор переменных и функций, как в традиционном функциональном программировании. Переменные и функции и есть его свойства.
- Атрибуты — это переменные, конкретные характеристики объекта, такие как цвет поля или имя пользователя.
- Методы — это функции, которые описаны внутри объекта или класса. Они относятся к определенному объекту и позволяют взаимодействовать с ними или другими частями кода.
Принципы ООП
Объектно-ориентированное программирование определяют через четыре принципа, по которым можно понять основы работы. Иногда количество сокращают до трех — опускают понятие абстракции.
АбстракцияАбстрагирование — это способ выделить набор наиболее важных атрибутов и методов и исключить незначимые. Соответственно, абстракция — это использование всех таких характеристик для описания объекта. Важно представить объект минимальным набором полей и методов без ущерба для решаемой задачи.
Пример: объекту класса «программист» вряд ли понадобятся свойства «умение готовить еду» или «любимый цвет». Они не влияют на его особенности как программиста. А вот «основной язык программирования» и «рабочие навыки» — важные свойства, без которых программиста не опишешь.
Набор атрибутов и методов, доступный извне, работает как интерфейс для доступа к объекту. Через них к нему могут обращаться другие структуры данных, причем им не обязательно знать, как именно объект устроен внутри.
ИнкапсуляцияКаждый объект — независимая структура. Все, что ему нужно для работы, уже есть у него внутри. Если он пользуется какой-то переменной, она будет описана в теле объекта, а не снаружи в коде. Это делает объекты более гибкими. Даже если внешний код перепишут, логика работы не изменится.
Инкапсуляция помогает с легкостью управлять кодом. Выше мы сказали, что для обращения к объекту не нужно понимать, как работают его методы. Начальнику разработчика Ивана не обязательно знать, как именно он программирует: главное — чтобы выполнялись поставленные задачи.
Внутреннее устройство одного объекта закрыто от других: извне «видны» только значения атрибутов и результаты выполнения методов.
НаследованиеМожно создавать классы и объекты, которые похожи друг на друга, но немного отличаются — имеют дополнительные атрибуты и методы. Более общее понятие в таком случае становится «родителем», а более специфичное и подробное — «наследником».
Упомянутый программист Иван — это человек. Но «человек» — более общее определение, которое не описывает свойства, важные именно для программиста. Можно сказать, что класс «программист» унаследован от класса «человек»: программист тоже является человеком, но у него есть дополнительные свойства.
В таком случае разработчик Иван будет и человеком, и программистом одновременно. У него будут наборы свойств от обоих классов.
У одного «родителя» может быть несколько дочерних структур. Например, от «человека» можно наследовать не только «программиста», но и «директора».
Одиночное и множественное наследиеНаследование позволяет реализовывать сложные схемы с четкой иерархией «от общего к частному». Это облегчает понимание и масштабирование кода. Не нужно много раз переписывать в разных объектах одни и те же свойства. Достаточно унаследовать эти объекты от одного «родителя», и «родительские» свойства применятся автоматически.
ПолиморфизмОдинаковые методы разных объектов могут выполнять задачи разными способами. Например, у «человека» есть метод «работать». У «программиста» реализация этого метода будет означать написание кода, а у «директора» — рассмотрение управленческих вопросов. Но глобально и то, и другое будет работой.
Тут важны единый подход и договоренности между специалистами. Если метод называется delete, то он должен что-то удалять. Как именно — зависит от объекта, но заниматься такой метод должен именно удалением. Более того: если оговорено, что «удаляющий» метод называется delete, то не нужно для какого-то объекта называть его remove или иначе. Это вносит путаницу в код.
Преимущества ООП
Модульность
Объектно-ориентированный подход позволяет сделать код более структурированным, в нем легко разобраться стороннему человеку. Благодаря инкапсуляции объектов уменьшается количество ошибок и ускоряется разработка с участием большого количества программистов, потому что каждый может работать независимо друг от друга.
Гибкость
ООП-код легко развивать, дополнять и изменять. Это обеспечивает независимая модульная структура. Взаимодействие с объектами, а не логикой упрощает понимание кода. Для модификации не нужно погружаться в то, как построено ПО. Благодаря полиморфизму можно быстро адаптировать код под требования задачи, не описывая новые объекты и функции.
Экономия времени
Благодаря абстракции, полиморфизму и наследованию можно не писать один и тот же код много раз. Это ускоряет разработку нового ПО. Интерфейсы и классы в ООП могут легко преобразовываться в подобие библиотек, которые можно использовать заново в новых проектах. Также ООП экономит время при поддержке и доработке приложения.
Безопасность
Программу сложно сломать, так как инкапсулированный код недоступен извне.
Недостатки ООП
Сложный стартЧтобы пользоваться ООП, нужно сначала изучить теорию и освоить процедурный подход, поэтому порог входа высокий.
Снижение производительности
Объектно-ориентированный подход немного снижает производительность кода в целом. Программы работают несколько медленнее из-за особенностей доступа к данным и большого количества сущностей.
Большой размер программы
Код, написанный с использованием ООП, обычно длиннее и занимает больше места на диске, чем «процедурный». Это происходит, потому что в такой программе хранится больше конструкций, чем в обычном процедурном скрипте.
Руководство для начинающих — Объектно-ориентированное программирование
Мы рассмотрим четыре концепции, лежащие в основе объектно-ориентированного программирования.
- Абстракция
- Инкапсуляция
- Наследование
- Полиморфизм
Что такое объектно-ориентированное программирование?
Старые языки программирования, такие как COBOL и C, использовали подход процедурного программирования.
Программа, написанная на этих языках, раньше представляла собой серию пошаговых инструкций. Они использовали процедуры/подпрограммы, чтобы сделать программу модульной. Эта парадигма программирования была сосредоточена на логике больше, чем на данных, и программа, используемая для их объединения.Современные языки программирования, такие как Java, C# и т. д., следуют объектно-ориентированному подходу. В объектно-ориентированном программировании большое значение придается данным, а не просто написанию инструкций для выполнения задачи. Объект — это вещь или идея, которую вы хотите смоделировать в своей программе. Объектом может быть что угодно, например, сотрудник, банковский счет, автомобиль и т. д.
Класс, Объект… что это?
Чтобы начать работу с объектно-ориентированным программированием, нам нужно знать, что такое класс и объект, и в чем разница между ними. Класс — это схема создания объекта. Это похоже на чертеж дома.
Класс определяет атрибуты и поведение . Если мы хотим смоделировать автомобиль в нашем приложении, мы могли бы определить атрибуты автомобиля, такие как модель, топливо, марка и поведение, такое как запуск, остановка, ускорение и т. д. Если вы заметили, атрибуты и поведение, которые мы указываем, не являются только для одной модели автомобиля. Мы пытаемся обобщить автомобиль, утверждая, что автомобиль, который мы собираемся смоделировать в нашей программе, будет иметь такое количество атрибутов и поведения. Могут быть и другие, но наши возможности и интересы для бизнес-требований ограничены этими атрибутами. . Это помогает нам создать чертеж автомобиля, а позже, когда мы используем этот класс для создания объектов, мы создаем объекты автомобиля с конкретными деталями.
Например, используя один и тот же класс «Автомобиль», мы можем создавать разные объекты, различающиеся по модели, типу топлива и году выпуска, но с одинаковым поведением.
|
|
Таким образом, объектно-ориентированное программирование позволяет легко моделировать поведение сложной системы в реальном мире. В ООП данные и функции (атрибуты и методы) объединяются внутри объекта. Это предотвращает необходимость в каких-либо общих или глобальных данных с ООП, что является основным различием между объектно-ориентированным и процедурным подходами.
Абстракция
Абстракция позволяет сосредоточиться на том, что делает объект, а не на том, как это делается. Идея абстракции заключается в знании вещей на высоком уровне. Абстракция помогает создавать независимые модули, которые могут каким-то образом взаимодействовать друг с другом. Независимые модули также упрощают обслуживание.
Абстракция означает представление основной функции без детализации фоновой реализации или внутренних рабочих деталей.
Мы пытаемся выборочно сосредоточиться только на тех вещах, которые важны для нас или, в случае программирования, для нашего модуля. Изменение одного независимого модуля не влияет на другие модули. Единственное знание, которое нужно знать, это то, что дает вам модуль. Человеку, использующему этот модуль, не нужно беспокоиться о том, как выполняется задача или что именно происходит в фоновом режиме.
Абстракция повсюду. Повседневные объекты, которые мы используем, имеют абстракции, применяемые на разных уровнях. Одним из примеров является применение тормозов в вашем автомобиле или велосипеде. Система торможения абстрагирована, и вам предоставляется весло для остановки вашего автомобиля. Внесение изменений в систему ускорения не влияет на тормозную систему, они независимы. Вам также не нужно беспокоиться о внутренней работе тормозов, вам нужно только нажать на педаль тормоза, и автомобиль остановится, будь то дисковый или барабанный тормоз.
Инкапсуляция
Вторая концепция Инкапсуляция тесно связана с Абстракцией. Инкапсуляция заключается в раскрытии решения проблемы, не требуя от потребителя полного понимания проблемной области. Инкапсуляция связывает данные и поведение вместе в единое целое. Это не позволяет клиенту или пользователю модуля узнать о внутреннем представлении, в котором реализовано поведение абстракции.
Данные не доступны напрямую. Доступ к нему осуществляется через открытые функции. Сокрытие внутренних компонентов объекта защищает его целостность, не позволяя пользователям переводить внутренние данные компонента в недопустимое или противоречивое состояние.
Инкапсуляция заключается не только в сокрытии сложности, но и в отказоустойчивом ее раскрытии.
Наследование
Наследование — это мощная функция объектно-ориентированных языков программирования. Наследование помогает организовать классы в иерархию и позволяет этим классам наследовать атрибуты и поведение от классов выше в иерархии.
Наследование описывает «отношение IS A. Так мы говорим в реальном мире. Пример. Попугай — это птица. Доллар США — это тип валюты. Но фраза «Банк — это банковский счет» неверна. Эта связь очевидна, когда вы пытаетесь описать некоторый объект в заданной постановке задачи/задачи.
С помощью наследования вы можете определить общую реализацию/поведение, а позже для специализированных классов вы можете изменить или изменить его на что-то специализированное.
Наследование не работает в обратном направлении. У родителя не будет свойств производного класса.
Наследование — это механизм повторного использования кода, который помогает уменьшить дублирование кода.
Не применять принудительное наследование. Вы просто будете писать ненужный код. Важно отметить, что при попытке смоделировать требование не добавляйте несколько уровней наследования. Это не нужно. Вам нужно попытаться определить общие атрибуты и поведение в смоделированных вами объектах, и на основе этого вы можете приступить к рефакторингу кода, определяющего подходящий родительский класс. Затем общая реализация может быть перемещена в этот класс.
Полиморфизм
Полиморфизм — это концепция, согласно которой может быть много разных реализаций исполняемого модуля, и различия происходят за кулисами без ведома вызывающего.
Полиморфизм позволяет расширять компьютерные системы за счет создания новых специализированных объектов, позволяя текущей части системы взаимодействовать с новым объектом, не заботясь о конкретных свойствах новых объектов.
Например, если вам нужно написать сообщение на листе бумаги, вы можете использовать ручку, карандаш, маркер или даже мелок. Вам нужно только, чтобы предмет, который вы используете, помещался в вашей руке и мог оставлять след при нажатии на бумагу. Таким образом, действие письма поможет вам сделать отметку на бумаге, а вопрос о том, какую маркировку или инструмент для письма использовать, зависит от решения. Другим примером является самолет и космический шаттл, которые можно назвать летающими объектами. Но то, как они летают, разные, т.е. есть разница в реализации. Но с точки зрения зрителя оба объекта могут летать.
Наследование — это один из способов достижения полиморфизма, при котором поведение, определенное в унаследованном классе, можно переопределить, написав собственную реализацию метода. Это называется переопределением метода, также известным как полиморфизм во время выполнения.
Существует также еще одна форма полиморфизма, называемая перегрузкой методов, при которой наследование не принимается во внимание. Имя метода такое же, но аргументы в методе разные.
Нужна помощь в понимании любых технических тем? Присылайте свои запросы по следующей ссылке, и я постараюсь сделать для этого пост/видео.
http://bit.ly/RequestCourse
Ссылки:
- https://stackoverflow.com/questions/16014290/simple-way-to-understand-encapsulation-and-abstraction
- http://www. adobe.com/devnet/actionscript/learning/oop-concepts/polymorphism-and-interfaces.html
- https://stackoverflow.com/questions/3322318/explain-polymorphism?rq=1
Кредит:
Иконки с http://www.freepik.com/
Java ООП (объектно-ориентированное программирование)
❮ Предыдущий Далее ❯
Java — что такое ООП?
ООП означает объектно-ориентированное программирование .
Процедурное программирование заключается в написании процедур или методов, которые выполняют операции над данными, в то время как объектно-ориентированное программирование создание объектов, содержащих как данные, так и методы.
Объектно-ориентированное программирование имеет ряд преимуществ перед процедурным программирование:
- ООП быстрее и проще в исполнении
- ООП обеспечивает четкую структуру для программ
- ООП помогает сохранить код Java СУХИМ «Не повторяйтесь» и делает в код легче поддерживать, изменять и отлаживать
- ООП позволяет создавать полноценные многоразовые приложения с меньшим количеством кода и меньшим временем разработки
Совет: Принцип «Не повторяйся» (СУХОЙ) касается уменьшение повторения кода. Вы должны извлечь коды, которые общие для приложения, размещать их в одном месте и повторно использовать вместо того, чтобы повторять.
Java — что такое классы и объекты?
Классы и объекты — два основных аспекта объектно-ориентированного программирования.
Посмотрите на следующую иллюстрацию, чтобы увидеть разницу между классом и объекты:
класс
фрукты
объекты
яблоко
банан
манго
Другой пример:
класс
Автомобиль
Объекты
Volvo
Audi
Toyota
Итак, класс — это шаблон для объектов, а объект — экземпляр класса.
При создании отдельных объектов они наследуют все переменные и методы из класса.
В следующей главе вы узнаете гораздо больше о классах и объектах.
❮ Предыдущий Далее ❯
ВЫБОР ЦВЕТА
Лучшие учебники
Учебное пособие по HTMLУчебное пособие по CSS
Учебное пособие по JavaScript
Учебное пособие
Учебник по SQL
Учебник по Python
Учебник по W3.CSS
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery
Основные ссылки
HTML ReferenceCSS Reference
JavaScript Reference
SQL Reference
Python Reference
W3.CSS Reference
Bootstrap Reference
PHP Reference
HTML Colors
Java Reference
Angular Reference
jQuery Reference
902 41 Лучшие примеры Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3.