В чем суть инкапсуляции?

Я просто не вижу смысла в инкапсуляции, я вижу, что в некоторых случаях вы можете изменить геттер/сеттер, чтобы изменить поведение чего-либо или отслеживать состояние, но всякий раз, когда я создаю нетрадиционный геттер/сеттер, я используйте такие слова, как «модифицировать» или «получить», так какой смысл тратить часы на написание повторяющихся методов, которые практически бессмысленны и неэффективны?

Я просто не понимаю, когда я был крошечным молодым программистом, какой-то парень в IRC сказал мне, что его отсутствие было причиной ошибки в моей программе, но я уже много лет знаю, что это не так. случае, я только что сделал это в любом случае, так какой тогда смысл?

Если мне нужно будет провести рефакторинг позже, есть странные способы обойти это, но они есть, по крайней мере, в языках с перегруженными операторами, и API не всегда должны быть обратно совместимыми, поэтому я не вижу смысла.

  • Может ли кто-нибудь просветить меня о необходимости инкапсуляции?

person The Floating Brain    schedule 16.07.2014    source источник
comment
Кажется, вы спрашиваете не о точке инкапсуляции (которая, кажется, у вас есть), а о точке догматической фальшивой инкапсуляции: сделать все элементы данных закрытыми, но предоставить тривиальные средства доступа.   -  person Deduplicator    schedule 16.07.2014
comment
Вы встречались с std::string? Хотели бы вы выполнять все его внутренние операции каждый раз вручную?   -  person Kerrek SB    schedule 16.07.2014
comment
«В чем смысл инкапсуляции» Обеспечение управляемости кода в долгосрочной перспективе.   -  person πάντα ῥεῖ    schedule 16.07.2014
comment
Может ли кто-нибудь просветить меня о необходимости инкапсуляции? Лучшее просвещение по этому вопросу исходит от доброжелательных коллег, которые возятся с частями вашего кода, которые вы не намеревались показывать им.   -  person Sergey Kalinichenko    schedule 16.07.2014
comment
см. также stackoverflow.com/questions/20928327/   -  person Peter Ritchie    schedule 16.07.2014
comment
Суть инкапсуляции, сделанной правильно, заключается в управлении сложностью/зависимостями. Вам нужно учитывать интерфейс класса и без инкапсуляции, которая включает в себя все внутренние детали и инварианты, когда вы его используете или изменяете.   -  person Deduplicator    schedule 16.07.2014
comment
@Deduplicator Я считаю, что, как я уже говорил, когда у меня есть член данных, я думаю, что может понадобиться универсальный интерфейс. Я делаю инкапсулированный метод, но я называю его как-то так, чтобы клиент знал, что он не просто возвращает значение. Или, если у меня есть член данных, который, как я думаю, может нуждаться в такой модификации в будущем, я делаю для него инкапсуляцию. Но для общего члена данных, какой смысл?   -  person The Floating Brain    schedule 16.07.2014
comment
Как насчет того, чтобы узнать, что в С++ даже нет инкапсуляции!...   -  person jaredready    schedule 16.07.2014
comment
@ResidentBiscuit Я намеревался сделать так, чтобы это конкретно относилось к C ++, и заранее добавил теги, но это было ошибкой. Я удалю это. В C++ есть инкапсуляция, как и в любом ООП-языке с методами и элементами данных.   -  person The Floating Brain    schedule 17.07.2014
comment
@ResidentBiscuit: Что?   -  person deviantfan    schedule 17.07.2014
comment
@deviantfan Был тег C++, я его удалил.   -  person The Floating Brain    schedule 17.07.2014
comment
@TheFloatingBrain: я понял это, но не точку зрения ResidentBiscuit.   -  person deviantfan    schedule 17.07.2014
comment
@deviantfan Я не читал весь его комментарий, я только что прочитал вторую половину и отредактировал свой ответ на него. Виноват.   -  person The Floating Brain    schedule 17.07.2014
comment
Я наполовину пошутил. Однако есть общие жалобы на инкапсуляцию C++, в которые я на самом деле не хочу вдаваться.   -  person jaredready    schedule 17.07.2014
comment
@ResidentBiscuit Kk, мой основной язык — C++, и он кажется повторяющимся, и я вижу некоторые причины, по которым это может быть иначе.   -  person The Floating Brain    schedule 17.07.2014


Ответы (1)


  1. Во многих случаях вы правы - небольшие программы, вероятно, не нуждаются в инкапсуляции.
  2. Некоторые инфраструктуры MS (я думаю, C#/WPF в нескольких сценариях привязки) требуют инкапсуляции (с использованием свойств) и не будут работать без нее.
  3. Если вы сделаете больше в get/set, чем измените значение или вернете его, это сделает ваш код более красивым и надежным (например, выполните проверки или другой персонал в установщике).

Вас все равно никто не заставляет им пользоваться...

person Dani    schedule 16.07.2014