Что такое ооп право

Обновлено: 28.06.2024

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

2. В Российской Федерации по уровням общего и профессионального образования, по профессиональному обучению реализуются основные образовательные программы, по дополнительному образованию - дополнительные образовательные программы.

3. К основным образовательным программам относятся:

1) основные общеобразовательные программы - образовательные программы дошкольного образования, образовательные программы начального общего образования, образовательные программы основного общего образования, образовательные программы среднего общего образования;

2) основные профессиональные образовательные программы:

а) образовательные программы среднего профессионального образования - программы подготовки квалифицированных рабочих, служащих, программы подготовки специалистов среднего звена;

Информация об изменениях:

Подпункт "б" изменен с 1 сентября 2021 г. - Федеральный закон от 30 декабря 2020 г. N 517-ФЗ

б) образовательные программы высшего образования - программы бакалавриата, программы специалитета, программы магистратуры, программы подготовки научных и научно-педагогических кадров в аспирантуре (адъюнктуре), программы ординатуры, программы ассистентуры-стажировки;

3) основные программы профессионального обучения - программы профессиональной подготовки по профессиям рабочих, должностям служащих, программы переподготовки рабочих, служащих, программы повышения квалификации рабочих, служащих.

4. К дополнительным образовательным программам относятся:

Информация об изменениях:

Пункт 1 изменен с 1 января 2023 г. - Федеральный закон от 30 апреля 2021 г. N 127-ФЗ

1) дополнительные общеобразовательные программы - дополнительные общеразвивающие программы, дополнительные предпрофессиональные программы;

2) дополнительные профессиональные программы - программы повышения квалификации, программы профессиональной переподготовки.

5. Образовательные программы самостоятельно разрабатываются и утверждаются организацией, осуществляющей образовательную деятельность, если настоящим Федеральным законом не установлено иное.

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

Информация об изменениях:

Часть 7 изменена с 1 сентября 2021 г. - Федеральный закон от 26 мая 2021 г. N 144-ФЗ

7. Организации, осуществляющие образовательную деятельность по имеющим государственную аккредитацию основным общеобразовательным программам (за исключением образовательных программ дошкольного образования) и образовательным программам среднего профессионального образования, разрабатывают образовательные программы в соответствии с федеральными государственными образовательными стандартами и с учетом соответствующих примерных основных образовательных программ. Организации, осуществляющие образовательную деятельность по имеющим государственную аккредитацию образовательным программам высшего образования (за исключением образовательных программ высшего образования, реализуемых на основе образовательных стандартов, утвержденных образовательными организациями высшего образования самостоятельно), разрабатывают образовательные программы в соответствии с федеральными государственными образовательными стандартами.

Информация об изменениях:

Статья 12 дополнена частью 7.1 с 1 сентября 2021 г. - Федеральный закон от 30 декабря 2020 г. N 517-ФЗ

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

Информация об изменениях:

Статья 12 дополнена частью 7.2 с 13 июля 2021 г. - Федеральный закон от 2 июля 2021 г. N 322-ФЗ

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

Информация об изменениях:

Часть 8 изменена с 1 сентября 2021 г. - Федеральный закон от 30 декабря 2020 г. N 517-ФЗ

8. Образовательные организации высшего образования, имеющие в соответствии с настоящим Федеральным законом право разрабатывать и утверждать образовательные стандарты и самостоятельно устанавливаемые требования, разрабатывают соответствующие образовательные программы высшего образования на основе таких образовательных стандартов и самостоятельно устанавливаемых требований.

Информация об изменениях:

Статья 12 дополнена частью 8.1 с 1 сентября 2021 г. - Федеральный закон от 26 мая 2021 г. N 144-ФЗ

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

Информация об изменениях:

Часть 9 изменена с 1 сентября 2021 г. - Федеральный закон от 26 мая 2021 г. N 144-ФЗ

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

Информация об изменениях:

Часть 9.1 изменена с 1 сентября 2021 г. - Федеральный закон от 26 мая 2021 г. N 144-ФЗ

9.1. Примерные основные общеобразовательные программы, примерные образовательные программы среднего профессионального образования включают в себя примерную рабочую программу воспитания и примерный календарный план воспитательной работы.

ГАРАНТ:

Образовательные программы подлежат приведению в соответствие с положениями настоящего Федерального закона (в редакции Федерального закона от 31 июля 2020 г. N 304-ФЗ) не позднее 1 сентября 2021 г.

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

Информация об изменениях:

Часть 11 изменена с 1 сентября 2021 г. - Федеральный закон от 26 мая 2021 г. N 144-ФЗ

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

12. К экспертизе примерных основных общеобразовательных программ с учетом их уровня и направленности (в части учета региональных, национальных и этнокультурных особенностей) привлекаются уполномоченные органы государственной власти субъектов Российской Федерации.

Информация об изменениях:

Часть 13 изменена с 1 сентября 2021 г. - Федеральный закон от 30 декабря 2020 г. N 517-ФЗ

13. Разработку примерных программ ассистентуры-стажировки обеспечивает федеральный орган исполнительной власти, осуществляющий функции по выработке государственной политики и нормативно-правовому регулированию в сфере культуры, примерных программ ординатуры - федеральный орган исполнительной власти, осуществляющий функции по выработке и реализации государственной политики и нормативно-правовому регулированию в сфере здравоохранения.

14. Уполномоченными федеральными государственными органами в случаях, установленных настоящим Федеральным законом, разрабатываются и утверждаются примерные дополнительные профессиональные программы или типовые дополнительные профессиональные программы, в соответствии с которыми организациями, осуществляющими образовательную деятельность, разрабатываются соответствующие дополнительные профессиональные программы.

Информация об изменениях:

Часть 15 изменена с 1 января 2023 г. - Федеральный закон от 30 апреля 2021 г. N 127-ФЗ

15. Уполномоченными федеральными государственными органами в случаях, установленных настоящим Федеральным законом, другими федеральными законами, разрабатываются и утверждаются примерные программы профессионального обучения или типовые программы профессионального обучения, в соответствии с которыми организациями, осуществляющими образовательную деятельность, разрабатываются соответствующие программы профессионального обучения.


Из своего опыта могу сказать, что всегда считал что понимал ООП, что же тут такого то — полиморфизм, инкапсуляция и наследование, но вот когда дошло до дела, то туговато пришлось. Хочу разложить всё по полочкам чтобы никто не наступил на мои грабли в будущем :)

3-principa-oop

Шаг 1.

Немного теории:

Объектно-ориентированное программирование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

В центре ООП находится понятие объекта.

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

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

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

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

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

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

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

Шаг 2.

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

Инкапсуляция позволит скрыть детали реализации, и открыть только то что необходимо в последующем использовании. Другими словами инкапсуляция – это механизм контроля доступа.

images

Зачем же это нужно?

Думаю, вам бы не хотелось, чтобы кто-то, что-то изменял в написанной вами библиотеки.

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

Цель инкапсуляции – уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса. Давайте рассмотрим, как ею пользоваться.

Существует 4 вида модификаторов доступа: public, protected, private и default.

Public – уровень предполагает доступ к компоненту с этим модификатором из экземпляра любого класса и любого пакета.

Protected – уровень предполагает доступ к компоненту с этим модификатором из экземпляров родного класса и классов-потомков, независимо от того, в каком пакете они находятся.

Default – уровень предполагает доступ к компоненту с этим модификатором из экземпляров любых классов, находящихся в одном пакете с этим классом.

Private – уровень предполагает доступ к компоненту с этим модификатором только из этого класса.

public String name; — имя, которое доступное из любого места в приложении.
protected String surname; — фамилия доступна из родного класса и потомков.
private int age; — возраст доступен только в рамках класса Human.
int birthdayYear; — хоть не указывается явный модификатор доступа, система понимает его как default, год рождения будет доступен всему пакету, в котором находится класс Human.

Для разных структурных элементов класса предусмотрена возможность применять только определенные уровни модификаторов доступа.

Для класса — только public и default.

Для атрибутов класса — все 4 вида.

Для конструкторов — все 4 вида.

Для методов — все 4 вида.

Шаг 3.

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

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

Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации.

Разберем этот механизм на классическом примере: Геометрические фигуры.

1

В этом классе мы реализуем все методы интерфейса Figure.

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

И соответственно у нас есть 3 класса самих фигур, которые наследуются от класса Figure. Класс Figure является родительским классом или классом-родителем, а классы Circle, Rectungle и Triangle — являются дочерними.

super.setColor(colour); — super модификатор, позволяющий вызывать методы из класса родителя.

Теперь каждый класс перенял свойства класса Figure. Что собственно это нам дало?

Значительно уменьшило время разработки классов самих фигур, дало доступ к полям и методам родительского класса.

Наверное возник вопрос: чем же extends отличается от implements?

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

В дочерних классах мы можем спокойно добавлять новые интересующие нас методы. Например, мы хотим добавить в класс Triangle 2-а новых метода: flimHorizontal () и flipVertical ():

2

Теперь эти 2-а метода принадлежат сугубо классу Triangle. Этот подход используется когда базовый класс не может решить всех проблем.

Или можно использовать другой подход, изменить или переписать методы в дочерним классе:

3

Довольно интересный факт: в java запрещено множественное наследование, но любой из классов по умолчанию наследуется то класса Object. То есть при наследовании любого класса у нас получается множественное наследование)

Но не стоит забивать этим голову!

Шаг 4.

Полиморфизм.

В более общем смысле, концепцией полиморфизма является идея “один интерфейс, множество методов“.

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

Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс.

Прежде всего, нужно сказать, что такое объявление корректно.

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

Компилятор может опираться только на тип ссылки, с помощью которой происходит обращение к полю:

К нему можно обратиться явно:

Переменные b и c получат значения, родительского поля a. Хотя выражение с super более простое, оно не позволит обратиться на два уровня вверх по дереву наследования.

А ведь вполне возможно, что в родительском классе это поле также было скрывающим и в родителе родителя храниться ещё одно значение.

К нему можно обратиться явным приведением, как это делается для b.

Каков будет результат для new Child.printX(); ?

Метод вызывается с помощью ссылки типа Child, но метод определен в классеParent и компилятор расценивает обращение к полю x в этом методе именно как к полю класса Parent. Результатом будет 0.

Рассмотрим случай переопределения методов:

Родительский метод полностью перекрыт.

В этом ключевая особенность полиморфизма – наследники могут изменить родительское поведение, даже если обращение к ним производиться по ссылке родительского типа.

Хотя старый метод снаружи недоступен, внутри класса-наследника к нему можно обратиться с помощью super.

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

Шаг 5.

Абстракция:

Как говорилось в начале статьи, нельзя игнорировать абстракцию, а значит и абстрактные классы и методы.

В контексте ООП абстракция — это обобщение данных и поведения для типа, находящегося выше текущего класса по иерархии.

Перемещая переменные или методы из подкласса в супер класс, вы обобщаете их. Это общие понятия, и они применимы в языке Java. Но язык добавляет также понятия абстрактных классов и абстрактных методов.

Абстрактный класс является классом, для которого нельзя создать экземпляр.

Например, вы можете создать класс Animal (животное). Нет смысла создавать экземпляр этого класса: на практике вам нужно будет создавать экземпляры конкретных классов, например, Dog (собака). Но все классы Animal имеют некоторые общие вещи, например, способность издавать звуки. То, что Animal может издавать звуки, еще ни о чем не говорит.

Издаваемый звук зависит от вида животного.

Как это смоделировать?

Определить общее поведение в абстрактном классе и заставить подклассы реализовывать конкретное поведение, зависящее от их типа.

В иерархии могут одновременно находиться как абстрактные, так и конкретные классы.

Использование абстракции:

Наш класс Person содержит некоторый метод поведения, и мы пока не знаем, что он нам необходим. Удалим его и заставим подклассы реализовывать это поведение полиморфным способом. Мы можем сделать это, определив методы Person как абстрактные. Тогда наши подклассы должны будут реализовывать эти методы.

Что мы сделали в приведенном выше коде?

Мы изменили Person и указали методы как abstract , заставив подклассы реализовывать их.
Мы сделали Adult подклассом Person и реализовали эти методы.
Мы сделали Baby подклассом Person и реализовали эти методы.

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

Теперь, поскольку Adult и Baby являются подклассами Person , мы можем обратиться к экземпляру каждого класса как к типу Person.

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

ООП (или объектно-ориентированное программирование) представляет собой способ организации кода программы, когда основными строительными блоками программы являются объекты и классы, а логика работы программы построена на их взаимодействии.

Об объектах и классах

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

Допустим, нам нужно написать программу, рассчитывающую периметр и площадь треугольника, который задан двумя сторонами и углом между ними. Для написания такой программы используя ООП, нам необходимо будет создать класс (то есть структуру) Треугольник. Класс Треугольник будет хранить три поля (три переменные): сторона А, сторона Б, угол между ними; и два метода (две функции): посчитать периметр, посчитать площадь. Данным классом мы можем описать любой треугольник и вычислить периметр и площадь. Так вот, конкретный треугольник с конкретными сторонами и углом между ними будет называться экземпляром класса Треугольник. Таким образом класс - это шаблон, а экземпляр - конкретная реализация шаблона. А вот уже экземпляры являются объектами, то есть конкретными элементами, хранящими конкретные значения.

Одним из самых распространенных объектно-ориентированных языков программирования является язык java. Там без использования объектов просто не обойтись. Вот как будет выглядеть код класса, описывающего треугольник на этом языке:

Если мы внутрь класса добавим следующий код:

то программу уже можно будет запускать на выполнение. Это особенность языка java. Если в классе есть такой метод

то этот класс можно выполнять. Разберем код подробнее. Начнем со строки

Здесь мы создаем экземпляр triangle1 класса Triangle и тут же задаем ему параметры сторон и угла между ними. При этом, вызывается специальный метод, называемый конструктор и заполняет поля объекта переданными значениями в конструктор. Ну, а строки

выводят рассчитанные площадь треугольника и его периметр в консоль.

Аналогично все происходит и для второго экземпляра класса Triangle .

Понимание сути классов и конструирования конкретных объектов - это уверенный первый шаг к пониманию методологии ООП.

Еще раз, самое важное:

ООП - это способ организации кода программы;

Класс - это пользовательская структура данных, которая воедино объединяет данные и функции для работы с ними(поля класса и методы класса);

Объект - это конкретный экземпляр класса, полям которого заданы конкретные значения.

Три волшебных слова

ООП включает три ключевых подхода: наследование, инкапсуляцию и полиморфизм. Для начала, приведу определения из wikipedia:

Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Некоторые языки (например, С++) отождествляют инкапсуляцию с сокрытием, но большинство (Smalltalk, Eiffel, OCaml) различают эти понятия.

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

Полиморфизм — свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

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

Итак, точка — это самая малая геометрическая фигура, которая является основой всех прочих построений (фигур). Поэтому именно точка выбрана в качестве базового родительского класса. Напишем класс точки на java:

У получившегося класса Point пустой конструктор, поскольку в данном примере мы работаем без конкретных координат, а оперируем только параметрами значениями сторон. Так как у точки нет никаких сторон, то и передавать ей никаких параметров не надо. Также заметим, что класс имеет методы Point::getSquare() и Point::getPerimeter() для расчета площади и периметра, оба возвращают 0. Для точки оно и логично.

Поскольку у нас точка является основой всех прочих фигур, то и классы этих прочих фигур мы наследуем от класса Point . Опишем класс отрезка, наследуемого от класса точки:

означает, что класс LineSegment наследуется от класса Point . Методы LineSegment::getSquare() и LineSegment::getPerimeter() переопределяют соответствующие методы базового класса. Площадь отрезка всегда равняется нулю, а площадь периметра равняется длине этого отрезка.

Теперь, подобно классу отрезка, опишем класс треугольника(который также наследуется от класса точки):

Тут нет ничего нового. Также, методы Triangle::getSquare() и Triangle::getPerimeter() переопределяют соответствующие методы базового класса.
Ну а теперь, собственно, тот самый код, который показывает волшебство полиморифзма и раскрывает мощь ООП:

Мы создали массив объектов класса Point , а поскольку классы LineSegment и Triangle наследуются от класса Point , то и их мы можем помещать в этот массив. Получается, каждую фигуру, которая есть в массиве figures мы можем рассматривать как объект класса Point . В этом и заключается полиморфизм: неизвестно, к какому именно классу принадлежат находящиеся в массиве figures объекты, но поскольку все объекты внутри этого массива принадлежат одному базовому классу Point , то все методы, которые применимы к классу Point также и применимы к его классам-наследникам.

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

Класс - описание логики поведения (через свойства и методы).

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

Интерфейс - функции, которые должен реализовать класс.

Ещё есть наследование (когда один класс расширяет другой), полиморфизм (когда класс-потомок меняет логику поведения родителя), инкапсуляция (красивое слово, которое означает "сокрытие логики" или "давай запихаем эту хрень так, чтобы её никто никогда не нашёл"). Не расстраивайтесь, если вы не знаете точного определения какого-то из модных программерских слов, в 99% случаев можете сказать, что это "хрень какая-то", не ошибётесь.

Важно помнить: в ООП данные хранятся в объектах, а логика в классах. Объекты всегда создаются из класса.

Код без ООП ¶

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

Код выше выведет список всех пользователей, даже если их миллион. Если мы хотим работать со списком в более удобном формате, то нужно сделать постраничную навигацию:

Давайте добавим в вывод ещё тэги HTML, чтобы список был более красивым:

Для полного счастья здесь не хватает разделения чётных и нечётных строк. Давайте добавим:

Как видите, код получился, мягко говоря, не очень красивый и понятный. Такой код называют "смешанный" или "грязный" (ну или "говнокод"). Тут переплетается высокоуровневая логика (показ списка пользователей, постраничная навигация) и низкоуровневое форматирование (HTML-тэги, экранирование, обращение к массиву и так далее).

А что будет, если нам скажут, что имя пользователя должно быть ссылкой? А что будет, если вместо списка потребуется таблица со множеством колонок? А что будет, если нам надо будет выгрузить список в PDF? А что будет, если . (в этом месте можно подставить любые обстоятельства).

Если код оставить в том виде, в котором он сейчас есть, то рано или поздно он перестанет быть управляемым и начнёт диктовать разработчикам свои условия. То есть вместо того, чтобы добавлять новые плюшки, программист будет больше думать, как бы не сломать старое.

Философия ООП ¶

Первое, что нужно понять, ООП это лишь один из способов организации кода. С помощью объектов мы разделяем большую логику на на много маленьких, чтобы нам легче было управлять своим же кодом. Это значит, что не нужно во все места совать классы и интерфейсы. Если ООП не упрощает код, а только запутывает, то это неправильное ООП! Каждый раз спрашивайте себя: "А что я упрощу, если сделаю объект?"

Но давайте вернёмся к примеру выше и посмотрим, как можно упростить себе жизнь.

Первое, на что нужно обратить внимание, это то, что мы работаем с пользователем как с массивом:

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

Давайте создадим класс пользователя, который на вход принимает данные пользователя и имеет функцию для возврата имени:

Исправим объявление списка:

Теперь для доступа к имени пользователя можно использовать функцию $user->name() . Мы "спрятали" (инкапсулировали) структуру исходного массива с данными пользователя за функциями класса User . Если исходный массив поменяется, то изменения нужно будет внести только в функции класса.

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

Изменим объявление исходных данных:

Теперь можно обращаться к нашим данным так:

Осталось решить проблему с форматом вывода пользователей. Дело в том, что echo в этом цикле является низкоуровневой логикой, которую надо "прятать". Собственно, foreach также является лишним звеном в этой цепочке. В идеале логику отображения нужно вынести в шаблон и передавать ему список пользователей:

Шаблон представляет из себя псевдо язык разметки, в котором в теории удобно делать вёрстку:

Основная цель таких шаблонов - разделить логику отображения от логики данных. Преимущество, которое нам дают шаблоны заметны сразу: основной код стал "чище" и проще. Ходят легенды, что подобные шаблоны могут делать дизайнеры, верстальщики, папы, мамы, кошки без участия программистов. То есть налицо разделение труда (а если вспомнить историю за 5-й класс, то это уже прогресс в развитии).

Когда нужно использовать ООП ¶

Вот ситуации, когда, на мой взгляд, ООП даёт преимущества:

Когда НЕ нужно использовать ООП ¶

Я часто слышу мнение, что ООП нужно использовать везде и всегда. Нет! ООП должно помогать программисту писать код, а не превращать его жизнь в ад из "высоких стандартов опп".

Ситуации, когда ООП не даст вам преимуществ:

  1. Однофайловые скрипты Бывают ситуации, когда нужно сделать что-то быстро и одноразово. Например, выгрузку или отчёт. НЕ нужно тратить время на продумывание объектов и разнесение логики. Сделайте всё в одном файле. Это будет быстрее и проще для изменения. Удалить один файл легче, чем выковыривать потом классы по всему проекту.
  2. Отчёты Три раза подумайте перед тем, как пытаться сделать "универсальный построитель отчётов". Логику в больших отчётах далеко не всегда можно описать идиомами ООП. Лучше использовать однофайловые скрипты с простой линейной логикой, чем тратить время на придумывание монстров из классов.
  3. SQL-билдеры Чем проще SQL, тем крепче спит программист. Если вы используете ООП для генерирования SQL, то и понятия не имеете, насколько сложным будет конечный запрос. А что ещё хуже, билдеры имеют свои баги, которые приводят к скрытым ошибкам проекта. Вообще, SQL в проектах нужен только в двух местах: отчётах и репозиториях. Но в отчётах слишком сложный SQL, чтобы использовать билдер, а в репозиториях слишком простой.
  4. MVC в популярных PHP-фрейморках Я уже писал о проблемах MVC в PHP. Если кратко, то использование MVC приносит больше вреда, чем пользы, из-за неправильного понимания самого шаблона. Классы-контроллеры пухнут и превращаются в монстров, которыми сложно управлять. Единственный плюс MVC, это наличие шаблонов. Но шаблоны можно подключить и без MVC,

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

Читайте также: