Инкапсуляция не имеет ничего общего с внешними хакерами, это не концепция безопасности данных, а скорее модель программирования. Вот пример:
class Engine
{
public bool Running { get; private set; }
public void Start()
{
this.Running = true;
}
public void Stop()
{
this.Running = false;
}
}
Это простая модель, Engine
может Start
/ Stop
с помощью методов экземпляра, что существенно меняет свойство Running
. Если вы хотите запустить / остановить Engine
, просто вызовите соответствующий метод. Мы можем сказать, что поведение Engine
хорошо инкапсулировано.
Давайте изменим код
class Engine
{
public bool Running { get; set; } //set is changed to public
}
Теперь код короче и проще, если мы хотим запустить двигатель, просто установите Running
на true
(или false, когда вы хотите остановиться). По мере роста проекта у вас будет несколько методов, которые изменят свойство Running
для запуска двигателя.
Вот новый случай1: иногда двигатель выходит из-под контроля, тогда его нельзя запустить / остановить. Если вы используете старую версию, легко изменить код на:
class Engine
{
public bool Running { get; private set; }
public bool OutOfControl { get; private set; }
public void Start()
{
if (this.OutOfControl) return;
this.Running = true;
}
public void Stop()
{
if (this.OutOfControl) return;
this.Running = false;
}
public void SomeOperation()
{
//inside the method sometimes OutOfControl is set to true
}
}
На абонентов Engine.Start
и Engine.Stop
это не повлияет. А как насчет «более простой» версии? Вам нужно изменить 10+ (или 100+) абонентов, проверяя свойство OutOfControl
перед изменением свойства Running
.
А потом приходит новый case2, case3 ... «более простая» версия становится все сложнее и сложнее поддерживать. Потому что это раскрывает детали реализации для вызывающих. Каждый раз, когда изменяется реализация start / stop, первой версии (хорошо инкапсулированной версии) нужно только изменить метод start / stop, потому что это единственное место, которое выполняет поведение.