Подтвердить что ты не робот

Почему инкапсуляция является важной особенностью языков ООП?

Я столкнулся с другим интервью, где мне задали вопрос, почему используется инкапсуляция? Чье требование действительно является инкапсуляцией? Это для пользователей программы? Или это для коллег? Или это защищать код от хакеров?

4b9b3361

Ответ 1

Инкапсуляция помогает изолировать детали реализации от поведения, подвергаемого клиентам класса (другие классы/функции, которые используют этот класс), и дает вам больше контроля над coupling в вашем коде. Рассмотрим этот пример, аналогичный приведенному в книге Роберта Мартина Clean Code:

public class Car
{
//...
public float GetFuelPercentage() { /* ... */ };

//...

private float gasoline;
//...
}

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

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

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

Повторить некоторые комментарии в комментариях:

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

  • Нет, скрытие ваших полей позади аксессуаров не является инкапсуляцией. Если единственное, что вы сделали, это написать "private" перед переменными, а затем бездумно предоставить пару get/set для каждого из них, то на самом деле они не инкапсулированы. Кто-то, находящийся в далеком месте в коде, может все еще вмешиваться с внутренностями вашего класса и все еще может зависеть от них (ну, конечно, немного лучше, что они зависят от метода, а не от поля).

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

Ответ 2

Инкапсуляция не позволяет людям, которые работают с вашим кодом, совершать ошибки, убедившись, что они имеют доступ только к тем, к которым они должны получить доступ.

Ответ 3

Инкапсуляция позволяет вам формализовать ваши интерфейсы, разделяя уровни абстракции (т.е. "логика приложения обращается к коду ввода-вывода только этим и таким образом" ).

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

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

Он также позволяет тестировать модули отдельно и повторно использовать их в других проектах (поскольку инкапсуляция также снижает межзависимые отношения и улучшает модульность вашего кода).

Неисполнение инкапсуляции приводит к сбою проекта (проблема возрастает со сложностью проекта).

Ответ 4

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

Он не собирался никого скрывать, если они действительно настаивают на вступлении.

Он предназначен для любезности, чтобы люди знали, что ввод приведет главным образом к:

  • смущение, и
  • вонючий беспорядок.

Ответ 5

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

Когда код не инкапсулирован, человеку приходится искать много файлов, чтобы найти, где произвести изменения. И наоборот, возникает вопрос: "Я нашел все места?" и другая точка "какой эффект для всей системы делать все эти изменения рассеяния?"

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

Ответ 6

После чтения пункта 22 и пункта 23 Эффективный С++ я разместил статьи об инкапсуляции. Я считаю, что инкапсуляция обеспечивает самое главное: ремонтопригодность.