Что относится к принципам ооп
Перейти к содержимому

Что относится к принципам ооп

  • автор:

Принципы объектно-ориентированного программирования

Когда речь заходит о классических паттернах проектирования, нельзя не вспомнить о самом объектно-ориентированном программировании. Ведь паттерны GoF являются паттернами именно объектно-ориентированного программирования. В функциональном же программировании есть свои собственные паттерны.

Вообще устроено все следующим образом: есть само объектно-ориентированное программирование. У него есть принципы. Из принципов объектно-ориентированного программирования следуют разобранные нам шаблоны GRASP (как вариант — SOLID принципы), из которых, в свою очередь, следуют шаблоны GoF. Из них же следует ряд интересных вещей, например, enterprise паттерны.

Объектно-ориентированная парадигма

Определение гласит, что «Объектно-ориентированное программирование – это парадигма программирования, в которой основной концепцией является понятие объекта, который отождествляется с предметной областью.»

Таким образом, система представляется в виде набора объектов предметной области, которые взаимодействуют между собой некоторым образом. Каждый объект обладает тремя cоставляющими: идентичность (identity), состояние (state) и поведение (behaviour).

Состояние объекта — это набор всех его полей и их значений.

Поведение объекта — это набор всех методов класса объекта.

Идентичность объекта — это то, что отличает один объект класса от другого объекта класса. С точки зрения Java, именно по идентичности определяется метод equals.

Принципы объектно-ориентированного программирования

Объектно-ориентированное программирование обладает рядом принципов. Представление об их количестве расходится. Кто-то утверждает, что их три (старая школа программистов), кто-то, что их четыре (новая школа программистов):

  1. Абстрация
  2. Инкапсуляция
  3. Наследование
  4. Полиморфизм

Инкапсуляция

Вопреки мнению многих собеседующихся (а иногда и собеседуемых), инкапсуляция это не «когда все поля приватные». Инкапсуляция является фундаментальнейшим принципом проектирования ПО, ее следы наблюдаются на только на уровне микро-, но и на уровне макропроектирования.

Научное определение гласит, что «Инкапсуляция – это принцип, согласно которому любой класс и в более широком смысле – любая часть системы должны рассматриваться как «черный ящик»: пользователь класса или подсистемы должен видеть только интерфейс (т.е. список декларируемых свойств и методов) и не вникать во внутреннюю реализацию.»

Таким образом, получается, что если класс A обращается к полям класса B напрямую, это приводит не к тому, что «нарушается информационная безопасность», а к тому, что класс A завязывается на внутренне устройство класса B, и попытка изменить внутреннее устройство класса B приведет к изменению класса А. Более того, класс A не просто так работает с полями класса B, он работает по некоторой бизнес-логике. То есть логика по работе с состоянием класса В лежит в классе А, и когда мы захотим переиспользовать класс В, это не удастся сделать, ведь без кусочка класса А класс В может быть бесполезным, что приведет к тому, что класс В придется отдавать вместе с классом А. Экстраполируя это на всю систему, получается, что переиспользовать можно будет только всю систему целиком.

Инкапсуляция является самым недооцененным принципом, который, к сожалению, мало кем интерпретируется правильно. Она позволяет минимизировать число связей между классами и подсистемами и, соответственно, упростить независимую реализацию и модификацию классов и подсистем.

Наследование

Наследование — это возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (суперкласса), добавляя при необходимости новые свойства и
методы.

Наследование является самым переоцененным принципом. Когда-то считалось, что «У идеального программиста дерево наследования уходит в бесконечность и заканчивается абсолютно пустым объектом», потому как когда-то люди не очень хорошо понимали то, что наследование — это способ выразить такое свойство реального мира как иерархичность, а не способ переиспользовать код, отнаследовав машину от холодильника, потому что у обоих предметов есть ручка. Наследования желательно по возможности избегать, потому что наследование является очень сильной связью. Для уменьшения количества уровней наследования рекомендуется строить дерево «снизу-вверх».

Полиморфизм

Полиморфизм — это возможность использовать классы – потомки в контексте, который был предназначен для класса – предка.

За самым садистским определением кроется возможность языка программирования для декомпозиции задачи и рефакторинга if’ов и switch’ей.

Что относится к принципам ооп

6 сентября 2023

Скопировано

Объектно-ориентированное программирование (ООП) — это подход, при котором программа рассматривается как набор объектов, взаимодействующих друг с другом. У каждого есть свойства и поведение. Если постараться объяснить простыми словами, то ООП ускоряет написание кода и делает его более читаемым.

