Принципы объектно-ориентированного программирования / Хабр
Привет, Хабр! Меня зовут Владислав Родин. В настоящее время я являюсь руководителем курса «Архитектор высоких нагрузок» в OTUS, а также преподаю на курсах, посвященных архитектуре ПО.
Специально к старту занятий в новом потоке курса «Архитектура и шаблоны проектирования» я подготовил еще один авторский материал.
Введение
Когда речь заходит о классических паттернах проектирования, нельзя не вспомнить о самом объектно-ориентированном программировании. Ведь паттерны GoF являются паттернами именно объектно-ориентированного программирования. В функциональном же программировании есть свои собственные паттерны.
Вообще устроено все следующим образом: есть само объектно-ориентированное программирование. У него есть принципы. Из принципов объектно-ориентированного программирования следуют разобранные нам шаблоны GRASP (как вариант — SOLID принципы), из которых, в свою очередь, следуют шаблоны GoF. Из них же следует ряд интересных вещей, например, enterprise паттерны.
Объектно-ориентированная парадигма
Определение гласит, что «Объектно-ориентированное программирование – это парадигма программирования, в которой основной концепцией является понятие объекта, который отождествляется с предметной областью.»
Таким образом, система представляется в виде набора объектов предметной области, которые взаимодействуют между собой некоторым образом. Каждый объект обладает тремя cоставляющими: идентичность (identity), состояние (state) и поведение (behaviour).
Состояние объекта — это набор всех его полей и их значений.
Поведение объекта — это набор всех методов класса объекта.
Идентичность объекта — это то, что отличает один объект класса от другого объекта класса. С точки зрения Java, именно по идентичности определяется метод equals.
Принципы объектно-ориентированного программирования
Объектно-ориентированное программирование обладает рядом принципов.
- Абстрация
- Инкапсуляция
- Наследование
- Полиморфизм
Предлагаю поговорить о них подробнее. Единственное что — я предлагаю не рассматривать абстракцию, потому как отношу себя к старой школе программистов.
Инкапсуляция
Вопреки мнению многих собеседующихся (а иногда и собеседуемых), инкапсуляция это не «когда все поля приватные». Инкапсуляция является фундаментальнейшим принципом проектирования ПО, ее следы наблюдаются на только на уровне микро-, но и на уровне макропроектирования.
Научное определение гласит, что «Инкапсуляция – это принцип, согласно которому любой класс и в более широком смысле – любая часть системы должны рассматриваться как «черный ящик»: пользователь класса или подсистемы должен видеть только интерфейс (т. е. список декларируемых свойств и методов) и не вникать во внутреннюю реализацию.»
Таким образом, получается, что если класс A обращается к полям класса B напрямую, это приводит не к тому, что «нарушается информационная безопасность», а к тому, что класс A завязывается на внутренне устройство класса B, и попытка изменить внутреннее устройство класса B приведет к изменению класса А. Более того, класс A не просто так работает с полями класса B, он работает по некоторой бизнес-логике. То есть логика по работе с состоянием класса В лежит в классе А, и когда мы захотим переиспользовать класс В, это не удастся сделать, ведь без кусочка класса А класс В может быть бесполезным, что приведет к тому, что класс В придется отдавать вместе с классом А. Экстраполируя это на всю систему, получается, что переиспользовать можно будет только всю систему целиком.
Инкапсуляция является самым недооцененным принципом, который, к сожалению, мало кем интерпретируется правильно. Она позволяет минимизировать число связей между классами и подсистемами и, соответственно, упростить независимую реализацию и модификацию классов и подсистем.
Наследование
Наследование — это возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (суперкласса), добавляя при необходимости новые свойства и
методы.
Наследование является самым переоцененным принципом. Когда-то считалось, что «У идеального программиста дерево наследования уходит в бесконечность и заканчивается абсолютно пустым объектом», потому как когда-то люди не очень хорошо понимали то, что наследование — это способ выразить такое свойство реального мира как иерархичность, а не способ переиспользовать код, отнаследовав машину от холодильника, потому что у обоих предметов есть ручка. Наследования желательно по возможности избегать, потому что наследование является очень сильной связью. Для уменьшения количества уровней наследования рекомендуется строить дерево «снизу-вверх».
Полиморфизм
Полиморфизм — это возможность использовать классы – потомки в контексте, который был предназначен для класса – предка.
За самым садистским определением кроется возможность языка программирования для декомпозиции задачи и рефакторинга if’ов и switch’ей.
Принципы Ооп Php Основные Понятия И Парадигмы — MS Más Salud
Saltar al contenido Принципы Ооп Php Основные Понятия И ПарадигмыСодержание
- Абстракция В Ооп На Java
- Класс
- Наследование Ооп
- О Курсе
- Детальна Програма Курсу
- Инкапсуляция Ооп
ООП – термин, который расшифровывается как объектно-ориентированное программирование. Это одна из парадигм программирования (способ написания когда, методология). Общий класс, который задает базовые характеристики объектов, называется родителем (базовым, суперклассом). Классы, созданные на его основе – потомки, наследники, дочерние.
Также в большинстве языков программирования класс может расширять только один абстрактный класс, но он может использовать преимущества нескольких интерфейсов. В предыдущей статье мы рассмотрели основные преимущества ООП, в этой представлены основные принципы объектно-ориентированного программирования и рассматривается, как они взаимодействуют. Абстракция данных— это способ выделить набор значимых характеристик объекта, исключая из рассмотрения не значимые. Соответственно, абстракция — это набор всех таких характеристик.
И спагетти + god-object, которое вырастает из «3х простых строчек» и «вот там подправить и дописать» это худшая крайность для всех, кроме вас (того, кто писал эти строчки). Так пойди и выучи их для начала, дабы не лепеить лишнего. Глаз мозёлят 5 лишних классов и 10 методов по 5 строк? А всем остальным взрывают мозг 300 строк в одном классе и скрип зубов при расширении этого говнкода. «Ясно и понятно читаемый код гораздо важнее, простоты его написания». Думаю, мнение Макконела, что-то ещё значит в мире разработки ПО.
Абстракция В Ооп На Java
Также благодаря ООП оптимизируется коллективная работа над продуктом. Каждый разработчик работает в своих объектах, а изменения не тянут за собой сбой всей программы. Объект в ООП (экземпляр) – это представитель класса, который имеет свои свойства и поведение, определяемое классом.
Для согласования типов свойств используется только синтаксическая часть речи (грамматика). Второй подход — проще, но оставляет место для ошибок, когда мы свойство «яблоковость» можем присвоить зданию. Но первый — очень тяжел, трудоемок и потому долог. Задача клиента — это время и деньги, можете попытаться поговорить с ним на его языке.
Класс
Данные и операции над ними образуют определенную сущность, и они не разносятся по всей программе, как нередко бывает в случае процедурного программирования, а описываются вместе. Локализация кода и данных улучшает наглядность и удобство сопровождения программного обеспечения. С точки зрения структуры программы, класс является сложным типом данных. Согласно парадигме ООП программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта — послать ему сообщение, в ответ на которое, объект может изменить собственное состояние.
Первое, что вы заметите внутри класса customer — это метод __init__. Метод __init__ является особым методом для классов в Python. Он вызывается каждый раз при создании класса. Наследование – название говорит само за себя. Дочерний класс наследует свойства и методы родительского, тем самым реализуя повторное использование.
То есть по сути права остальных пользователей ограничиваются опцией «только чтение». Калифорнийский университет в Сан-Диего составил этот сертификационный курс, чтобы помочь вам разработать мощное интерактивное ПО. Эту программу создали и преподают трое инструкторов, Leo Porter, Christine Alvarado и Mia Minnes. Она поможет вам углубить знания в области разработки ПО. Вы изучите принципы объектно-ориентированного программирования и реализуете структуры данных и алгоритмы для организации больших объемов данных.
Наследование Ооп
Этот подход к программированию хорошо подходит для больших, сложных и активно обновляемых или поддерживаемых программ. Более того, то, что в Лиспе полно императивщины — это воспринимается как достоинство, а не недостаток.
Это особенно важная опция при совместной работе разных программистов над продуктом. Применяя инкапсуляцию ООП, специалист «прячет» в свой раздел ПО часть данных, которую никто не сможет увидеть и изменить. В поле зрения остается тот функционал, который https://deveducation.com/ нужен для совместной работы. Рассмотрим инкапсуляцию ООП на таком примере. Другие пользователи (знакомые) их знают, но как-то повлиять на эти характеристики (изменить) не могут. Это можете сделать только вы, обратившись в соответствующую инстанцию.
- Если же код программы состоит из одного скрипта и не требует дальнейшей поддержки, то в этом случае использовать ООП нецелесообразно.
- Курс рассчитан на студентов, хорошо знакомых с Java, которые умеют работать с коллекциями, классами и методами классов, создавать интерфейсы и писать базовые запросы на SQL.
- Если я в чем-то ошибся описывая 4 принципа ООП в Java или вы чего-то не поняли про объектно ориентированное программирование Java, напишите об этом в комментариях.
Я же обращаю ваше внимание на то что зданий выше 400м в мире не так уж много, хотя метод вш давно известен и довольно широко используетса, и это не просто так. И большинство из них построины не по одной методологии, а с использованием различных. А вы утвеждаете что метод ваш, для строителства домов, универсален, используэтся повсеместно и позволяет построить все что угодно. Немножко не так, я лиш пошу обратить ваше внимание на качество материалов. И хочу вас убедить, что из кирпеча, который используэтся повсеместно не построиш 100 этажний дом, даже благодаря вашим прикрасным методам.
Всё бы хорошо, но времена и технологии меняются, а наш современный завод должен стремиться повышать удобство и комфорт выпускаемой продукции и соответствовать современным стандартам. Теперь вернёмся в сегодняшний день к современным чудесам автопрома с коробкой-автоматом. На самом деле, по сути, ничего не изменилось. Сейчас все эти действия скрыты от пользователя и позволяют ему крутить руль и нажимать на педаль газа, не задумываясь, что в это время происходит с инжектором, дроссельной заслонкой и распредвалом.
Разобраться с виртуальными и абстрактными методами. Понять, когда вызываются конструкторы и тд. Этот же подход можно использовать и в объектно-ориентированных языках программирования, таких как Java. Это в основном, когда у подкласса есть метод с тем же именем и параметрами метода в родительском классе, эти методы находятся в разных формах (переопределение метода). Как видите, здесь нет абсолютно никаких деталей реализации, не говорится, как собака должна лаять, шевелить хвостом или есть.
У специалиста есть ответ на эти вопросы. Потому что он видел разницу на практике. Студент — теоретик будет только удивляться «нахрена это все напридумывали? Для того, что бы их правильно использовать — их мало выучить, их надо понимать.
Свойства — это характеристики, присущие данному конкретному множеству объектов. В коде ниже мы создаем экземпляр под названием cust1. Вы будете создавать такой экземпляр каждый раз при сохранении информации о новом клиенте.
Вместе сDigital Defund составили список курсов, которые подойдут как новичкам, так и людям с опытом программирования, и помогут освоить этот востребованный язык. Означает, что в классе реализуется функции для работы с файловой системой и с базой данных. Важную роль ООП в php имеют и интерфейсы. По своему виду они напоминают еще более урезанный абстрактный класс. Создание первых программ на языке программирования PHP.
Ооп На Java: Структуры Данных И Не Только От Coursera
Полиморфизм – это способность одного и того же объекта вести себя по-разному в зависимости от того, в контексте какого класса он используется. Полиморфизм связан с созданием перегружаемых виртуальных методов. Классы не имеют прямого доступа к полям друг друга, а взаимодействие между ними осуществляется через публичные методы. Возможность в дочерних классах переопределять методы, помеченные в родительском классе как виртуальные, или реализовывать в классе методы в соответствии с абстрацией в виде интерфейсов. Понимая основные принципы ООП, и имея определенные способности, человек может писать ООП код даже не зная ваших паттернов.
Инкапсуляция Ооп
Увеличение уровня абстракции и читаемости кода, благодаря использованию аналогии с объектами реального мира. Связь между объектами можно осуществлять и частичную через делегацию – подключение метода одного объекта или одновременно нескольких к делегату другого объекта. Делегат по сути это специальное свойство объекта представляющего собой ссылку на объект, который указывает основные принципы ооп на метод или коллекцию методов с определенной сигнатурой. При применении генериков классы соответствующего типа создаются автоматически на этапе компиляции или интерпретации при выполнении кода и при этом поддерживается строгая типизация. Это позволяет клиентскому коду работать с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Кроме того, программирование в значительной мере связано с социодинамикой работы в команде, а этому практически не учат. Например «складской программой Н» вначале пользовались парочка компаний. Растет база, растет кол-во пользователей. Иногда этот рост бывает резким, например в случае подключения трафика с партнерского проекта или рекламной компании. В хаянии ООП постоянно упускают эту разницу, между чистыми алгоритмами и конечной целью программирования и эволюцией программы. Эпик фейлы подобных попыток я видел уже много раз, фейспалм джэпэгэ.
Например, над продуктом работают несколько программистов. Один из них, разрабатывая свой класс, может скрыть некоторый функционал от другого пользователя (программиста), оставив ему только какие-то внешние элементы, необходимые для работы. Отметим, что ООП в C++ считается его отличительной чертой. Несмотря на многопарадигматичность, на практике большинство программистов используют этот язык именно как объектно-ориентированный. В PHP возможно наследование только от одного класса. Класс ООП – это описание устройства объекта, «чертеж», который определяет его состояние, поведение, свойства и пр.
msmassalud2022-09-09T19:33:31+06:00 Page load link Ir a ArribaОсновные принципы ООП для начинающих
Объектно-ориентированное программирование базируется на четырех китах: абстракция, инкапсуляция, наследование, полиморфизм.
Объектно-ориентированное программирование основано на принципах и раньше считалось что их три: инкапсуляция, наследование и полиморфизм. Но сейчас в список стало принято добавлять еще абстракцию. Давайте рассмотрим их подробнее.
Определим что такое ООП
Объектно-ориентированное программирование, как уже ясно из названия работает с объектами. В жизни мы постоянно взаимодействуем с объектами, например машины, телефоны и даже такие простые как спички. У всех этих объектов есть свойства и характеристики с помощью которых мы с ними взаимодействуем. ООП в основе состоит из трех сущностей: класс, интерфейс, объект.
Класс
Предположим, вы решили создать шариковую ручку. У нее есть стержень, который состоит из полого корпуса, чернил и шарикового пишущего металлического наконечника расположенного на конце стержня, а так же корпус. Чернила для шариковых ручек создаются на масляной основе с добавлением пигментов. Можно и дальше детализировать материалы, размеры и т.д., но не будем углубляться. Важно что это все техническое описание шариковой ручки и в ООП это называется «класс», т.е. как в случае с ручкой, когда на основе описания можно создать реальную ручку, так же и в ООП класс служит для создания объекта.
Класс — в объектно-ориентированном программировании, представляет собой шаблон для создания объектов.
Объект
Вы отдали описание шариковой ручки на фабрику и она произвела их в большом количестве и каждая в точности повторяет ваш чертеж. Вы получили объект ручки, он с одной стороны уникален, но с другой полностью характеризуется чертежом по которому они были созданы. Так же и в объектно-ориентированном программировании – объект (экземпляр) – который имеет конкретное состояние и выделенную область памяти. Это как ручки, которые с одной стороны одинаковы, но в процессе использования в них остается разное количество чернил, они могут быть поцарапаны или сломаны.
Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.
Интерфейс
Интерфейс — то, что доступно при использовании объекта извне. У ручки, например, это корпус, который можно держать и давить наконечником на бумагу и оставлять линии. У телефона старого – кнопки для набора номера, у автомобиля руль, переключатель АКПП, педали и так далее. Интерфейсы отличаются сложностью, например как в жизни от управления пультом от телевизора до управления самолетом.
Интерфейс – это набор методов класса, доступных для использования другими классами.
При описании интерфейса класса необходимо всегда поддерживать баланс между гибкостью и простотой использования.
Но теперь вернемся к принципам ООП
Инкапсуляция
Это свойство системы скрывать реализацию и предоставлять только интерфейс. Например чтобы управлять автомобилем достаточно разобраться с рулем, педалями, АКПП, но совершенно не требуется знать устройство двигателя внутреннего сгорания, рулевой рейки, устройства ходовой.
Полиморфизм
Полиморфизм в объектно-ориентированном программировании – это возможность обработки разных типов данных, т. е. принадлежащих к разным классам, с помощью одной и той же функции, или метода.
Полиморфизм, если перевести, — это значит «много форм». Например, актер в театре может примерять на себя много ролей — или принимать «много форм».
Например актер Василий играет во многих спектаклях и у него есть метод «получить_задачу». Вот полиморфизм дает возможность через этот метод не только передавать конкретные роли, например Арлекино или Пьеро, но и такие задачи как «иди спать», «выпей кофе». В зависимости от разных типов входных данных будет выполняться разный код.
Класс Актер(){
метод получить_задачу(Роль){
// код выполнения роли
}
метод получить_задачу(Еда){
// код потребления еды
}
}
Еще такой подход, когда несколько методов с одним названием в классе, но разными входными параметрами называют перегрузкой.
Но еще есть иерархический полиморфизм. Это например когда например родитель курица и метод «голос» возвращает «кудах-кудах», а ребенок, который от курицы наследуется получает все методы родительского класса, но повторно описывает метод «голос», где возвращается «пипипи».
Наследование
Наследование – это описание нового класса на основе существующего с частично или полностью заимствованной функциональностью. Класс от которого идет наследование называется родительским, а вновь создаваемый – потомком или наследником.
Самый простой пример Фигура->Многоугольник->Треугольник
Мы знаем, что у фигуры есть привязка для отображения по осям x и y, а так же цвет заливки. Дальше фигуры могут иметь углы и могут не иметь, например Овал и Круг. Все фигуры, которые имеют углы логично наследовать от Многоугольника, например Квадрат, Треугольник.
То есть мы идем от общего, что есть у всех, через иерархию, к частному.
Но наследование например Квадрата от Треугольника технически возможно, но является ошибкой, так же как например наследование Осьминога от Человека а не от Живое существо.
Абстракция
Абстракция это способ представления объекта в программе. В ООП под абстракцией данных подразумевая набор значимых характеристик объекта, доступный остальной программе.
Например для объекта животное должно быть реализовано: хвост, конечности, волосы, глаза, уши, пасть. Когда вы создаете например собаку, вы можете еще добавить дополнительные свойства, но т.к. она относится к животным, то все выше перечисленные вы обязаны реализовать.
Собака тоже в свою очередь может быть абстракцией с определенными характеристиками, а уже конкретные породы являются реализациями на основе этой абстракции, т.к. обязаны в себе реализовать все элементы собаки плюс свои особенности, которых у других пород может и не быть.
Четыре столпа объектно-ориентированного программирования
В этой статье я попытаюсь объяснить четыре основных принципа объектно-ориентированного программирования (ООП). Объектно-ориентированное программирование позволяет программистам думать о разработке программного обеспечения, как если бы они работали с реальными объектами. В вашей повседневной жизни люди обладают знаниями и могут выполнять различные работы/задачи. В ООП объекты имеют поля для хранения знаний/состояния/данных и могут выполнять различные методы.
Прежде чем углубиться в четыре столпа ООП, я хотел бы пройтись по некоторым основным терминам.
Объект : Экземпляр класса / это рабочий объект класса
Класс : Это модель или стандарт о возможностях того, что объект может делать
Метод: Может изменять класс состояние, которое будет применяться ко всем экземплярам класса
. Экземпляр : Это похоже на Объекты, однако давайте подумаем об этом в следующих терминах: Чертеж дизайна автомобиля — это описание класса, все автомобили, изготовленные по этому чертежу. являются объектами этого класса. Ваш автомобиль, сделанный по этому чертежу, является экземпляром этого класса.
Теперь, когда мы рассмотрели эти ключевые слова, давайте перейдем к четырем принципам объектно-ориентированного программирования: инкапсуляция, абстракция, наследование и полиморфизм.
ИнкапсуляцияИнкапсуляция выполняется, когда каждый объект поддерживает частное состояние внутри класса. Другие объекты не могут напрямую обращаться к этому состоянию, вместо этого они могут вызывать только список общедоступных функций. Объект управляет своим состоянием с помощью этих функций, и никакой другой класс не может изменить его, если это явно не разрешено. Чтобы общаться с объектом, вам нужно будет использовать предоставленные методы. Мне нравится думать об инкапсуляции на примере людей и их собак. Если мы хотим применить инкапсуляцию, мы делаем это, инкапсулируя всю «собачью» логику в класс Dog. «Состояние» собаки выражается в частных переменных «игривый», «голодный» и «энергичный», и каждая из этих переменных имеет соответствующие поля.
Также существует закрытый метод: bark(). Класс собаки может вызвать это, когда захочет, и другие классы не могут сказать собаке, когда лаять. Существуют также общедоступные методы, такие как sleep(), play() и eat(), которые доступны другим классам. Каждая из этих функций изменяет внутреннее состояние класса Dog и может вызывать bark(), когда это происходит, приватное состояние и общедоступные методы связаны.
АбстракцияАбстракция — это расширение инкапсуляции. Это процесс выбора данных из большего пула, чтобы показать только те детали, которые относятся к объекту. Предположим, вы хотите создать приложение для знакомств и вас просят собрать всю информацию о ваших пользователях. Вы можете получить от своего пользователя следующие данные: полное имя, адрес, номер телефона, любимую еду, любимый фильм, хобби, налоговую информацию, номер социального страхования, кредитный рейтинг. Это большой объем данных, однако не все они необходимы для создания профиля знакомств. Вам нужно только выбрать информацию, которая имеет отношение к вашему приложению знакомств из этого пула. Такие данные, как полное имя, любимая еда, любимый фильм и хобби, имеют смысл для приложения для знакомств. Процесс извлечения/удаления/выбора информации о пользователе из большего пула называется абстракцией. Одним из преимуществ Abstraction является возможность применять ту же информацию, которую вы использовали для приложения для знакомств, к другим приложениям с небольшими изменениями или без изменений.
НаследованиеНаследование — это способность одного объекта приобретать некоторые/все свойства другого объекта. Например, ребенок наследует черты своих родителей. При наследовании возможность повторного использования является основным преимуществом. Вы можете повторно использовать поля и методы существующего класса. В Java существуют различные типы наследования: одиночное, множественное, многоуровневое, иерархическое и гибридное. Например, Apple — это фрукт, поэтому предположим, что у нас есть класс Fruit и его подкласс с именем Apple. Наше яблоко приобретает свойства класса Fruit. Другими классификациями могут быть виноград, груша, манго и т. Д. Фрукты определяют класс продуктов, которые представляют собой зрелые завязи растения, мясистые, содержащие большое семя внутри или множество крошечных семян. Яблоко подкласса приобретает эти свойства от фруктов и обладает некоторыми уникальными свойствами, которые отличаются от других подклассов фруктов, такими как красное, круглое, углубление наверху.
ПолиморфизмПолиморфизм позволяет использовать класс точно так же, как его родитель, поэтому не возникает путаницы при смешивании типов. При этом каждый дочерний подкласс сохраняет свои собственные функции/методы такими, какие они есть. Если бы у нас был суперкласс под названием Mammal, у которого был бы метод с именем МлекопитающееSound(). Подклассами млекопитающих могут быть собаки, киты, слоны и лошади. У каждого из них будет своя собственная итерация звука млекопитающего (лай собаки, щелчки кита).
ПОДРОБНЕЕ: Основы взаимодействия GraphQL и REST API, Прототипирование и исследования UX, Диаграммы подобия и кластеризация, Создание пользовательского пользовательского интерфейса: Создание цветовой схемы
Принципы объектно-ориентированного подхода
ObjectИнкапсуляция, наследование и полиморфизм обычно даются как три фундаментальных принципа объектно-ориентированных языков (ООЛ) и объектно-ориентированная методология. Эти принципы в некоторой степени зависят от типа языка.
Объектно-ориентированные языки (OOL) делятся на две большие категории:
Как и во многих других различиях, здесь нет истинной дихотомии. категории являются крайностями спектра. Язык программирования JavaScript, например, не совсем подходит в любую категорию. Он лежит где-то посередине.
Некоторые OOL на основе классов (C++, Java, Scala и Eiffel) требуют, чтобы все переменные должны быть типизированы. Другие (Smalltalk и Ruby) этого не делают. Типизация переменных не имеет смысла в бесклассовых OOL.
Типизация — это концепция времени компиляции. Это позволяет компилятору сделать некоторые проверки правильности, которые в противном случае не будет обнаружен до тех пор, пока программа не будет выполнена.
Нетипизированные OOL часто используются для прототипирования приложения. Типизированные OOL обычно предпочтительнее для производственных приложений, потому что проверки ошибок во время компиляции точно обнаруживают ошибки. Если эти ошибки не обнаружены во время выполнения, их причина может быть очень трудно определить.
Есть два важных аспекта инкапсуляции:
- Ограничение доступа — предотвращение доступа одного объекта к другому. внутреннее состояние, например.
- Пространства имен/области действия — позволяют одному и тому же имени иметь разные значения. в разных контекстах.
Механизмы инкапсуляции необходимы для уменьшения взаимосвязей между программные компоненты. Многие механизмы инкапсуляции возникли из необъектно-ориентированных языки. Объектно-ориентированные языки добавляют дополнительные механизмы инкапсуляции.
Современные необъектно-ориентированные языки обеспечивают несколько способов инкапсуляции. механизмы.
- кодовые блоки
- подпрограммы
- единицы компиляции
Объекты — это фундаментальный механизм инкапсуляции объектно-ориентированного языков (ООЛ).
- объекты — инкапсулируют данные вместе с операциями, называемыми методы , которые обрабатывают данные или воздействуют на них.
OOL могут предоставлять дополнительные механизмы инкапсуляции.
- классы — создавайте объекты, которые имеют одинаковые члены и одинаковые реализация методов.
- пакеты — группируют вместе классы, тесно взаимодействующие друг с другом.
- вложенные объекты и классы — разрешить доступ к объектам или классам частные члены объектов или классов, в которые они вложены.
Объектно-ориентированная инкапсуляция не проста. Соблюдение таких правил, как «один объект никогда не должен обращаться к другому объекту кроме как через общедоступный интерфейс» может ослабить инкапсуляцию вынуждая вас сделать некоторые методы общедоступными, которые должны быть закрытыми.
Для решения такого рода проблем большинство ООЛ предоставляют механизмы, которые разрешить некоторым объектам доступ к закрытым методам другого объекта. Одним из примеров являются вложенные классы и анонимные конструкторы Java. C++ разрешает специальный доступ к классам, которые определены как друзья. Эти механизмы необходимы для некоторых шаблонов проектирования.
В OOL есть два типа наследования
- наследование интерфейса и
- наследование реализации.
Наследование интерфейса необходимо только в типизированных OOL. Лучше всего это становится понятно при рассмотрении дизайна на основе делегирования. узоры.
Механизмы наследования реализации зависят от типа OOL.
- Для основанных на классах OOL классы наследуются от классов.
- Для бесклассовых OOL объекты наследуются от объектов.
Полиморфизм — это способность различных объектов реагировать на одно и то же сообщение разными способами. Полиморфизм необходим для моделирования нашего мира, в том числе нашего социального Окружающая среда. Мы часто используем одни и те же фразы и предложения для обозначения разные вещи в разных контекстах. Часто есть абстрактное сходство, но конкретные различия.
Например, скажите следующее предложение двум разным архитекторам и вы, скорее всего, получите два дома: «Построй мне дом». Абстрактно, оба архитектора будут делать одно и то же, но многие из детали будут отличаться.
В ранней методологии структурированного проектирования было три основных типа элементов управления или структуры данных: последовательность, изменение и репетиция. Полиморфизм часто используется как альтернатива чередованию.
Полиморфизм реализуется с помощью механизма диспетчеризации. Этот механизм может зависеть только от объекта, который получает сообщение или оно также может зависеть от параметров сообщения.
Чередование — один из первых принципов программирования: последовательность, чередование, повторение. Программа состоит из инструкций, которые выполняются последовательно (последовательность), за исключением языковых конструкций, допускающих различные последовательности инструкций, основанные на условиях (чередование) и конструкции, повторяющие последовательность инструкций (повторение). Большинство необъектно-ориентированных языков программирования предоставляют если , if. .else и случай или переключатель формы заявления как чередующиеся конструкции.
В объектно-ориентированных языках существует другая конструкция чередования: отправить сообщение переменной. Вы получаете другой код для выполнения, назначая новый объект переменная. Различные объекты, которые могут быть назначены переменной, могут реагировать к сообщению по-разному. Эта идея лежит в основе многих шаблонов проектирования.
Некоторые OOL, например Scala, поддерживают параметрический полиморфизм . Это означает, что выбор кода, выполняемого в ответ на сообщение зависит как от получателя, так и от параметров сообщения. Простейшая форма полиморфизма для реализации — выбор кода. зависит только от получателя сообщения. Это называется непараметрическим полиморфизмом.
Для языков, не поддерживающих параметрический полиморфизм напрямую, методы шаблона проектирования «Посетитель» могут быть использованы для достижения того же эффект.
Диспетчеризация относится к механизму выбора кода, выполняемого в ответ на сообщение. Отправка называется множественной отправкой при параметрическом поддерживается полиморфизм.
Принципы объектно-ориентированного программирования | by Braxton Massengale
Прежде всего, что такое объектно-ориентированное программирование (ООП)? Итак, мы открываем Википедию, выполняем быстрый поиск и вуаля, у нас есть ответ:
Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на концепции «объектов», которые могут содержать данные и код: данные в в форме полей (часто называемых атрибутами или свойствами) и кода в форме процедур (часто называемых методами).
Хорошо, но что это значит? Что такое парадигма программирования? Что такое поля или процедуры? Если вы новичок в программировании и читаете это определение, то понятно, что сначала вы запутались. Итак, давайте разберемся.
Объект именно таков: объект. Подумайте о любом объекте в реальном мире: машине, доме, человеке, кредитной карте, что угодно. Все, что вы можете придумать, может быть представлено как объект в коде. Атрибуты объекта, такие как порода собаки, номер кредитной карты или запас топлива автомобиля, — все это называется полями. Любой атрибут объекта может быть описан в коде. Процедуры или методы — это действия, которые может выполнять данный объект. Автомобиль может двигаться, собака может лаять, а кредитная карта может быть использована для покупки чего-либо.
Отлично, значит, объект такой же, как и в реальном мире, но как его создать в коде? Чтобы создать объект в коде, нам нужно сделать план этого объекта. Мы пишем фрагмент кода, в котором подробно описываются все поля и методы, которые будут у объекта при его создании. Этот план называется классом. Если у нас есть класс House, нам нужно вызывать этот класс каждый раз, когда мы хотим построить новый дом. Каждый новый дом, который мы делаем, называется экземпляром.
Класс дома, также известный как план дома Создание нового объекта дома под названием ourHouseХорошо, хорошо. Итак, мы лучше понимаем, что такое объект, но что такое парадигма программирования? Ну, это просто более элегантный способ сказать «способ думать о проблемах программирования». В случае ООП это означает, что программисты подходят к проблемам, думая с точки зрения объектов. Если нам нужно сделать банковское приложение, мы можем начать решать эту проблему, подумав, какие объекты здесь задействованы. Например, клиент может быть объектом, который может иметь атрибуты (поля), такие как номер счета, и процедуры (методы), такие как возможность вносить деньги. Этот способ мышления о вещах с точки зрения объектов распространяется и на нематериальные вещи. В то время как клиент является идеальным осязаемым примером объекта, как насчет чего-то вроде учетной записи? Ну, да! Это тоже может быть объект! Могут быть даже разные объекты для текущих счетов, сберегательных счетов и инвестиционных счетов.
Круто, мы знаем, что такое объект, и мы знаем, что можем использовать этот способ мышления для решения проблем программирования. Что теперь? Теперь нам нужно знать, как писать хороший объектно-ориентированный код! Для этого есть 4 столпа ООП, которых мы должны придерживаться. Они следующие:
- Инкапсуляция
- Абстракция
- Наследование
- Полиморфизм
Инкапсуляция означает, что вместо прямого доступа и управления свойствами объекта мы используем методы для достижения этого. Для доступа мы обычно используем методы, известные как геттеры, а для управления мы обычно используем методы, известные как сеттеры. Например, если мы являемся объектом клиента и хотим обновить его адрес, мы можем получить доступ к этой информации, создав метод с именем getAddress в классе клиента, который будет возвращать адрес клиента. Затем, чтобы изменить адрес клиента, мы могли бы создать функцию setAddress, которая обновляет адрес клиента. Верно, но зачем создавать эти методы, если мы можем просто сделать свойства общедоступными и получить к ним прямой доступ? Ответ заключается в том, что иметь такую легко доступную информацию рискованно. Почему? Потому что это увеличивает вероятность того, что этими данными будут манипулировать без нашего желания, чтобы ими манипулировали. Используя инкапсуляцию, мы создаем более безопасный код, который с меньшей вероятностью вызовет нежелательные манипуляции с данными.
Класс клиента с геттером и сеттером для поля адресаАбстракция означает, что вы должны показывать пользователю только необходимые детали. Когда пользователь водит машину, он не хочет знать, что поршни, приводные ремни и коленчатые валы делают свое дело. Они просто хотят знать, что нажимают на педаль газа и машина едет! Это абстракция. У нас есть метод, который мы хотим использовать из объекта, и все, что не нужно раскрывать, не раскрывается, если только специально не запрошено. Например, если у нас есть объект автомобиля, и мы хотим вызвать метод для объекта, такой как car.start(), нам не нужно знать, что включается стартер, загораются свечи зажигания, крутится коленчатый вал и т. д. Нам нужно только знать, что мы вызвали метод car. start() и машина завелась.
Наследование, как и многие аспекты ООП, это именно то, на что это похоже. У нас может быть класс, который наследует поля и методы другого класса. Например, у нас может быть класс Animal, а также класс Dog, который может наследовать все поля и методы класса Animal. Мы разработали его таким образом, потому что все собаки являются животными и должны иметь некоторые основные атрибуты, которые есть у всех животных. Примером поля для класса Animal может быть возраст. Все животные подчинены времени и как таковые имеют возраст. Неважно, собака это, медуза или слон. Помимо основных атрибутов и процедур, унаследованных от класса Animal, у собаки также могут быть свои собственные поля, такие как порода, и собственные методы, такие как лай.
Класс Animal ClassDog, наследуемый от класса AnimalПолиморфизм означает, что один и тот же объект может выполнять разные операции в зависимости от требований. Давайте рассмотрим пример с использованием полос. В примере у нас есть полоса класса, которая является просто общим классом, используемым для любой полосы.