Что такое объектно-ориентированное программирование? Четыре основных понятия ООП

Кайл Херрити

5 октября 2021 г.

Кайл Херрити — опытный инженер-программист с более чем 15-летним опытом работы в отрасли, начиная от разработки высокоуровневых приложений и заканчивая низкоуровневыми проектами встраиваемых систем.

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

Что такое объектно-ориентированное программирование?

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

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

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

Этот стиль программирования широко распространен в популярных языках программирования, таких как Java, C++, Python, JavaScript и C#. Определяя наборы классов, которые представляют и инкапсулируют объекты в программе, классы могут быть организованы в модули, улучшая структуру и организацию программ. Таким образом, разработчики часто используют ООП в качестве инструмента, когда им нужно создавать сложные программы, поскольку их легче рассуждать с точки зрения классов и их взаимосвязей.

Подробнее: 50 вопросов для интервью по объектно-ориентированному программированию

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

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

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

  2. Абстракция

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

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

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

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

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

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

Если в классе person написан метод для выполнения, скажем, банковской транзакции с именем «bankTransaction()», эта функция может при необходимости получить доступ к переменной «socialSecurityNumber». Личные данные человека будут хорошо инкапсулированы в такой класс.

2. Абстракция

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

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

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

Это концепция абстракции, которая невероятно полезна во всех областях техники, а также очень эффективно применяется в объектно-ориентированном программировании.

Пример: в ООП у нас может быть класс, определенный для представления человеческого тела. Можно определить некоторые функции как часть общедоступного интерфейса, например «walk()» или «eatFood()». Вызывающий код может вызывать эти функции и совершенно не обращать внимания на сложную внутреннюю работу человеческого тела и его необходимые функции для выполнения акта ходьбы или еды. Эти детали полностью скрыты в реализации функций тела walk() и eatFood() и, следовательно, абстрагируются от конечного пользователя. В этих случаях для вызывающего кода важно не понять, как мозг координирует ходьбу или как желудок справляется с перевариванием пищи, а просто то, что человек ходил или ел.

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

Объектно-ориентированные языки, поддерживающие классы, почти всегда поддерживают понятие «наследования». Классы могут быть организованы в иерархии, где класс может иметь один или несколько родительских или дочерних классов. Если у класса есть родительский класс, мы говорим, что он является производным или унаследованным от родительского класса и представляет отношение типа «IS-A». То есть дочерний класс типа «IS-A» родительского класса.

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

Рассмотрим два класса: один является суперклассом, или родителем, а другой — подклассом, или дочерним. Дочерний класс наследует свойства родительского класса, возможно изменяя или расширяя его поведение. Программисты, применяющие технику наследования, упорядочивают эти классы в так называемые отношения типа «IS-A».

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

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

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

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

Пример. Предположим, у нас есть класс под названием «Животное» и два дочерних класса «Кошка» и «Собака». Если в классе Animal есть метод для создания шума, который называется makeNoise, то мы можем переопределить функцию makeNoise, унаследованную подклассами Cat и Dog, на «мяу». и «лаять» соответственно. Затем можно написать другую функцию, которая принимает любой объект Animal в качестве параметра и вызывает его функцию-член makeNoise. Шум будет разным: либо «мяу», либо «лай» в зависимости от типа объекта-животного, который фактически был передан в функцию.

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

Похожие записи

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

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