Освойте профессию
«Fullstack-разработчик на Python»

Идеология объектно-ориентированного программирования (ООП) разрабатывалась, чтобы связать поведение определенного объекта с его классом. Людям проще воспринимать окружающий мир как объекты, которые поддаются определенной классификации (например, разделение на живую и неживую природу).

Зачем нужно ООП

До ООП в разработке использовался другой подход — процедурный. Программа представляется в нем как набор процедур и функций — подпрограмм, которые выполняют определенный блок кода с нужными входящими данными. Процедурное программирование хорошо подходит для легких программ без сложной структуры. Но если блоки кода большие, а функций сотни, придется редактировать каждую из них, продумывать новую логику. В результате может образоваться много плохо читаемого, перемешанного кода — «спагетти-кода» или «лапши».

ООП спагетти-код

В отличие от процедурного, объектно-ориентированное программирование позволяет вносить изменения один раз — в объект. Именно он — ключевой элемент программы. Все операции представляются как взаимодействие между объектами. При этом код более читаемый и понятный, программа проще масштабируется.

Объектно-ориентированное программирование используется, чтобы:

  • структурировать информацию и не допускать путаницы;
  • точно определять взаимодействие одних элементов с другими;
  • повышать управляемость программы;
  • быстрее масштабировать код под различные задачи;
  • лучше понимать написанное;
  • эффективнее поддерживать готовые программы;
  • внедрять изменения без необходимости переписывать весь код.

Возможности ООП поддерживает большинство популярных языков программирования, включая JavaScript, PHP, Python и другие.

Читайте также Востребованные IT-профессии 2023 года: на кого учиться онлайн
Профессия / 12 месяцев
Fullstack-разработчик на Python

Создавайте веб-проекты самостоятельно

dffsdd (2)

Структура ООП

Объекты и классы

Чтобы сделать код проще, программу разбивают на независимые блоки — объекты. В реальной жизни это может быть стол, чашка, человек, книга, здание и многое другое. В программировании объекты — это структуры данных: пользователь, кнопка, сообщение. У них, как и у реальных предметов, могут быть свойства: цвет, содержание или имя пользователя. А чтобы объединить между собой объекты с похожими свойствами, существуют классы.

Класс — это «шаблон» для объекта, который описывает его свойства. Несколько похожих между собой объектов, например профили разных пользователей, будут иметь одинаковую структуру, а значит, принадлежать к одному классу. Каждый объект — это экземпляр какого-нибудь класса.

Понять, что такое ООП, поможет аналогия.

  • Понятие «программист» — это класс.
  • Конкретный разработчик по имени Иван — это объект, принадлежащий к классу «программист» (экземпляр класса).
  • Зарплата, рабочие обязанности, изученные технологии и должность в компании — это свойства, которые есть у всех объектов класса «программист», в том числе у Ивана. У разных объектов свойства различаются: зарплата и обязанности Ивана будут отличаться от таковых у другого разработчика Миши.

Атрибуты и методы

Объект — это набор переменных и функций, как в традиционном функциональном программировании. Переменные и функции и есть его свойства.

Объект, класс, атрибуты и методы в ООП

Атрибуты — это переменные, конкретные характеристики объекта, такие как цвет поля или имя пользователя. Методы — это функции, которые описаны внутри объекта или класса. Они относятся к определенному объекту и позволяют взаимодействовать с ними или другими частями кода.

Принципы ООП

Объектно-ориентированное программирование определяют через четыре принципа, по которым можно понять основы работы. Иногда количество сокращают до трех — опускают понятие абстракции.

Абстракция

Абстрагирование — это способ выделить набор наиболее важных атрибутов и методов и исключить незначимые. Соответственно, абстракция — это использование всех таких характеристик для описания объекта. Важно представить объект минимальным набором полей и методов без ущерба для решаемой задачи.

Пример: объекту класса «программист» вряд ли понадобятся свойства «умение готовить еду» или «любимый цвет». Они не влияют на его особенности как программиста. А вот «основной язык программирования» и «рабочие навыки» — важные свойства, без которых программиста не опишешь.

Набор атрибутов и методов, доступный извне, работает как интерфейс для доступа к объекту. Через них к нему могут обращаться другие структуры данных, причем им не обязательно знать, как именно объект устроен внутри.

Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке

Инкапсуляция

Каждый объект — независимая структура. Все, что ему нужно для работы, уже есть у него внутри. Если он пользуется какой-то переменной, она будет описана в теле объекта, а не снаружи в коде. Это делает объекты более гибкими. Даже если внешний код перепишут, логика работы не изменится.

Инкапсуляция помогает с легкостью управлять кодом. Выше мы сказали, что для обращения к объекту не нужно понимать, как работают его методы. Начальнику разработчика Ивана не обязательно знать, как именно он программирует: главное — чтобы выполнялись поставленные задачи.

Внутреннее устройство одного объекта закрыто от других: извне «видны» только значения атрибутов и результаты выполнения методов.

Наследование

Можно создавать классы и объекты, которые похожи друг на друга, но немного отличаются — имеют дополнительные атрибуты и методы. Более общее понятие в таком случае становится «родителем», а более специфичное и подробное — «наследником».

Упомянутый программист Иван — это человек. Но «человек» — более общее определение, которое не описывает свойства, важные именно для программиста. Можно сказать, что класс «программист» унаследован от класса «человек»: программист тоже является человеком, но у него есть дополнительные свойства.

В таком случае разработчик Иван будет и человеком, и программистом одновременно. У него будут наборы свойств от обоих классов.

У одного «родителя» может быть несколько дочерних структур. Например, от «человека» можно наследовать не только «программиста», но и «директора».

Одиночное и множественное наследие в ООП

Наследование позволяет реализовывать сложные схемы с четкой иерархией «от общего к частному». Это облегчает понимание и масштабирование кода. Не нужно много раз переписывать в разных объектах одни и те же свойства. Достаточно унаследовать эти объекты от одного «родителя», и «родительские» свойства применятся автоматически.

Полиморфизм

Одинаковые методы разных объектов могут выполнять задачи разными способами. Например, у «человека» есть метод «работать». У «программиста» реализация этого метода будет означать написание кода, а у «директора» — рассмотрение управленческих вопросов. Но глобально и то, и другое будет работой.

Тут важны единый подход и договоренности между специалистами. Если метод называется delete, то он должен что-то удалять. Как именно — зависит от объекта, но заниматься такой метод должен именно удалением. Более того: если оговорено, что «удаляющий» метод называется delete, то не нужно для какого-то объекта называть его remove или иначе. Это вносит путаницу в код.

Преимущества ООП

Модульность

Объектно-ориентированный подход позволяет сделать код более структурированным, в нем легко разобраться стороннему человеку. Благодаря инкапсуляции объектов уменьшается количество ошибок и ускоряется разработка с участием большого количества программистов, потому что каждый может работать независимо друг от друга.

Гибкость

ООП-код легко развивать, дополнять и изменять. Это обеспечивает независимая модульная структура. Взаимодействие с объектами, а не логикой упрощает понимание кода. Для модификации не нужно погружаться в то, как построено ПО. Благодаря полиморфизму можно быстро адаптировать код под требования задачи, не описывая новые объекты и функции.

Экономия времени

Благодаря абстракции, полиморфизму и наследованию можно не писать один и тот же код много раз. Это ускоряет разработку нового ПО. Интерфейсы и классы в ООП могут легко преобразовываться в подобие библиотек, которые можно использовать заново в новых проектах. Также ООП экономит время при поддержке и доработке приложения.

Безопасность

Программу сложно сломать, так как инкапсулированный код недоступен извне.

Недостатки ООП

Сложный старт

Чтобы пользоваться ООП, нужно сначала изучить теорию и освоить процедурный подход, поэтому порог входа высокий.

Снижение производительности

Объектно-ориентированный подход немного снижает производительность кода в целом. Программы работают несколько медленнее из-за особенностей доступа к данным и большого количества сущностей.

Большой размер программы

Код, написанный с использованием ООП, обычно длиннее и занимает больше места на диске, чем «процедурный». Это происходит, потому что в такой программе хранится больше конструкций, чем в обычном процедурном скрипте.

Fullstack-разработчик на Python

Fullstack-разработчики могут в одиночку сделать IT-проект от архитектуры до интерфейса. Их навыки востребованы у работодателей, особенно в стартапах. Научитесь программировать на Python и JavaScript и создавайте сервисы с нуля.

Что относится к принципам ооп

Всем привет!! создала группу в телеграмм, где Java — студенты смогут не только обсуждать вопросы по изучению Java и делиться полезностями, но и организовывать живые встречи. Кому интересно, вступайте =) https://t.me/JavaCommunityMoscow

chess.rekrut Уровень 25
18 августа 2023
Nikita Dimitrienko Уровень 28
4 августа 2023

