2.23 Инкапсуляция

Человек склонен быть невнимательным к предупреждениям, написанным в комментариях: он просто их не видит. Если же предупреждения нет, можно считать, что ошибка уже совершена.

Самое интересное в том, что автор того или иного класса часто сам норовит его неправильно использовать.

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

Для минимизации ошибок клиентов необходимо уменьшить размер видимой для клиента части API. В этом случае проще защитить и обеспечить безошибочную работу API. Уменьшить исходный код нельзя, так как это скажется на функциональности конечного продукта, самое эффективное решение – это спрятать посторонних глаз все, что можно спрятать. Жаль, но спрятать все не получится: надо же дать возможность пользоваться нашим модулем. Отсюда следует важный принцип: «Все, что не является необходимым для пользователя, должно быть скрыто».

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

Принцип сокрытия всех деталей реализации называется инкапсуляцией. Его можно сформулировать и так: «Мой модуль делает это. Вам не нужно знать, как».

Ярким примером является правило сокрытия полей в классах. В них не должно быть полей в открытом доступе (константы в Java нельзя считать полями в этом смысле) . Доступ к полям должны обеспечивать специальные методы (accessors). Даже если поначалу эти методы будут работать тривиально, у Вас будет возможность добавить в них более сложное поведение, не сломав клиентский код. А еще можно сделать поле доступным только для чтения, и все это поймут: нет метода на запись — значит, нет. Это еще одна иллюстрация необходимости единства дизайна: если во всей системе доступ к полям предоставляется через методы, все будут думать в этих терминах и не будут пытаться искать способ записывать значение в поле, для которого нет метода записи.

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