Что такое абстракции и интерфейсы — Журнал «Код»

Как в старом анекдоте: про объектно-ориентированное программирование можно рассказать просто и неправильно либо сложно и неправильно. Мы попробуем рассказать про очередной аспект ООП просто. 

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

В этой статье разберём два сложных понятия из объектно-ориентированного программирования: абстракции и интерфейсы. Это ещё одна ступень в понимании непостижимого. 

Основные идеи из ООП
  • Объектно-ориентированное программирование построено вокруг объектов. Можно представить, что объект — это коробка, в которой лежат данные и функции. 
  • Деление на объекты нужно для того, чтобы можно было создавать, обслуживать и переделывать части программы, не влияя на другие части и программу в целом. По-умному это называется «для повышения уровня абстракции». 
  • Смысл объекта в том, что он умеет делать какие-то свои дела, и остальные объекты не должны знать, как он это делает.
  • У объекта есть понятие атрибута и метода. Атрибут — это любые данные, которые хранятся в «коробке» объекта. Методы — это любые действия, которые можно совершать над объектом или внутри его. Атрибуты обычно выражаются переменными, а методы — функциями.
  • Объекты необходимы, например, в компьютерных играх, где каждая штучка на игровом поле — это объект с какими-то свойствами. Или в интернет-магазине, где один объект отвечает за корзину, другой — за выкладку товара. 
  • Объекты можно создавать по шаблону — такие шаблоны называются классами. 

Абстракция

Представьте, что вы попросили нескольких человек описать в общих чертах, что такое телефон и как им пользоваться: пусть это будут бабушка, мама и подруга. Бабушка вспомнит про дисковые телефоны и трубки с витым проводом. Мама расскажет про радиотелефоны, у которых есть база и есть трубка, с которой можно ходить по всей квартире, а подруга начнёт описывать мобильник.

Несмотря на то что рассказы будут сильно отличаться между собой, у них будет несколько общих моментов про телефон:

  • у телефона есть трубка;
  • в трубку мы говорим, из трубки — слушаем;
  • можно набрать номер нужного человека и позвонить ему;
  • если вам позвонят по телефону, вы это услышите и примете звонок.

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

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

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

Чтобы работать с абстракциями, используют интерфейсы.

Интерфейс

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

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

Всё это — интерфейсы. Они позволяют работать с объектом, не вникая в то, как он устроен внутри. Если вы умеете работать с интерфейсом номеронабирателя, то вам всё равно, нужно ли крутить диск, нажимать физические кнопки на радиотрубке или давить пальцем на сенсорный экран.  

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

Интерфейсы — это действия над объектом, доступные другим объектам (поэтому они называются публичными). 

Есть ещё инкапсулированные, то есть внутренние методы. Например, у микрофона есть публичный метод «Слушать голос», и есть внутренний метод «Преобразовать голос в электрические сигналы». С его помощью он взаимодействует с другими частями нашего абстрактного телефона. Про инкапсуляцию будет отдельный материал, потому что тема большая.

Оцифровка звука: как это работает

Сложная терминология

Строго говоря, интерфейсы — это не действия, а методы. Сейчас объясним. 

В программировании есть операции — это простейшие действия, например, скопировать значение из одной переменной в другую. 

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

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

Итого: метод — это набор простых действий, которые склеили в единое целое и засунули в объект. 

Для чего это всё

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

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

  • один программист делает функцию, которая отвечает за регистрацию новых пользователей;
  • все остальные используют эту функцию, привыкли к её параметрам и знают, что туда нужно передавать;
  • внезапно этот программист понимает, что можно запрограммировать более эффективный вариант регистрации, который будет работать гораздо быстрее;
  • он полностью переписывает функцию, и в этот момент у всей команды ломается логика программы: старые вызовы не работают, потому что функция теперь принимает другие данные (или в другой последовательности).

Чтобы такого не было, поступают так:

  • Один программист отвечает за регистрацию новых пользователей.
  • Он делает объект «Пользователь» и прописывает ему интерфейс «Зарегистрировать».
  • Также он говорит, что интерфейс «Зарегистрировать» будет принимать на вход три переменные: имя, почту и пароль.
  • Теперь программист говорит остальным: «Ребята, если нужно зарегистрировать нового пользователя — используйте интерфейс Пользователь.Зарегистрировать(имя,почта,пароль)».
  • Даже если внутри объекта поменяется вся логика работы, то это никак не повлияет на интерфейс — все так же смогут им пользоваться.
  • А всё потому, что никому нет дела, как тот программист реализовал свою часть, если через интерфейс всё работает нормально. Неважно, как он шифрует пароль, где хранит почту, как обрабатывает имя и в какую базу данных всё это складывает. Если интерфейс работает, все остальные могут продолжать разработку.

Текст

Михаил Полянин


Редактор

Максим Ильяхов


Художник

Даня Берковский


Корректор

Ирина Михеева


Вёрстка

Мария Дронова


Соцсети

Олег Вешкурцев

4

Даже опытные программисты не всегда понимают ООП. А вы — поймёте. Приходите в Практикум, чтобы постепенно стать опытным программистом.

Прийти в Практикум

Уровни абстракций — ключ к пониманию архитектурных изысков ПО

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

Абстракция — один из набивших оскомину столпов ООП. В любом курсе по программированию с вероятностью 99% можно найти урок-другой, посвященный теме абстракции. И практически всегда упускается более широкое, всеобъемлющее понятие «уровней абстракции» — на мой взгляд, критически важное, ключевое для понимания всех остальных принципов проектирования.

Модель объекта и ступень приближения

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

Чтобы не вдаваться в многоэтажную теорию, приведу наглядный пример. Итак, раскладываем по полочкам. Представьте себе, что вы решили испечь яблочный пирог. Вы берете толстую кулинарную книгу с полки (для любителей, все остальные — в сеть), открываете нужный вам рецепт и читаете нечто следующее:

«Чтобы испечь яблочный пирог, нам понадобится два килограмма непременно свежих яблок, румяных, как девичьи щёки на крещенском морозе. Помнится, видал я такие щёчки у моей ненаглядной Лизоньки, когда мы впервые с ней встретились, и она угощала меня яблочными пирогами, состряпанными на последние деньги, которые она выручила от продажи дедовских коллекционных монет 1819 года, выпущенных при императоре таком-то…» И т.д, и т.п.

Если вы осилили текст курсивом, то вы очевидно заметили, что он имеет весьма посредственное отношение к тому, что нам нужно.

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

А теперь вспомните, как часто в коде нам приходится встречать логические конструкции типа if-if-if-else-if-else-if, содержащие тонны вложенных рассуждений. Приходится читать все эти адские нагромождения и держать в голове всю цепочку событий, для того, чтобы понять, что тут вообще происходит и какое отношение «вот это всё» имеет к заявленному содержанию (название класса/функции по аналогии с названием рецепта «яблочный пирог»).

А ведь что на самом деле нас интересовало в рецепте? Нам нужно было знать, сколько и каких продуктов нам понадобится и что затем с ними делать. Нас абсолютно не интересует в этом приближении (на данном уровне абстракции), каким образом эти продукты к нам попали (более низкие уровни абстракции) и что мы будем делать с этим пирогом потом (более высокие уровни абстракции). Это очевидно. Но тысячи программистов продолжают игнорировать эти принципы и пишут мозговыносные структуры if-if-else-if.

..

А бывает так, что в рецепте встречаются умные словечки типа «бланшировать» или «сделать бизе». В хороших кулинарных руководствах описание подобных практик выносят в отдельные главы, а в самих рецептах лишь ссылаются на страницы с подробным описанием техники (привет, Инкапсуляция).

Построение структуры

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

В то же время, не терять в эффективности решения бизнес-задач. В некоторой мере, это искусство. Каждый конкретный архитектор (программист) будет рисовать эту картину, то есть создавать модель мира по-своему: «Я художник — я так вижу». Вот вам пища в топку холиваров на счет единых стандартов программирования в рамках команды и необходимости наличия исполнителя роли архитектора.

Абстракция и Реализация

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

между уровнями абстракций.

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

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

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

Таким образом, считать объект абстрактным или реальным — зависит исключительно от степени детализации моделируемого «мира» и от бизнес-задач, поставленных перед архитектором. И, разумеется, от его чувства прекрасного.


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

P.S. Написать эту статью меня побудило энное предложение стать лектором на очередных курсах по программированию. И, хотя, у меня и есть желание испытать подобный опыт, в данный период моей жизни и в обозримом будущем это не представляется возможным. Я решила, что моё желание рассказывать о сложных вещах простым и понятным образом (надеюсь, это так) пусть лучше выльется в какое-то количество статей, нежели будет погребено под тоннами лет бездействия.

Если моя манера изъясняться была кому-то полезной в достижении состояния «дзен» и вообще «пишите, Шура», то в будущем, вероятно, напишу «о чём-то таком ещё».

Продолжение

Все про українське ІТ в телеграмі — підписуйтеся на канал редакції DOU

Теми: ООП, ООП — это просто, програмування

Что такое абстракция? — Определение из WhatIs.com

К

  • Айви Вигмор

Что такое абстракция?

Абстракция (от латинского abs , что означает вдали от и trahere , что означает от до ) — это процесс изъятия или удаления характеристик чего-либо с целью сведения его к набору существенных характеристик. В объектно-ориентированном программировании абстракция является одним из трех основных принципов (наряду с инкапсуляцией и наследованием). В процессе абстракции программист скрывает все данные об объекте, кроме важных, чтобы уменьшить сложность и повысить эффективность. Точно так же, как абстракция иногда работает в искусстве, объект, который остается, представляет собой представление оригинала с опущенными нежелательными деталями. Сам полученный объект можно назвать абстракцией, что означает именованный объект, состоящий из выбранных атрибутов и поведения, специфичных для конкретного использования исходного объекта . Абстракция связана как с инкапсуляцией, так и с сокрытием данных.

Абстракция, применяемая в реальном мире

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

Последнее обновление: декабрь 2021 г.

Продолжить чтение Об абстракции
  • Архитектура высокой доступности: резервирование или абстракция
  • Абстракция работает только в идеальном мире
Твиттер

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

Нетворкинг

  • Манчестерское кодирование

    При передаче данных манчестерское кодирование — это форма цифрового кодирования, в которой состояние бита данных — 0 или 1 — представляется …

  • нслукап

    Nslookup — это название программы, которая позволяет пользователям вводить имя хоста и узнавать соответствующий IP-адрес или доменное имя…

  • CDN (сеть доставки контента)

    CDN (сеть доставки контента), также называемая сетью распространения контента, представляет собой группу географически распределенных и …

Безопасность

  • Международный консорциум по сертификации безопасности информационных систем (ISC)2

    (ISC)2, сокращенно от Международного консорциума по сертификации безопасности информационных систем, является некоммерческой организацией, которая предоставляет . ..

  • двухэтапная проверка

    Двухэтапная проверка — это процесс, который включает в себя два шага аутентификации, выполняемые один за другим, чтобы убедиться, что кто-то или…

  • частный CA (частный PKI)

    Частный ЦС — это центр сертификации предприятия, функционирующий как общедоступный доверенный ЦС.

ИТ-директор

  • Agile-манифест

    Манифест Agile — это документ, определяющий четыре ключевые ценности и 12 принципов, в которые его авторы верят разработчики программного обеспечения…

  • Общее управление качеством (TQM)

    Total Quality Management (TQM) — это структура управления, основанная на убеждении, что организация может добиться долгосрочного успеха, …

  • системное мышление

    Системное мышление — это целостный подход к анализу, который фокусируется на том, как взаимодействуют составные части системы и как. ..

HRSoftware

  • непрерывное управление производительностью

    Непрерывное управление эффективностью в контексте управления человеческими ресурсами (HR) представляет собой надзор за работой сотрудника …

  • вовлечения сотрудников

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

  • кадровый резерв

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

Служба поддержки клиентов

  • бесконтактная оплата

    Бесконтактный платеж — это беспроводная финансовая транзакция, при которой покупатель совершает покупку, перемещая жетон безопасности в …

  • исходящий вызов

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

  • социальная CRM

    Social CRM, или социальное управление взаимоотношениями с клиентами, — это управление взаимоотношениями с клиентами и взаимодействие с ними, поддерживаемое …

Что такое абстракция в ООП? Абстрактный класс и метод Java

Джеймс Хартман

часов

Обновлено

Что такое абстракция в ООП?

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

Нажмите здесь, если видео недоступно

Давайте изучим абстракцию в ООП на примере:

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

Абстракция в Java

Но не вся вышеуказанная информация требуется для создания банковского приложения.

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

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

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

Разница между абстракцией и инкапсуляцией

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

Разница между абстрактным классом и интерфейсом

Абстрактный класс Интерфейс
Абстрактный класс может иметь как абстрактные, так и неабстрактные методы. Интерфейс может иметь только абстрактные методы.
Не поддерживает множественное наследование. Поддерживает множественное наследование.
Может обеспечить реализацию интерфейса. Не может обеспечить реализацию абстрактного класса.
Абстрактный класс может иметь защищенные и абстрактные общедоступные методы. Интерфейс может иметь только общедоступные абстрактные методы.
Абстрактный класс может иметь переменную final, static или static final с любым спецификатором доступа. Интерфейс может иметь только общедоступную статическую конечную переменную.

Что такое абстрактный класс?

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

Что такое абстрактные методы?

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

Преимущества абстракции

  • Основное преимущество использования абстракции в программировании заключается в том, что она позволяет группировать несколько связанных классов как одноуровневых.
  • Абстракция в объектно-ориентированном программировании помогает упростить процесс проектирования и реализации программного обеспечения.

Когда использовать абстрактные методы и абстрактный класс?

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