Об ООП простым языком. Рассказываю, что такое объектно-ориентированное программирование на примере гужевой повозки и пресс-формы
В посте пойдет речь про одну из парадигм программирования-объектно-ориентированное программирование (ООП). ООП основан на описании в коде сущностей предметной области и их взаимодействия между собой.
Как пришли к идее ООП
Идея ООП появилась из-за глубокого желания разработчиков того времени упростить себе жизнь, ускорить разработку, сделать код более простым и легко сопровождаемым. Писать код в машинных кодах — такое себе удовольствие, поэтому придумали язык Ассемблер. На Ассемблере писать код хоть и проще, чем в машинных кодах, но все равно очень непродуктивно. Но писали и на Ассемблере бухгалтерские программы, зарплаты считали. Программа, которая написана на Ассемблере, работает максимально быстро, занимает минимум памяти. Но крайне трудоемка в сопровождении.
Программисты того времени продолжали искать способы упрощения разработки. Появлялись новые идеи, новые концепции в разных языках программирования. Все развивалось постепенно. Что-то было удачным, приживалось и развивалось, что-то нет. Проекты становились все более громоздкими. Пришло понимание, что нужна радикально иная идея, иной подход для упрощения разработки и сопровождения кода. Процедурный подход не годится для больших проектов.
Такой идеей стала попытка абстрагироваться от деталей разработки в процедурах и функциях и представить разработку кода, которая отражает суть предметной области. Это и реализовали в языке Симула — язык для симуляции объектов реального мира.
Идея оказалась удачной и ООП используется и в настоящее время. Стали появляться новые языки программирования с поддержкой ООП. Но реализации ООП в них немного отличалась. Разработчики языков программирования, почти как художники — они так видят.
Какие по итогу сложились основные принципы ООП и что это вообще такое
ООП к настоящему времени свелся к таким основным принципам:
- наследование
- инкапсуляция
- полиморфизм
- абстракция
Основные сущности ООП — это классы, объекты, интерфейсы. Класс — это шаблон, по которому создается объект. Это примерно, как пресс-форма — она одна, а позволяет наштамповать множество одинаковых деталей. Объекты — это примерно как наштампованные детали. Через интерфейсы объекты взаимодействуют между собой. Или как оператор может работать с пресс-формой, какие кнопки на станке нажимать.
Далее на схемах показаны простейшие примеры наследования и композиции. Наследование и композиция — это отношения между классами. Про отношения между классами я постараюсь простыми словами рассказать отдельно в новом посте.
Сущности класса, если не вдаваться в детали — это поля, данные и методы. Поля — это свойства класса, описывающие его состояние. Методы класса — это функции, которые определяют поведение класса и работаю с его данными и полями. У класса есть конструктор и деструктор — это специальные методы класса, которые создают и уничтожают объект соответственно.
Именно на основе класса по шаблону и создается объект.
Деструктор уничтожает объект, освобождает занимаемую им память. Операционная система помечает эту область памяти, как свободную.
Наследование позволяет создавать новые классы на основе существующих, чтобы повторно использовать код, добавлять или изменять поведение, добавлять новые поля. Классы-наследники — это как талантливые дети, которые умеют больше, чем их родители.
Некоторые языки программирования позволяют наследоваться от нескольких классов, а некоторые только от одного. Некоторое подобие множественного наследования можно сделать через реализацию интерфейсов.
В контексте примера с пресс-формой можно представить базовый класс: пресс-форма для штамповки кастрюли, а класс-наследник -модифицированная пресс-форма, которая штампует кастрюли с утолщенным дном.
Инкапсуляция защищает данные класса, не позволяет извне эти данные менять, скрывает их и позволяет с ними работать через определенный интерфейс. Тем самым сохраняется состояние класса и в целом — стабильность приложения. Скрытые данные можно изменить только в самом классе, которому они принадлежат, поэтому в случае поиска ошибки в коде, которая возникла из-за изменения состояния поиск сводится к поиску ошибки в методах данного класса, которые работают с полями класса. Без инкапсуляции данные класса невозможно защитить от изменений и ошибка может возникнуть где угодно. И на ее поиски может уйти очень много времени. Извне со скрытыми данными можно работать через интерфейс, который предоставляет класс. Обычно — это методы, которые возвращают значение поля (геттеры) и устанавливают значение поля (сеттеры).
В контексте пресс-формы инкапсуляция — это когда никому неинтересно, как устроена пресс-форма. Что там внутри — без разницы. Главное, чтобы оператор смог с этой пресс-формой легко взаимодействовать и наштамповать детали.
Полиморфизм позволяет работать универсально с объектами разных типов. Простыми словами — это, например в базовом классе есть метод, который работает с массивом целых чисел, а в классе-наследнике есть метод с точно таким же именем, но работает он с массивом дробных чисел. В другом наследнике метод с таким же именем работает с массивом строк. Полиморфизм идет рядом с наследованием.
В контексте пресс-формы — это примерно как одна пресс-форма сделана из очень твердого материала и может штамповать детали из одних материалов. А есть точно такая-же пресс-форма, но она попроще и позволяет штамповать детали из менее твердых материалов. И перепутать эти прессформы нельзя!
Абстракция — это выделение главного, важного для решения задачи, и скрытие лишних деталей реализации. Абстракция в контексте пресс-формы — это выделение главного функционального назначения пресс-формы и отвлечение от сложных технических деталей её конструкции.
Например, нужна пресс-форма, которая может принимать расплавленный пластик и формировать из него крышку от бутылки за 10 секунд, с точностью 0.01 мм и не важно, как именно внутри сделаны каналы охлаждения, как устроены вставки, как крепится форма к станку — это детали реализации, которые не нужны на данном уровне абстракции.
В будущих статьях попробую простым языком рассказать про основы программирования в стиле ООП.





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