Основные принципы ооп: инкапсуляция, наследование, полиморфизм
Содержание:
- Наследование[]
- Ключевые принципы ООП
- Способы и направления поддержки детской инициативы
- Принципы ООП
- Что такое объектно-ориентированное программирование (ООП)
- Особенности образовательной деятельности разных видов и культурных практик
- OОП – это парадигма. Что такое парадигма?
- Поля
- Наследование
- Структура объектно-ориентированного программирования
- Классы
- Инкапсуляция в Java
- Методы
- Роль наследования
- Плюсы и минусы объектно-ориентированных языков программирования
- Плюсы и минусы ООП
- Класс
Наследование[]
Наследование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Простое наследование:
Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class).
В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
Множественное наследование
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.
Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.
Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.
Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.
Ключевые принципы ООП
Объектно-ориентированное программирование исповедует ряд принципов, лежащих в основе правил создания и использования всех структурных элементов, включая классы, объекты, методы и прочие компоненты.
Инкапсуляция
Этот принцип гласит, что вся важная информация, необходимая для работы объекта, в нем же и хранится. И только определенные данные доступны для внешних функций и объектов.
Данные конкретного объекта или класса хранятся в пределах этого объекта или класса. Вносить в них изменения, используя другие классы, нельзя. У окружения есть право только запрашивать «публичные» методы и атрибуты.
Такой подход обеспечивает повышенный уровень безопасности, а также сокращает шансы на случайное повреждение данных внутри какого-то класса или объекта со стороны.
Наследование
Это как раз основная суть взаимоотношений между классами и объектами, описанная выше. Чтобы не создавать кучу одинаковых объектов или классов, можно создать класс над классами с более общими характеристики и функциями, а потом постепенно наследовать от него те или иные возможности. Используя специальную конструкцию, программист может забрать из класса ряд атрибутов или методов, оставить их в прежнем виде и дополнить новыми или же слегка переосмыслить на свое усмотрение, а потом создать из них уникальный объект или подкласс для дальнейшего наследования опций.
Это проще понять на примере со средствами передвижения:
-
Берем абстрактный класс «Средство передвижения» с возможностью набирать скорость и перевозить людей.
-
Из него формируем подкласс «Автобус», наследующий базовые характеристики и уточняющий их определенным количеством мест для людей и пределом скорости.
-
Затем создаем объект «Икарус» с более конкретной скоростью, планировкой, количеством дверей, типом сигнала и другими специфичными параметрами.
Не нужно каждый раз создавать новый класс или объект с полным набором опций. Достаточно воспользоваться конструкцией в духе и дополнить код конкретикой.
Абстракция
Каждый верхний слой над объектом (классы) более абстрактный, чем его «младшая версия». Это позволяет не переписывать по 10 раз один и тот же объект, указывая одни и те же атрибуты и методы. Напротив, абстрактные классы позволяют создавать все более конкретные классы и вытекающие из них объекты, не описывая реализацию функций заранее (в этом и суть абстракции), а оставляя исключительно базовый шаблон для дальнейших надстроек.
Полиморфизм
Один из ключевых принципов ООП, позволяющий использовать одни и те же методы для обработки различных типов данных. Полиморфизм в разных языках программирования отличается: есть строго типизированные языки в духе C++, где задействуется «перегрузка», а есть такие языки, как JavaScript, где по умолчанию функции могут обрабатывать разные типы информации без необходимости указывать тип заранее.
Полиморфизм позволяет с помощью идентичных методов обрабатывать разные типы данных, например двузначные числа и числа с плавающей точкой. Также полиморфизмом считается возможность переопределять методы в дочерних классах для обработки других видов данных или выполнения дополнительных действий при вызове аналогичного метода.
Способы и направления поддержки детской инициативы
1-е направление. Деятельностные инициативы.
Способы поддержки:
Способы поддержки деятельностных инициатив.
•Способы поддержки игровой инициативы.
Пример. Игровые инициативы.
подготовка необходимых атрибутов, способствующих развертыванию игровых сюжетов;
обогащение представлений детей об особенностях деятельности людей определенных профессий, о трудностях и опасностях, о достижениях в профессиональной деятельности;
создание проблемно-игровых ситуаций, стимулирующих продолжение игры;
…
•Способы поддержки познавательных инициатив.
— Проектная деятельность.
Способы поддержки коммуникативной инициативы.
•Способы поддержки художественно-творческих инициатив.
— Проектная деятельность.
•2-е направление. Социальные инициативы.
Способы поддержки.
•Ситуации заботы (о малышах, о старших…)
•Ситуации правило творчества («Мы – дружные ребята» и др.)
Принципы ООП
Абстракция
Абстракция — это выделение основных, наиболее значимых характеристик объекта и игнорирование второстепенных.
Любой составной объект реального мира — это абстракция. Говоря «ноутбук», вам не требуется дальнейших пояснений, вроде того, что это организованный набор пластика, металла, жидкокристаллического дисплея и микросхем. Абстракция позволяет игнорировать нерелевантные детали, поэтому для нашего сознания это один из главных способов справляться со сложностью реального мира. Если б, подходя к холодильнику, вы должны были иметь дело с отдельно металлом корпуса, пластиковыми фрагментами, лакокрасочным слоем и мотором, вы вряд ли смогли бы достать из морозилки замороженную клубнику.
Полиморфизм
Полиморфизм подразумевает возможность нескольких реализаций одной идеи. Простой пример: у вас есть класс «Персонаж», а у него есть метод «Атаковать». Для воина это будет означать удар мечом, для рейнджера — выстрел из лука, а для волшебника — чтение заклинания «Огненный Шар». В сущности, все эти три действия — атака, но в программном коде они будут реализованы совершенно по-разному.
Наследование
Это способность одного класса расширять понятие другого, и главный механизм повторного использования кода в ООП. Вернёмся к нашему автосимулятору. На уровне абстракции «Автотранспорт» мы не учитываем особенности каждого конкретного вида транспортного средства, а рассматриваем их «в целом». Если же более детализировано приглядеться, например, к грузовикам, то окажется, что у них есть такие свойства и возможности, которых нет ни у легковых, ни у пассажирских машин. Но, при этом, они всё ещё обладают всеми другими характеристиками, присущими автотранспорту.
Мы могли бы сделать отдельный класс «Грузовик», который является наследником «Автотранспорта». Объекты этого класса могли бы определять все прошлые атрибуты (цвет, год выпуска), но и получить новые. Для грузовиков это могли быть грузоподъёмность, снаряженная масса и наличие жилого отсека в кабине. А методом, который есть только у грузовиков, могла быть функция сцепления и отцепления прицепа.
Инкапсуляция
Инкапсуляция — это ещё один принцип, который нужен для безопасности и управления сложностью кода. Инкапсуляция блокирует доступ к деталям сложной концепции. Абстракция подразумевает возможность рассмотреть объект с общей точки зрения, а инкапсуляция не позволяет рассматривать этот объект с какой-либо другой.
Вы разработали для муниципальных служб класс «Квартира». У неё есть свойства вроде адреса, метража и высоты потолков. И методы, такие как получение информации о каждом из этих свойств и, главное, метод, реализующий постановку на учёт в Росреестре. Это готовая концепция, и вам не нужно чтобы кто-то мог добавлять методы «открыть дверь» и «получить место хранения денег». Это А) Небезопасно и Б) Избыточно, а также, в рамках выбранной реализации, не нужно. Работникам Росреестра не требуется заходить к вам домой, чтобы узнать высоту потолков — они пользуются только теми документами, которые вы сами им предоставили.
Что такое объектно-ориентированное программирование (ООП)
ООП — это подход к программированию, который распознает жизнь в том виде, в каком мы ее знаем, как совокупность объектов, которые работают в тандеме друг с другом для решения конкретной проблемы под рукой. Главное, что нужно знать об ООП, — это инкапсуляция, то есть идея, что каждый объект, содержащий программу, самодостаточен, что означает, что все компоненты, составляющие объект, находятся внутри самого объекта. Теперь, поскольку каждый модуль в рамках этой парадигмы самодостаточен, объекты могут быть взяты из одной программы и использованы для решения другой имеющейся проблемы с небольшими изменениями или без изменений.Преимущества
- Благодаря модульности и инкапсуляции, ООП предлагает простоту управления
- ООП имитирует реальный мир, облегчая понимание
- Поскольку объекты являются цельными внутри себя, они могут использоваться в других программах
Недостатки
- Объектно-ориентированные программы, как правило, работают медленнее и занимают много памяти
- Чрезмерная обобщение
- Программы, созданные с использованием этой парадигмы, могут занять больше времени
Особенности образовательной деятельности разных видов и культурных практик
•Образовательная деятельность и культурные практики, осуществляемые в утренний отрезок времени, включают:
Пример:
наблюдения — в уголке природы, за деятельностью взрослых (сервировка стола к завтраку);
индивидуальные игры и игры с небольшими подгруппами детей (дидактические, развивающие, сюжетные, музыкальные, подвижные и пр.);
создание практических, игровых, проблемных ситуаций и ситуаций общения, сотрудничества, гуманных проявлений, заботы о малышах в детском саду, проявлений эмоциональной отзывчивости ко взрослым и сверстникам;
трудовые поручения (подготовка рабочего места к организованному виду деятельности, уход за комнатными растениями и пр.);
беседы и разговоры с детьми по их интересам;
…
•Образовательная деятельность и культурные практики, осуществляемые во время прогулки, включают: …
•Образовательная деятельность и культурные практики, осуществляемые во второй половине дня, включают: …
•Примерный перечень и количество видов непрерывной образовательной деятельности в течение недели
OОП – это парадигма. Что такое парадигма?
Вот какие видения парадигмы программирования можно встретить. Парадигма – подход к проектированию программ; взгляд на саму структуру программы; стиль написания программ; «описание намерений программиста»; способ мышления о программе; вычислительная модель. Парадигма программирования определяет, как компьютер организует вычисления при исполнении программы.
Объектно-ориентированное программирование – не единственная парадигма. Существуют, например, процедурная, структурная, аспектно-ориентированная, объектно-ориентированная; метапрограммирование; функциональная, логическая и др. По мере развития программист учится работать с разными парадигмами, расширяет кругозор.
Поля
Поле представляет собой переменную любого типа, объявленную внутри класса. Через модификатор доступа можно управлять уровнем доступа к полю (так же как для методов), через ключевое слово static можно определять принадлежность поля объекту либо классу:
class DemoClass { // ... int field = 0; public int publicField = 0; public static int publicStaticField = 0; // ... }
(Код в Main):
var d9 = new DemoClass(); // Доступ к private полям запрещен // Console.WriteLine($"Get private field: {d9.field}"); // Compile ERROR // Доступ к полю объекта d9.publicField = 123; Console.WriteLine($"Get public field: {d9.publicField}"); // Get public field: 123 // Доступ к статическому полю класса DemoClass.publicStaticField = 456; Console.WriteLine($"Get public static field: {DemoClass.publicStaticField}"); // Get public static field: 456
Работать с открытыми полями напрямую (поля, которые имеют модификатор public) является плохой практикой. Если необходимо читать и изменять значение какого-либо поля, то лучше это делать через getter’ы и setter’ы – специальные методы, которые выполняют эту работу.
Создадим для класса Building методы для доступа и модификации значения поля height
class Building { float height; public float GetHeight() => height; public float SetHeight(float height) => this.height = height; }
Для работы с этим классом воспользуемся следующим кодом:
var b1 = new Building(); b1.SetHeight(12); Console.WriteLine($"Height of building: {b1.GetHeight()}");
Создание специальных методов для работы с полями – возможный вариант, но в C# принят подход работы через свойства. Им посвящен следующий раздел.
Наследование
Наследование – принцип ООП в Jаva, согласно которому объект может наследовать атрибуты другого объекта. Это позволяет программисту создавать похожие объекты без повторного переопределения атрибутов:
// Если мы хотим определить собак, кошек и птиц, и мы знаем, что у всех этих // животных есть имена и возраст, мы должны создать суперкласс. // СУПЕРКЛАСС class Animal { private String name; private int age; public void identify() { System.out.println("I am an animal!"); } public void rename(String newName) { name = newName; } public String getName() { return name; } public void setAge(int newAge) { if(newAge > 0) age = newAge; } public int getAge() { return age; } } // ПОДКЛАССЫ class Dog extends Animal { public void bark() { System.out.println("Bark!"); } } class Cat extends Animal { public void meow() { System.out.println("Meow!"); } } class Bird extends Animal { public void chirp() { System.out.println("Chirp!"); } }
В теоретических основах ООП это означает, что каждая собака, кошка и птица (подклассы) будут иметь атрибуты имени и возраста. А также метод Identify, потому что они являются животными (принадлежат суперклассу Animal).
Структура объектно-ориентированного программирования
Программный код, написанный с учетом принципов ООП, четко структурируется на 4 основных элементах (иногда выделяют и больше, включая в список элементов модули и другие структуры, связанные с объектно-ориентированной парадигмой, но мы обратимся к ним позже, говоря о преимущества и принципах описываемой модели).
Объекты
И хотя в структуре ООП объекты находятся не на первом месте, мы начнем с них, так как это упрощает общее понимание парадигмы.
Объект – это кусок кода, описывающий элемент с конкретным набором характеристик и функций. Например, вы делаете видеоигру, в которой есть персонаж. Ваш герой.
Этот персонаж в коде может быть отдельным объектом с такими характеристиками, как здоровье, сила, выносливость, ловкость и урон, а также функциями (методами) – это могут быть магические способности или особые приемы, используемые персонажем.
Объекты могут описывать других персонажей и средства передвижения.
Методы
Методы – это функции, описанные внутри объекта или класса. Они относятся к конкретному объекту и позволяют взаимодействовать с ними или другими частями кода. Выше мы уже затронули «способности» персонажа-объекта, вот они и являются наиболее понятным описанием методов. Когда ваш персонаж выполняет действие в игре, он задействует метод, описанный в его объекте.
Атрибуты
Атрибуты – это конкретные характеристики объекта. Если вы хоть немного знакомы с программированием, то атрибуты можно представить в виде переменных с данными. Вернувшись к примеру с игровым персонажем, в качестве атрибутов можно представить характеристики в духе уровня выносливости, скорости и других статических показателей.
Классы
Это наиболее абстрактная и обобщенная форма в ООП. Что-то в духе шаблона, на базе которого строятся другие элементы структуры кода.
Снова поясню на примере игры. В какой-нибудь онлайн-РПГ может быть куча разных героев: воины, лучники, люди, орки. Описывать каждого по отдельности сложно и нецелесообразно, ведь у них много общих характеристик и методов.
Поэтому мы можем создать класс – то есть объект, способный стать базой для других объектов. Например, класс – персонаж. Он умеет ходить, драться, имеет характеристики наподобие уровня здоровья или количества маны, то есть атрибуты, что есть у любых рас и классов в нашей РПГ. А уже человек-воин (объект) с ником Nagibator777 будет содержать более специфичные характеристики и методы, зависящие от решений игрока и других внешних факторов. Класс – это пример абстракции и наследования, упрощающий генерацию новых объектов.
На картинках и схемах эта структура выглядит куда понятнее.
Классы
Класс в языке C# объявляется с помощью ключевого слова class перед ним могут стоять несколько модификаторов, после располагается имя класса. Если предполагается, что класс является наследником другого класса или реализует один или несколько интерфейсов, то они отделяются двоеточием от имени класса и перечисляются через запятую.
class Building { }
Внутри себя, класс может содержать методы, поля и свойства. Методы похожи на функции из языков группы структурного программирования. Фактически они определяют то, как можно работать с данным классом или объектами класса. Поля – это переменные, связанные с данным классом, а свойства – это конструкции специального вида, которые упрощают работу с полями (в первом приближении такого понимания будет достаточно).
class DemoClass { // Поле класса int field = 0; // Свойство класса public int Property {get;set;} // Метод класса public void Method() { Console.WriteLine("Method"); } }
Далее, мы подробно остановимся на каждом из перечисленных составляющих класса.
Объект класса создается также как переменная любого, уже известного вам по предыдущим урокам, типа данных. Напомним, что класс является типом данных, который мы можем самостоятельно объявить. Все встроенные типы являются определенными классами, например, переменная типа int – это объект класса System.Int32.
Создадим объект класса DemoClass
// Создание объекта класса DemoClass DemoClass demo = new DemoClass(); // Вызов метода Method объекта demo demo.Method();
С методами встроенных типов мы уже встречались ранее, например, метод поиска элемента в строке, или преобразование строки в число и т.п.
Инкапсуляция в Java
Инкапсуляция — принцип, согласно которому атрибуты объекта заключаются в этот объект. Это задает для атрибутов контекст. Это также позволяет программисту ограничить доступ к атрибутам, чтобы они изменялись и использовались только через методы, которые программист собирается применять:
// Эта переменная не инкапсулирована. // Поэтому в ней отсутствует какой-то контекст. String name; // БАЗОВАЯ ИНКАПСУЛЯЦИЯ // Эти переменные и методы инкапсулированы в классе Dog. Они являются его членами. class Dog { String name; int age; void bark() { System.out.println("Bark!"); } void rename(String newName) { name = newName; } } // МОДИФИКАТОРЫ ДОСТУПА // Приведенные выше члены доступны для любого другого // класса. Чтобы определить доступы, используются модификаторы доступа: // - default: Если модификаторы доступа отсутствуют, атрибут доступен // только для классов внутри одного пакета. // - public: атрибут доступен из любого другого класса. // - protected: То же самое, что и default, плюс он доступен для подклассов. // - private: доступен только внутри объявленного класса. class Dog { private String name; private int age; void bark() { System.out.println("Bark!"); } void rename(String newName) { name = newName; } public String getName() { return name; } public void setAge(int newAge) { if(newAge > 0) age = newAge; } public int getAge() { return age; } }
Методы
Методом класса называют функцию или процедуру, которая принадлежит классу или объекту. Отличие функции от процедуры в том, что функция возвращает значение, а процедура нет. В общем виде синтаксис объявления метода выглядит следующим образом:
модификатор(ы) тип_возвращаемого_значения имя_функции(аргументы)
Модификаторы определяют область видимости, принадлежность метода объекту или классу, является ли метод переопределением и т.п. Тип возвращаемого значения – это любой доступный в C# тип. В качестве типа возвращаемого значения не может использоваться ключевое слово var. Если метод не возвращает ничего, то указывается тип void. Метод может содержать ноль или более аргументов, которые также могут иметь специальные модификаторы, указывающие на то является ли аргумент входным или выходным и т.п. Более подробно про все эти аспекты будет рассказано в одном из уроков, посвященных более глубокому изучению ООП в C#. В рамках данного урока, наша задача – это на интуитивном уровне научиться принципам работы с классами в C#.
Работа с модификатором доступа
Если метод объявлен с модификатором public, то его можно использовать вне класса, например метод Printer из DemoClass
public void Printer() { Console.WriteLine($"field: {field}, Property: {Property}"); }
Такой метод может вызываться в любом месте программы у соответствующих объектов:
var d6 = new DemoClass(11) { Property = 12 }; d6.Printer(); // field: 11, Property: 12
Если мы объявим метод с модификатором private или без модификатора (тогда, по умолчанию, будет принят private), то его уже нельзя будет вызвать снаружи класса:
class DemoClass { // ... private void PrivateMethod() { Console.WriteLine($"Secret method"); } // ... }
(Код в методе Main):
var d7 = new DemoClass(); d7.PrivateMethod(); // Ошибка компиляции!!!
Но при этом внутри класса его вызвать можно:
class DemoClass { // ... public void PublicMethod() { Console.WriteLine($"Public method"); PrivateMethod(); } // ... }
Статические методы и методы объекта
Различают статические методы и методы объекта. Статические имеют модификатор static перед именем метода и принадлежат классу. Для вызова таких методов не обязательно создавать экземпляры класса, мы уже пользовались такими методами из класса Console – это методы Write и WriteLine. Для вызова метода объекта, необходимо предварительно создать экземпляр класса, пример – это метод PublicMethod и Priter у класса DemoClass. Добавим статический метод и метод класса в DemoClass
class DemoClass { // ... public static void StaticMethod() { Console.WriteLine("Message from static method"); } public void NoneStaticMethod() { Console.WriteLine("Message from non static method"); } // ... }
Вызовем эти методы из класса DemoClass в методе Main
DemoClass.StaticMethod(); // Message from static method var d8 = new DemoClass(); d8.NoneStaticMethod(); // Message from none static method
Методы принимающие аргументы и возвращающие значения
Как было сказано в начале данного раздела, методы могут принимать данные через аргументы и возвращать значения, продемонстрируем эту возможность на примере:
class DemoClass { // ... public int MulField(int value) { return field * value; } // ... }
(Код в Main):
var d8 = new DemoClass(10); Console.WriteLine($"MulField() result: {d8.MulField(2)}"); // MulField() result: 20
Роль наследования
Следующий принцип ООП — наследование — касается способности языка позволять
строить новые определения классов на основе определений существующих классов. По сути, наследование позволяет расширять поведение базового (или родительского) класса, наследуя основную функциональность в производном подклассе (также именуемом
дочерним классом):
Т.е. наследование представляет собой процесс, в ходе которого один объект приобретает свойства другого объекта. Это очень важный процесс, поскольку он обеспечивает
принцип иерархической классификации. Если вдуматься, то большая часть знаний
поддается систематизации благодаря иерархической классификации по нисходящей.
Если не пользоваться иерархиями, то для каждого объекта пришлось бы явно определять все его свойства. А если воспользоваться наследованием, то достаточно определить лишь те свойства, которые делают объект особенным в его классе. Он может также наследовать общие свойства своего родителя. Следовательно, благодаря механизму
наследования один объект становится отдельным экземпляром более общего класса.
Плюсы и минусы объектно-ориентированных языков программирования
Хотя языки ООП могут быть мощными, они полезны не для каждой ситуации и имеют некоторый багаж, который необходимо учитывать.
Плюсы
1. Возможность повторного использования
Объектно-ориентированный код имеет чрезвычайно модульную структуру. Благодаря полиморфизму и абстракции вы можете создать одну функцию, которую можно будет использовать снова и снова. Вы также можете скопировать информацию и функции, которые уже были написаны с помощью наследования. Это экономит время, снижает сложность, экономит место и упрощает программирование.
2. Параллельная разработка
Существует достаточно наработок для того, чтобы части программы разрабатывались отдельно друг от друга и при этом функционировали по объектно-ориентированным принципам. Это значительно упрощает параллельную разработку для более крупных команд разработчиков.
3. Обслуживание
Поскольку большая часть, если не весь, наш код находится в одном месте, вызывается и используется повторно, этот код намного проще поддерживать. Вместо того, чтобы по отдельности исправлять сотню различных случаев вызова функции, мы можем исправить одну модульную и полиморфную функцию.
4. Безопасность
Хотя большинство языков имеют некоторую безопасность, объектно-ориентированные языки удобны, поскольку безопасность встроена с инкапсуляцией. Другие методы и классы не могут получить доступ к личным данным по умолчанию, и программы, написанные на языках ООП, более безопасны для этого.
5. Модульность
В объектно-ориентированных языках программирования приложение разбивается на объекты и классы. Это полезно, потому что даёт вашему приложению более модульную структуру. Модульный код легче читать. Поэтому его легче обслуживать.
Минусы
1. Часто грязный
Поскольку объектно-ориентированные языки настолько настраиваемы и масштабируемы, можно легко потерять понимание того, как работает код. Код ООП может работать разными способами. Существует множество методологий программирования в ООП, которые не работают с другими методологиями, неэффективны или сложны в использовании.
2. Требуется больше планирования
Поскольку эти языки настолько модульны и масштабируемы, отказ от чёткой конструкции заранее — это рецепт катастрофы. Создание эффективной программы требует твёрдого плана в большей степени, чем при использовании других парадигм программирования.
3. Непрозрачность
Это как плюс, так и минус. Объекты и функции могут работать независимо. Они могут получать информацию и (обычно) возвращать надёжные результаты. В результате они могут оказаться чёрными ящиками, а это означает, что то, что они делают, не всегда очевидно. Хотя программист, вероятно, создал этот объект и знает, что он делает, языки ООП просто не так прозрачны, как другие языки.
4. Производительность
Объектно-ориентированные языки часто страдают от снижения производительности. Программы, написанные на языках ООП, часто больше и требуют больше вычислительных усилий для запуска, чем функциональные языки
Однако это не всегда так или важно. C ++ — язык ООП, но это один из самых быстрых доступных языков
В то же время скорость не всегда важна. Разница в скорости становится очевидной только при обработке огромных или сложных вычислений, или в случаях, когда требуется экстремальная скорость.
Плюсы и минусы ООП
У объектно-ориентированного программирования много плюсов, и именно поэтому этот подход использует большинство современных программистов.
- Визуально код становится проще, и его легче читать. Когда всё разбито на объекты и у них есть понятный набор правил, можно сразу понять, за что отвечает каждый объект и из чего он состоит.
- Меньше одинакового кода. Если в обычном программировании одна функция считает повторяющиеся символы в одномерном массиве, а другая — в двумерном, то у них большая часть кода будет одинаковой. В ООП это решается наследованием.
- Сложные программы пишутся проще. Каждую большую программу можно разложить на несколько блоков, сделать им минимальное наполнение, а потом раз за разом подробно наполнить каждый блок.
- Увеличивается скорость написания. На старте можно быстро создать нужные компоненты внутри программы, чтобы получить минимально работающий прототип.
А теперь про минусы:
- Сложно понять и начать работать. Подход ООП намного сложнее обычного процедурного программирования — нужно знать много теории, прежде чем будет написана хоть одна строчка кода.
- Требует больше памяти. Объекты в ООП состоят из данных, интерфейсов, методов и много другого, а это занимает намного больше памяти, чем простая переменная.
- Иногда производительность кода будет ниже. Из-за особенностей подхода часть вещей может быть реализована сложнее, чем могла бы быть. Поэтому бывает такое, что ООП-программа работает медленнее, чем процедурная (хотя с современными мощностями процессоров это мало кого волнует).
Класс
Классы, в некотором смысле, подобны чертежам: это не объекты сами по себе, а их схемы. Класс «банковских счетов» имеет строго определенные и одинаковые для всех атрибуты, но объекты в нём — сами счета — уникальны.
Как в Python создать класс
В Python классы и объекты по смыслу не отличаются от других языков. Нюансы в реализации. Для создания класса в Питоне необходимо написать инструкцию , а затем выбрать имя. В простейшем случае, класс выглядит так:
Для именования классов в Python обычно используют стиль «camel case», где первая буква — заглавная.
Конструктор
Метод, который вызывается при создании объектов, в ООП зовётся конструктором. Он нужен для объектов, которые изначально должны иметь какие-то значение. Например, пустые экземпляры класса «Студент» бессмысленны, и желательно иметь хотя бы минимальный обозначенный набор вроде имени, фамилии и группы.
В качестве Питоновского конструктора выступает метод
Атрибуты класса
Вы уже поняли, что у каждого класса есть собственный набор характеристик, который помогает описывать его сущность. Эти свойства еще называются полями или атрибутами.
Поля могут быть статическими и динамическими:
- Статические поля (поля класса) можно использовать без создания объекта. А значит, конструктор вам не нужен.
- Динамические поля (поля объекта) задаются с помощью конструктора, и тут уже, как вы видели, экземпляр нужно создать, а полям присвоить значения.
️ Обратите внимание — статический и динамический атрибут может иметь одно и то же имя:
Методы класса
Метод — это функция класса.
Например, у всех научно-фантастических космических кораблей есть бортовое оружие. И оно может стрелять.
Что такое self?
Аналог этого ключевого слова в других языках — слово . — это всего лишь ссылка на текущий экземпляр класса.
Отличный пример с котофеями:
- Все котики умеют мурлыкать;
- Эта способность реализована в классе , как метод ;
- Вы хотите, чтобы ваш кот по имени Пушок помурчал;
- Если сделать так: , то мурлыкать начнут все коты во Вселенной;
- Но так как вам нужен один конкретный кот, то нужно вызвать метод иначе: ;
- Сделано. Пушок мурлыкает.
Уровни доступа атрибутов и методов
В Питоне не существует квалификаторов доступа к полям класса. Отсутствие аналогов связки public/private/protected можно рассматривать как упущение со стороны принципа инкапсуляции.
Декораторы
Декоратор — это функция-обёртка. В неё можно завернуть другой метод, и, тем самым, изменить его функциональность, не меняя код.