ООП
Last updated
Last updated
Процедурное программирование — набор не связанных явно функций и переменных для хранения и обработки информации. Этот подход прост и прямолинеен, но при росте кодовой базы результатом может быть то, что называется spaghetti code — тесно связанный код.
Ниже имеем процедурный код: не связанные переменные и функция для подсчета результата.
Объектно-ориентированное программирование (ООП) — методология, основанная на представлении программы в виде совокупности объектов, каждый из которых содержит данные (свойства) и методы для взаимодействия с ними.
Используем ООП, собрав данные в объект employee.
При таком подходе у метода нету параметров, используются свойства объекта, которые настраиваются при создании объекта и, возможно, так же изменяются другими методами. На выходе имеем сущность с простым интерфейсом, что понижает сложность программы и повышает повторное использование кода в других частях программы.
Идеологически, ООП - это подход к программированию как к моделированию, решающий основную задачу - структурирование информации с точки зрения управляемости, что существенно улучшает контроль процесса моделирования. Это крайне важно при реализации крупных проектов.
Представьте себе, что мы проектируем автомобиль. У него будет двигатель, четыре колеса, бензобак и т. д. Автомобиль должен иметь возможность заводиться, набирать и сбавлять скорость. Мы знаем как взаимодействует двигатель и колёса, то есть согласно каким законам взаимодействуют разные части машины.
Мы описываем все запчасти из которых состоит автомобиль, то каким образом эти запчасти взаимодействуют между собой и что должен сделать водитель, чтобы машина затормозила, включились фары и другое. Результатом нашей работы будет некоторый эскиз (шаблон, схема). Мы только что разработали то, что в ООП называется класс.
Класс — способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).
В нашем случае, класс описывает сущность – автомобиль. Свойствами класса будут двигатель, колеса, фары и т. д. Методами класса будут открыть дверь, завести двигатель, увеличить скорость и т. п.
Мы спроектировали чертежи и машины, разработанные по ним, сходят с конвейера. Каждая из них точно повторяет чертеж, все системы взаимодействуют именно так, как мы спроектировали, но каждая машина уникальна. Они все имеют номер кузова и двигателя, но все номера разные, автомобили различаются цветом, отделкой салона. Эти автомобили являются экземплярами класса.
Объект (экземпляр) — это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом. Это то, что создано по чертежу, то есть по описанию из класса.
Говоря простым языком, объект имеет конкретные значения свойств и методы, работающие с этими свойствами на основе правил, заданных в классе. В данном примере, если класс - это некоторый абстрактный автомобиль на чертеже, то объект — это конкретный автомобиль, стоящий у нас под окнами.
Когда мы подходим к автомату с кофе или садимся за руль автомобиля, существует некоторый набор элементов управления, с которыми мы можем взаимодействовать.
Интерфейс — это набор свойств и методов класса, доступных для использования при работе с экземпляром.
По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним. Хороший пример интерфейса — приборная панель автомобиля, которая позволяет вызвать такие методы как увеличение скорости, торможение, поворот, переключение передач, включение фар и т. п.
При описании интерфейса класса очень важно соблюсти баланс между гибкостью и простотой. Класс с простым интерфейсом будет легко использовать, но будут существовать задачи, которые с помощью него решить будет не под силу. Если интерфейс будет гибким, то скорее всего, он будет состоять из достаточно сложных методов с большим количеством параметров, которые будут позволять делать очень многое, но его использование будет сопряжено с большими сложностями и риском совершить ошибку, что-то перепутав.
ООП построено на четырех основных понятиях: инкапсуляция, абстракция, наследование и полиморфизм.
Внутренние процессы работы автомобиля довольно сложны. Но все эти действия скрыты от пользователя и позволяют ему крутить руль и нажимать на педаль газа, не задумываясь, что в это время происходит внутри. Именно сокрытие внутренних процессов, происходящих в автомобиле, позволяет эффективно его использовать даже новичкам. Это и есть инкапсуляция.
Инкапсуляция (encapsulation) — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.
Инкапсуляция неразрывно связана с понятием интерфейса класса. Всё то, что не входит в интерфейс, инкапсулируется (скрыто) в классе. Пользователь может работать со всем функционалом через интерфейс, не задумываясь над тем, как реализован функционал.
Представьте, что водитель едет в автомобиле по оживлённому участку движения. Понятно, что в этот момент он не будет задумываться о химическом составе краски автомобиля, особенностях взаимодействия шестерёнок в коробке передач или влияния формы кузова на скорость. Однако руль, педали, указатель поворота он будет использовать регулярно.
Абстрагирование (abstraction) — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые.
Представим, что инженерам поставили задачу разработки и выпуска модельного ряда более современных автомобилей. При этом у них уже есть старая модель, которая отлично зарекомендовала себя. Очевидно, что инженеры не будут проектировать новый автомобиль с нуля, а взяв за основу предыдущее поколение, внесут ряд конструктивных изменений.
Все модификации будут иметь большинство свойств прежней модели. При этом каждая из моделей будет реализовать некоторую новую функциональность или конструктивную особенность. В данном случае, мы имеем дело с наследованием.
Наследование (inheritance) — это свойство системы, позволяющее описать новый класс на основе уже существующего, с частично или полностью заимствующимся функционалом. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс называется потомком, наследником или производным классом.
Если взять пример из жизни, у нас есть HTML-элементы. В следующих модулях мы узнаем что все они представлены объектами. У них есть общие свойства и методы для управления состоянием. Вместо того, чтобы добавлять общие свойства на каждый тип элемента, мы можем описать их в классе HTMLElement и те элементы, которым нужен подобный интерфейс, могут наследовать от HTMLElement. Наследование помогает уменьшить объем повторяющегося кода.
Любое обучение вождению не имело бы смысла, если бы человек, научившийся водить, скажем, Audi не мог потом водить BMW или любой другой автомобиль. С другой стороны, можно представить управление автомобилем используя джойстик или мышку с клавиатурой, а поведение автомобиля будет идентичным как если бы использовали руль.
Всё дело в том, что основные элементы управления автомобиля имеют одну и ту же конструкцию и принцип действия. По сути, можно сказать, что все автомобили имеют один и тот же интерфейс, а водитель, абстрагируясь от сущности автомобиля, работает именно с этим интерфейсом. Независимо от того, каким образом будет реализовываться движение и внутреннее функционирование машины, интерфейс останется прежним.
Полиморфизм (polymorphism) — это свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Позволяет переопределять в классах наследниках реализации методов базового класса.