Лёгкая в усваивании лекция. Ее бы сразу всем давали. А то я вообще ещё раньше сидел и гуглил все принципы ООП. Читал столько инфы, что просто не пересчитать. А тут в 3-ёх словах всё объяснили)

Alexander Rozenberg Уровень 28
31 июля 2023
Никита Онучин Уровень 19
28 июля 2023
Хорошая лекция! Дополнила понимание ООП
ChupaFx Уровень 32
24 июля 2023
Примеры неудачные, либо неполные.
WORD SOUNDS Уровень 15
18 июля 2023
AnimalBarbershop barbershop = new AnimalBarbershop(); не понял зачем эта строка, подскажите?
Never Ending Pie Throwing Robot Уровень 30
10 июля 2023

я не могу понять принцип абстракция программист итак не будет создавать ненужные переменные и методы, зачем же из этого делать целый новый принцип ООП??

No Name Уровень 32
25 июня 2023
+ статья в копилке
20 июня 2023
Вот это точно в закрепы. Очень удачно (протсо и понятно) объяснены принципы ООП.
Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2023 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2023 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Что такое объектно-ориентированное программирование: мир и небольшие человечки

В программировании есть несколько парадигм — это набор правил и приёмов, как писать код. Вроде этикета за столом, в общественном месте. Или стиля художников конкретной эпохи: как делать мазки, какими красками пользоваться и какие объекты предпочтительно рисовать. Программисты договорились писать в одних правилах, чтобы понимать друг друга и создавать рабочие вещи. Как и стандарты художников, парадигмы со временем меняются. Раньше единственно верным было процедурное программирование. Сейчас всё зависит от задачи и умений программиста сделать просто и понятно. Одна из парадигм — объектно-ориентированное программирование. В статье расскажем о главных её принципах. Это сложная тема, поэтому углубляться в код мы не будем, а рассмотрим на примерах.

Что такое процедурное программирование

  • Либо писать длинный код. Тогда следующие разработчики будут долго разбираться и читать строки. Проще написать новую программу.
  • Либо выкидывать программу и писать новую. Тратится куча времени и сил разработчиков, чтобы переписать те же свойства: руки, ноги, голова. А к ним добавить новые — действия человечков.

Чтобы решать сложные задачи, программисты договорились и придумали для этого новые стандарты. Назвали правила объектно-ориентированным программированием.

Что такое ООП

Мир состоит из объектов: человек, котик, компьютерная мышка или плита на кухне. У человека есть всё для существования — руки, ноги, органы и т.д. Компьютерная мышка тоже имеет всё, чтобы работать: провод или беспроводной датчик, корпус, лампочки, кнопки для клика. Все объекты состоят из таких деталей — набора данных для нормальной работы.

ООП — это тоже мир, но в программировании. Он состоит из объектов, а те — из своих деталек.

Вернёмся к примеру с человечками. У каждого есть похожий набор параметров-генов. Эти параметры — первый объект. Например, строение тела.

Также, все люди могут выполнять однотипные действия — ходить, бегать, плавать и т.д. Эти параметры относятся к первому объекту. Такой себе, стандартный человечек.

Если говорить языком ООП, то руки и ноги — переменные. Это конкретный набор данных, который можно подставить для любого человечка.

Ходить и прыгать — функции. Это действия, которые может выполнять человечек. Если бы мы писали программу, то функция Человечек. Ходить — это процедурная программа. Один параметр и одно действие.

А теперь добавим другие объекты. Например, человечки из разных континентов: Африка, Азия и Европа. У них похожий набор параметров (человечек). Но есть и свои — цвет кожи, рост, вес, цвет волос, тембр речи, возраст и т.д.

По правилам процедурного программирования мы бы сложили все параметры в одну коробку — программа готова. А для нового человечка раз за разом скопипастили переменные и функции. Представьте, сколько кода!

По принципам ООП общие характеристики складываются по коробкам — объектам. А те взаимодействуют между собой. Например, коробка человечков из Европы возьмёт общие характеристики из одной коробки, добавив свои.

Как видим, коробки с параметрами человечков соединяются и между собой. В реальной жизни так получаются смешанные расы: метисы, мулаты и другие. Ничего не писали заново, а просто смешали готовые коробочки — объекты.

Так в мире можно соединяется много вещей. Например, у животных есть много функций, которыми пользуются люди: ходьба, бег, прыжки. Для овощей и фруктов своя программа на ООП. А для компьютерных мышек и клавиатур — своя. Всё взаимосвязано и находится в своих коробочках.

Главные принципы ООП

