Преимущества абстракции и инкапсуляции данных

У меня есть два вопроса, которые нужно задать и получить разрешение (от Учебник по С++):

1: Class internals are protected from inadvertent user-level errors, which might corrupt the state of the object.

2: The class implementation may evolve over time in response to changing requirements or bug reports without requiring change in user-level code.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
94
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Каждый класс (за редким исключением) имеет открытый интерфейс и закрытую реализацию.

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

Таким образом, пользователям класса не нужно будет менять свой код при изменении реализации.

И относительно стандартного класса std::cin тогда он не поврежден, если пользователь ввел неверные данные. Его внутреннее состояние стабильно. Он просто устанавливает для пользователей флаг ошибки, чтобы сообщить им, что они делают что-то не так.

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

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

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

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

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

SomeWittyUsername 19.07.2019 19:23

Другие вопросы по теме