Содержание
Объектно-ориентированное программирование для самых маленьких | by NOP | NOP::Nuances of Programming
Перевод статьи Alexander Petkov: How to explain object-oriented programming concepts to a 6-year-old
Вы когда-нибудь замечали, что на собеседованиях задают одни и те же клишированные вопросы?
Уверен, вы поняли, что я имею ввиду.
Ну вот, к примеру:
Кем вы видите себя через 5 лет?
Или еще «лучше»:
Какой ваш главный недостаток?
Боже, ответ на этот вопрос станет моим главным недостатком.
Конечно, эти вопросы до ужаса тривиальны и не вызывают ничего, кроме раздражения, но они помогают работодателям лучше вас понять. А именно — ваше текущее состояние, жизненную позицию, взгляд на будущее и т.д.
Отвечая на эти вопросы, вы должны быть очень осторожны, так как из-за невнимательность вы можете рассказать что-то такое, о чем позже пожалеете.
В сегодняшней статье я хочу разобрать похожий «клишированный» вопрос:
Каковы основные принципы объектно-ориентированного программирования?
Я был по обе стороны стола, когда звучал этот вопрос. Он звучит настолько часто, что не знать ответа на него — просто невозможно.
В 90% случаев его задают новичкам, потому что он помогает разъяснить три вопроса:
- Готовился ли кандидат к этому интервью?
Если ответ дается незамедлительно — кандидат ответственно подошел к делу. - Прошел ли кандидат начальный этап?
Понимание принципов объектно-ориентированного программирования (ООП) показывает, что кандидат прошел начальный этап — теперь он видит вещи с более продвинутой точки зрения. - Его понимание ООП находится на глубоком или поверхностном уровне?
Уровень компетентности по данному вопросу часто равен уровню компетентности по большинству других. Доверьтесь мне.
Пришло время озвучить 4 принципа ООП: инкапсуляция, абстракция, наследование и полиморфизм.
Для junior-разработчика слова могут показаться страшными и сложными. Вдобавок, при поиске ответа в Интернете, чрезмерно длинные объяснения в Википедии удваивают путаницу.
Вот почему я хочу дать простое, короткое и четкое объяснение для каждого из приведенных принципов. Может показаться, что они звучат чересчур просто, будто бы я разговариваю с маленьким ребенком, но именно такую формулировку я бы хотел услышать от кандидата на собеседовании.
Допустим, у нас есть некая программа. У нее есть объекты, которые общаются между собой, в соответствии с правилами, установленными в программе.
Объект самостоятельно управляет своим внутренним состоянием, с помощью методов — и никто другой не может трогать его, если на это нет особого разрешения. Если другой захочет с ним взаимодействовать, ему нужно будет использовать разрешенные методы. Но (по умолчанию) менять внутреннее состояние нельзя.
Теперь допустим, что мы играем в Sims. У нас есть семья из нескольких людей и кошки. Они общаются друг с другом. Мы хотим применить инкапсуляцию, поэтому инкапсулируем всю логику «cat» в класс Cat. Это выглядит следующим образом:
Здесь внутренним состоянием кошки являются частные(private) переменные: настроение(mood), голод(hungry) и энергия(energy). Она также имеет частный(private) метод meow (). Кошка может вызвать его в любой момент, когда захочет, другие классы не могут говорить кошке, когда ей можно мяукать.
То, что им можно делать, определяется в публичных(public) методах sleep (), play () и feed (). Каждый из них каким-то образом влияет на внутреннее состояние кошки и может вызвать meow (). Таким образом, устанавливается связь между внутренним состоянием объекта и публичными методами.
Вот что такое инкапсуляция.
В объектно-ориентированном программировании, зачастую, у программ очень большой объем, и объекты много общаются между собой. Как вы понимаете, поддерживать такую кодовую базу в течение долгих лет — с постоянными изменениями — трудно.
Абстракция нацелена на решение этой проблемы.
Применение абстракции означает, что нужно отбросить незначимые характеристики объекта и оставить только значимые. Данные обрабатываются функцией высокого уровня с помощью вызова функций низкого уровня.
Представьте кофеварку. Когда она варит кофе, под ее корпусом творится много вещей. Но от вас требуется лишь насыпать кофе и нажать кнопку.
Данный механизм должен быть неприхотлив в использовании, а также редко меняться со временем. Подумайте об этом, как о наборе публичных(public) методов, которые любой другой класс может вызывать, не “зная”, как они работают.
Хотите еще один пример? Возьмите свой смартфон.
Каждый день вы бесчисленное количество раз проводите пальцами по экрану. Что в этот момент происходит внутри смартфона? Рядовому пользователю не нужно это знать, так как ему дан определенный перечень действий для работы с гаджетом.
Итак, мы разобрались с двумя принципами ООП, осталось еще два.
Наследование позволяет создать новый класс (производный класс) на основе уже существующего (родительский класс).
Производный класс берет все от родительского, но имеет дополнительные характеристики. Это нужно для того, чтобы просто немного улучшить старый класс, а не создавать с нуля новый.
Например:
На данном примере, «обычный» преподаватель делится на «частного» и «публичного». «Частный» работает индивидуально с каждым студентом, а «публичный» со всеми в одно время. Эти классы имеют новые уникальные характеристики, не присущие родительскому классу.
На греческом, полиморфизм означает «многообразие форм».
Мы с вами узнали, что такое наследование, и успешно применяем его на практике. Но возникает одна проблема.
Представим, что у нас есть родительский класс и несколько производных. Мы хотим использовать коллекцию или, по-другому, список, который содержит «микс» всех этих классов. Или у нас есть метод, осуществляемый для родительского класса, но мы бы хотели использовать его и для производного.
Эту проблему можно решить, используя полиморфизм.
Полиморфизм позволяет использовать объекты с одинаковыми характеристиками в разных направлениях.
Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс.
Данный принцип позволяет повысить коэффициент повторного использования кода.
Взгляните на эскиз с геометрическими фигурами. Они повторно используют общий интерфейс для расчета площади поверхности и периметра:
Имея в распоряжении эти фигуры, наследующие интерфейс родительского класса, мы можем создать коллекцию (список) смешанных треугольников, окружностей и прямоугольников. И относиться к ним, как к одному и тому же типу объектов.
Затем, если потребуется вычислить площадь какого-либо элемента, эта коллекция (список) найдет и выполнит правильный метод. Если элемент является треугольником, выполняется метод CalculateSurface (). Если это круг, выполняется метод CalculateSurface (). И так далее.
Вместо того, чтобы писать класс для каждого конкретного типа следует создать типы, которые будут реализованы во время выполнения программы.
Надеюсь, мое «детское» объяснение вам помогло. Используйте его при прохождении собеседования и должность, фактически, вам обеспечена!
Вы готовы к собеседованию, знаете ответ на любой вопрос, рубашка и пиджак поглажены, резюме сто раз перечитано и подкорректировано, но вот незадача — никто не звонит с предложением о работе.
В следующей статье мы поговорим о том, как выделиться из толпы и, что ожидает увидеть работодатель в junior-разработчике.
До скорых встреч!
Принципы объектно-ориентированного программирования / Хабр
Привет, Хабр! Меня зовут Владислав Родин. В настоящее время я являюсь руководителем курса «Архитектор высоких нагрузок» в OTUS, а также преподаю на курсах, посвященных архитектуре ПО.
Специально к старту занятий в новом потоке курса «Архитектура и шаблоны проектирования» я подготовил еще один авторский материал.
Введение
Когда речь заходит о классических паттернах проектирования, нельзя не вспомнить о самом объектно-ориентированном программировании. Ведь паттерны GoF являются паттернами именно объектно-ориентированного программирования. В функциональном же программировании есть свои собственные паттерны.
Вообще устроено все следующим образом: есть само объектно-ориентированное программирование. У него есть принципы. Из принципов объектно-ориентированного программирования следуют разобранные нам шаблоны GRASP (как вариант — SOLID принципы), из которых, в свою очередь, следуют шаблоны GoF. Из них же следует ряд интересных вещей, например, enterprise паттерны.
Объектно-ориентированная парадигма
Определение гласит, что «Объектно-ориентированное программирование – это парадигма программирования, в которой основной концепцией является понятие объекта, который отождествляется с предметной областью.»
Таким образом, система представляется в виде набора объектов предметной области, которые взаимодействуют между собой некоторым образом. Каждый объект обладает тремя cоставляющими: идентичность (identity), состояние (state) и поведение (behaviour).
Состояние объекта — это набор всех его полей и их значений.
Поведение объекта — это набор всех методов класса объекта.
Идентичность объекта — это то, что отличает один объект класса от другого объекта класса. С точки зрения Java, именно по идентичности определяется метод equals.
Принципы объектно-ориентированного программирования
Объектно-ориентированное программирование обладает рядом принципов. Представление об их количестве расходится. Кто-то утверждает, что их три (старая школа программистов), кто-то, что их четыре (новая школа программистов):
- Абстрация
- Инкапсуляция
- Наследование
- Полиморфизм
Предлагаю поговорить о них подробнее. Единственное что — я предлагаю не рассматривать абстракцию, потому как отношу себя к старой школе программистов.
Инкапсуляция
Вопреки мнению многих собеседующихся (а иногда и собеседуемых), инкапсуляция это не «когда все поля приватные». Инкапсуляция является фундаментальнейшим принципом проектирования ПО, ее следы наблюдаются на только на уровне микро-, но и на уровне макропроектирования.
Научное определение гласит, что «Инкапсуляция – это принцип, согласно которому любой класс и в более широком смысле – любая часть системы должны рассматриваться как «черный ящик»: пользователь класса или подсистемы должен видеть только интерфейс (т.е. список декларируемых свойств и методов) и не вникать во внутреннюю реализацию.»
Таким образом, получается, что если класс A обращается к полям класса B напрямую, это приводит не к тому, что «нарушается информационная безопасность», а к тому, что класс A завязывается на внутренне устройство класса B, и попытка изменить внутреннее устройство класса B приведет к изменению класса А. Более того, класс A не просто так работает с полями класса B, он работает по некоторой бизнес-логике. То есть логика по работе с состоянием класса В лежит в классе А, и когда мы захотим переиспользовать класс В, это не удастся сделать, ведь без кусочка класса А класс В может быть бесполезным, что приведет к тому, что класс В придется отдавать вместе с классом А. Экстраполируя это на всю систему, получается, что переиспользовать можно будет только всю систему целиком.
Инкапсуляция является самым недооцененным принципом, который, к сожалению, мало кем интерпретируется правильно. Она позволяет минимизировать число связей между классами и подсистемами и, соответственно, упростить независимую реализацию и модификацию классов и подсистем.
Наследование
Наследование — это возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (суперкласса), добавляя при необходимости новые свойства и
методы.
Наследование является самым переоцененным принципом. Когда-то считалось, что «У идеального программиста дерево наследования уходит в бесконечность и заканчивается абсолютно пустым объектом», потому как когда-то люди не очень хорошо понимали то, что наследование — это способ выразить такое свойство реального мира как иерархичность, а не способ переиспользовать код, отнаследовав машину от холодильника, потому что у обоих предметов есть ручка. Наследования желательно по возможности избегать, потому что наследование является очень сильной связью. Для уменьшения количества уровней наследования рекомендуется строить дерево «снизу-вверх».
Полиморфизм
Полиморфизм — это возможность использовать классы – потомки в контексте, который был предназначен для класса – предка.
За самым садистским определением кроется возможность языка программирования для декомпозиции задачи и рефакторинга if’ов и switch’ей.
Четыре столпа объектно-ориентированного программирования
В этой статье я попытаюсь объяснить четыре основных принципа объектно-ориентированного программирования (ООП). Объектно-ориентированное программирование позволяет программистам думать о разработке программного обеспечения, как если бы они работали с реальными объектами. В вашей повседневной жизни люди обладают знаниями и могут выполнять различные работы/задачи. В ООП объекты имеют поля для хранения знаний/состояния/данных и могут выполнять различные методы.
Прежде чем углубиться в четыре столпа ООП, я хотел бы пройтись по некоторым основным терминам.
Объект : Экземпляр класса / это рабочий объект класса
Класс : Это модель или стандарт о возможностях того, что объект может делать
Метод: Может изменять класс состояние, которое будет применяться ко всем экземплярам класса
. Экземпляр : Это похоже на Объекты, однако давайте подумаем об этом в следующих терминах: Чертеж дизайна автомобиля — это описание класса, все автомобили, изготовленные по этому чертежу. являются объектами этого класса. Ваш автомобиль, сделанный по этому чертежу, является экземпляром этого класса.
Теперь, когда мы рассмотрели эти ключевые слова, давайте перейдем к четырем принципам объектно-ориентированного программирования: инкапсуляция, абстракция, наследование и полиморфизм.
Инкапсуляция
Инкапсуляция выполняется, когда каждый объект поддерживает частное состояние внутри класса. Другие объекты не могут напрямую обращаться к этому состоянию, вместо этого они могут вызывать только список общедоступных функций. Объект управляет своим состоянием с помощью этих функций, и никакой другой класс не может изменить его, если это явно не разрешено. Чтобы общаться с объектом, вам нужно будет использовать предоставленные методы. Мне нравится думать об инкапсуляции на примере людей и их собак. Если мы хотим применить инкапсуляцию, мы делаем это, инкапсулируя всю «собачью» логику в класс Dog. «Состояние» собаки выражается в частных переменных «игривый», «голодный» и «энергичный», и каждая из этих переменных имеет соответствующие поля.
Также существует закрытый метод: bark(). Класс собаки может вызвать это, когда захочет, и другие классы не могут сказать собаке, когда лаять. Существуют также общедоступные методы, такие как sleep(), play() и eat(), которые доступны другим классам. Каждая из этих функций изменяет внутреннее состояние класса Dog и может вызывать bark(), когда это происходит, приватное состояние и общедоступные методы связаны.
Абстракция
Абстракция — это расширение инкапсуляции. Это процесс выбора данных из большего пула, чтобы показать только те детали, которые относятся к объекту. Предположим, вы хотите создать приложение для знакомств и вас просят собрать всю информацию о ваших пользователях. Вы можете получить от своего пользователя следующие данные: полное имя, адрес, номер телефона, любимую еду, любимый фильм, хобби, налоговую информацию, номер социального страхования, кредитный рейтинг. Это большой объем данных, однако не все они необходимы для создания профиля знакомств. Вам нужно только выбрать информацию, которая имеет отношение к вашему приложению знакомств из этого пула. Такие данные, как полное имя, любимая еда, любимый фильм и хобби, имеют смысл для приложения для знакомств. Процесс извлечения/удаления/выбора информации о пользователе из большего пула называется абстракцией. Одним из преимуществ Abstraction является возможность применять ту же информацию, которую вы использовали для приложения для знакомств, к другим приложениям с небольшими изменениями или без изменений.
Наследование
Наследование — это способность одного объекта приобретать некоторые/все свойства другого объекта. Например, ребенок наследует черты своих родителей. При наследовании возможность повторного использования является основным преимуществом. Вы можете повторно использовать поля и методы существующего класса. В Java существуют различные типы наследования: одиночное, множественное, многоуровневое, иерархическое и гибридное. Например, Apple — это фрукт, поэтому предположим, что у нас есть класс Fruit и его подкласс с именем Apple. Наше яблоко приобретает свойства класса Fruit. Другими классификациями могут быть виноград, груша, манго и т. Д. Фрукты определяют класс продуктов, которые представляют собой зрелые завязи растения, мясистые, содержащие большое семя внутри или множество крошечных семян. Яблоко подкласса приобретает эти свойства от фруктов и обладает некоторыми уникальными свойствами, которые отличаются от других подклассов фруктов, такими как красное, круглое, углубление наверху.
Полиморфизм
Полиморфизм позволяет использовать класс точно так же, как его родитель, поэтому не возникает путаницы при смешивании типов. При этом каждый дочерний подкласс сохраняет свои собственные функции/методы такими, какие они есть. Если бы у нас был суперкласс под названием Mammal, у которого был бы метод с именем МлекопитающееSound(). Подклассами млекопитающих могут быть собаки, киты, слоны и лошади. У каждого из них будет своя собственная итерация звука млекопитающего (лай собаки, щелчки кита).
ПОДРОБНЕЕ: Основы взаимодействия GraphQL и REST API, Прототипирование и исследование UX, Диаграммы сходства и кластеризация, Создание пользовательского пользовательского интерфейса: Создание цветовой схемы
Объектно-ориентированное программирование на C++
0
0 СОДЕРЖАНИЯ :
- Введение
- Класс
- Объекты
- Инкапсуляция
- Абстракция
- Полиморфизм
- Наследование
- Динамическое связывание
- Передача сообщений
Объектно-ориентированное программирование. Как следует из названия, в программировании используются объекты. Объектно-ориентированное программирование направлено на реализацию в программировании реальных объектов, таких как наследование, скрытие, полиморфизм и т. д. Основная цель ООП — связать воедино данные и функции, которые с ними работают, чтобы никакая другая часть кода не могла получить доступ к этим данным, кроме этой функции.
Характеристики объектно-ориентированного языка программирования
Класс : Строительным блоком C++, который ведет к объектно-ориентированному программированию, является класс. Это определяемый пользователем тип данных, который содержит свои собственные данные-члены и функции-члены, доступ к которым и их использование можно получить, создав экземпляр этого класса. Класс подобен чертежу объекта.
Например: Рассмотрим класс автомобилей. Может быть много автомобилей с разными названиями и брендами, но все они будут иметь некоторые общие свойства, такие как все они будут иметь 4 колеса, ограничение скорости, диапазон пробега и т. д. Итак, здесь автомобиль — это класс, а колеса, ограничения скорости, пробег — это их свойства.
- Класс — это определяемый пользователем тип данных, который имеет данные-члены и функции-члены.
- Элементы данных — это переменные данных, а функции-члены — это функции, используемые для управления этими переменными, и вместе эти элементы данных и функции-члены определяют свойства и поведение объектов в классе.
- В приведенном выше примере класса Car элементом данных будет ограничение скорости, пробег и т. д., а функции-члены могут включать тормоза, увеличивать скорость и т. д.
Можно сказать, что класс в C++ — это схема, представляющая группу объектов, которые имеют некоторые общие свойства и поведение.
Объект: Объект — это идентифицируемый объект с некоторыми характеристиками и поведением. Объект является экземпляром класса. Когда класс определен, память не выделяется, но когда он создается (то есть создается объект), память выделяется.
|
Объект занимает место в памяти и имеет связанный адрес, такой как запись в паскале или структура или объединение в C.
Когда программа выполняется, объекты взаимодействуют, отправляя сообщения одному еще один.
Каждый объект содержит данные и код для управления данными. Объекты могут взаимодействовать, не зная деталей данных или кода друг друга, достаточно знать тип принятого сообщения и тип ответа, возвращаемого объектами.
Инкапсуляция : Обычно инкапсуляция определяется как объединение данных и информации в одном блоке. В объектно-ориентированном программировании инкапсуляция определяется как связывание вместе данных и функций, которые ими манипулируют.
Рассмотрим реальный пример инкапсуляции. В компании существуют различные разделы, такие как раздел счетов, финансовый раздел, отдел продаж и т. д. Финансовый раздел обрабатывает все финансовые операции и ведет учет всех данных, связанных с финансами. Точно так же отдел продаж обрабатывает все действия, связанные с продажами, и ведет учет всех продаж. Сейчас может возникнуть ситуация, когда чиновнику из финансового отдела по каким-то причинам нужны все данные о продажах в конкретном месяце. В этом случае ему не разрешается прямой доступ к данным раздела продаж. Сначала ему придется связаться с другим сотрудником отдела продаж, а затем попросить его предоставить конкретные данные. Вот что такое инкапсуляция. Здесь данные отдела продаж и сотрудников, которые могут ими манипулировать, объединены одним названием «отдел продаж».
Инкапсуляция в C++
Инкапсуляция также приводит к абстракции или сокрытию данных . Поскольку использование инкапсуляции также скрывает данные. В приведенном выше примере данные любого раздела, такого как продажи, финансы или счета, скрыты от любого другого раздела.
Абстракция : Абстракция данных — одна из наиболее существенных и важных особенностей объектно-ориентированного программирования на C++. Абстракция означает отображение только важной информации и сокрытие деталей. Абстракция данных относится к предоставлению только необходимой информации о данных внешнему миру, сокрытию фоновых деталей или реализации.
Рассмотрим реальный пример человека за рулем автомобиля. Человек знает только, что нажатие на акселератор увеличит скорость автомобиля или нажимая на тормоз остановит машину, но он не знает, как на самом деле увеличивается скорость при нажатии на акселератор, он не знает о внутреннем механизме автомобиля или реализация акселератора, тормозов и т. д. в автомобиле. Вот что такое абстракция.
- Абстракция с использованием классов : Абстракцию на C++ можно реализовать с помощью классов. Класс помогает нам группировать элементы данных и функции-члены, используя доступные спецификаторы доступа. Класс может решить, какой член данных будет виден внешнему миру, а какой нет.
- Абстракция в заголовочных файлах : Еще одним типом абстракции в C++ могут быть заголовочные файлы. Например, рассмотрим метод pow() в заголовочном файле math.h. Всякий раз, когда нам нужно вычислить мощность числа, мы просто вызываем функцию pow(), присутствующую в заголовочном файле math. h, и передаем числа в качестве аргументов, не зная лежащего в основе алгоритма, в соответствии с которым функция фактически вычисляет мощность чисел. .
Полиморфизм: Слово полиморфизм означает наличие множества форм. Проще говоря, мы можем определить полиморфизм как способность сообщения отображаться более чем в одной форме.
Человек одновременно может иметь разные характеристики. Как и мужчина одновременно является отцом, мужем, работником. Таким образом, один и тот же человек в разных ситуациях ведет себя по-разному. Это называется полиморфизмом.
Операция может вести себя по-разному в разных случаях. Поведение зависит от типов данных, используемых в операции.
C++ поддерживает перегрузку операторов и перегрузку функций.
- Перегрузка оператора : Процесс создания оператора, демонстрирующего различное поведение в разных случаях, называется перегрузкой оператора.
- Перегрузка функции : Перегрузка функции использует одно имя функции для выполнения различных типов задач.
Полиморфизм широко используется при реализации наследования.
Пример : Предположим, нам нужно написать функцию для сложения нескольких целых чисел, иногда 2 целых числа, иногда 3 целых числа. Мы можем написать метод добавления с тем же именем, но с разными параметрами, соответствующий метод будет вызываться в соответствии с параметрами.
Наследование : Возможность класса получать свойства и характеристики от другого класса называется Наследованием. Наследование — одна из важнейших особенностей объектно-ориентированного программирования.
- Подкласс : Класс, который наследует свойства другого класса, называется подклассом или производным классом.
- Суперкласс :Класс, свойства которого наследуются подклассом, называется базовым классом или суперклассом.
- Повторное использование : Наследование поддерживает концепцию «повторного использования», т.