То, как соединяются объекты в ООП, определяет четыре правила: инкапсуляция, абстракция, наследование и полиморфизм. Без них в объектно-ориентированном программировании делать нечего.

Инкапсуляция — объект независим от остальных. Например, если убрать коробку с главными характеристиками человечков, то другие не перестанут работать. Они возьмут эти же характеристики, но оставят внутри своей коробочки.

Абстракция ООП — у каждого объекта есть внутренний интерфейс. Представим, что нам нужно внести в программу всех сотрудников компании.

  • Что важно для человека, как живого существа: рост, вес, органы, кровеносные сосуды.
  • А что важно для работодателя: должность, возраст, семейное положение, заработная плата.

Вторые характеристики более важные для работодателя. Они и будут в объекте «Сотрудник компании».

Если бы мы создавали объект «Спортсмен», то для него важны другие переменные и функции: рост, вес, телосложение, возраст. Параметры для работодателя ему вряд ли пригодятся. Поэтому интерфейс их не использует, даже если данные внесли по какой-то причине.

Поэтому абстракция — самостоятельный интерфейс. Нам не важно, что внутри него. Важнее то, что нам дают правильные переменные и функции: работодателю — свои. А тренеру спортивной команды — свои.

Наследование — способность копировать переменные и функции с других объектов. Пример с человечками — родовое дерево.

Каждый человек — набор генов прошлых поколений. От мамы передались голубые глаза. От папы — родинка на плече. А от дедушки — высокий рост. Это и есть наследование: взять из объектов несколько переменных и функций. А из них создать новый.

С наследованием в программировании можно не копипастить код, а создать один вариант, который понадобится для всех объектов. После объекты подключить и всё заработает. Или переиспользовать код в будущем: для новых человечков, как в примере.

Полиморфизм — язык используется без «синонимов». Например, для всех человечков действие «ходить» — это одинаковый метод. Он звучит только так. Если мы для одного человечка напишем «ходить», а для другого «карабкаться» — это разные методы.

Так можно заранее продумывать связь между модулями. Возьмём для примера сервис рассылок в интернет-магазине. Это набор объектов из товаров и покупателей. И есть набор методов — придуманных программистом действий в рассылке.

  • Например, для покупок метод .Удалить — предупредить покупателя, а после отправить в архив.
  • А для пользователя метод .Удалить — отписать от рассылки и удалить аккаунт.

Метод может работать в разных объектах по-разному. Но программист об этом знает, поэтому доверяет методу .Удалить, и не придумывает синонимы.

Плюсы и минусы ООП

У объектно-ориентированного программирование много плюсов. Поэтому подход используется почти во всех современных языках программирования.

Вот неполный перечень языков программирования, в которых поддерживаются принципы ООП: Python, C++, Ruby, C#, JavaScript, Objective-C. А, например, Java — это чистый объектно-ориентированный язык.

  1. Код просто читать. Помните структуру программы в процедурном программировании: дерево из строчек кода, где добавить элемент — переписать часть дерева и добавить корней. В ООП всё разбито на объекты и сразу понятно — из чего он состоит, и что из него берут другие объекты.
  2. Меньше копипаста. В процедурном программировании ничего необычного, если для похожего кода дважды переписывают одинаковые значения. В ООП копипаст решается принципом наследования.
  3. Сложные программы выглядят и пишутся проще. В начале статьи как пример комплексной программы мы приводили наш мир. ООП разбивает мир на маленькие блоки — их легко написать. А если нужно — подробно углубиться в конкретный объект.
  4. Программы пишутся на едином языке. Между программистами нет «языкового барьера»: работу первого легко прочитает второй. Не копаясь в дереве с кучей корней, а пройдётся от объекта к объекту. Это как читать книгу: страница за страницей.

Без минусов ООП не остался:

  1. Сложнее процедурного программирования. Нужно знать много теории: изучить строение объектов, их связь и принципы. В этой статье лишь общая информация. Если углубиться — деталей больше.
  2. Потребуется больше памяти на обслуживание кода. Объекты ООП состоят из методов, переменных, внутренних интерфейсов. Структуры занимают больше памяти, чем в процедурном программировании. Но сейчас это менее важно. У всех дома компьютеры или ноутбуки с процессорами от 4 ядер, сносной оперативной памятью и видеокартами.

ООП — одна из главных тем программирования на курсе по Python. Студенты на каждом уроке подробно рассматривают принципы парадигмы, и как их использовать в повседневной работе программиста. А через принципы учат паттерны ООП — готовые структуры кода, с которыми работать быстрее. Подробности о курсе и программе обучения по ссылке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *