Теория инкапсуляции обеспечивает одну объективную причину, по которой классы лучше, чем отсутствие классов вообще.
Международная организация по стандартизации определяет инкапсуляцию как: «Свойство того, что информация, содержащаяся в объекте, доступна только через взаимодействия на интерфейсах, поддерживаемых объектом».
Таким образом, поскольку некоторая информация доступна через эти интерфейсы, некоторая информация должна быть скрыта и недоступна внутри объекта. Свойство, которое демонстрирует такая информация, называется скрытием информации, которое Парнас определил, утверждая, что модули должны быть спроектированы так, чтобы скрывать как сложные решения, так и решения, которые могут измениться.
Обратите внимание, что слово: изменить. Сокрытие информации касается потенциальных событий, таких как изменение сложных проектных решений в будущем.
Рассмотрим класс с двумя методами: метод a (), который является информацией, скрытой внутри класса, и метод b (), который является открытым и, таким образом, доступным напрямую другим классам.
Существует определенная вероятность того, что в будущем изменение метода a () потребует изменений методов в других классах. Также существует определенная вероятность того, что в будущем изменение метода b () потребует изменений методов в других классах. Однако вероятность того, что такие колебания будут происходить для метода a (), обычно будет ниже, чем для метода b (), просто потому, что от метода b () может зависеть больше классов.
Эта уменьшенная вероятность пульсации является ключевым преимуществом инкапсуляции.
Рассмотрим максимальное потенциальное количество зависимостей исходного кода (MPE - аббревиатура от теории графов) в любой программе. Экстраполируя из приведенных выше определений, мы можем сказать, что при наличии двух программ, предоставляющих идентичные функциональные возможности пользователям, программа с самым низким MPE лучше инкапсулирована, и что статистически более хорошо инкапсулированная программа будет дешевле поддерживать и развивать, поскольку стоимость максимальное потенциальное изменение к нему будет ниже, чем максимальное потенциальное изменение для менее хорошо инкапсулированной системы.
Кроме того, рассмотрим язык, в котором есть только методы и нет классов, и, следовательно, нет средств скрытия информации друг от друга. Допустим, наша программа имеет 1000 методов. Что такое MPE этой программы?
Теория инкапсуляции говорит нам, что, учитывая систему из n открытых узлов, MPE этой системы равен n (n-1). Таким образом, MPE наших 1000 открытых методов составляет 999 000.
Теперь давайте разберем эту систему на два класса, каждый из которых имеет 500 методов. Поскольку у нас теперь есть классы, мы можем выбрать, чтобы некоторые методы были открытыми, а некоторые - частными. Это будет иметь место, если каждый метод фактически не зависит от любого другого метода (что маловероятно). Допустим, что 50 методов в каждом классе являются публичными. Каким будет ПДВ системы?
Теория инкапсуляции говорит нам, что это: n ((n / r) -1 + (r-1) p) где r - количество классов, а p - количество открытых методов на класс. Это дало бы нашей двухклассовой системе MPE 499 000. Таким образом, максимальная потенциальная стоимость изменения в этой двухклассовой системе уже значительно ниже, чем у неинкапсулированной системы.
Допустим, вы разбили свою систему на 3 класса, каждый из которых имеет 333 класса (ну, один будет иметь 334), и снова каждый с 50 открытыми методами. Что такое MPE? Используя приведенное выше уравнение снова, MPE будет примерно 482 000.
Если система будет разбита на 4 класса по 250 методов каждый, MPE будет составлять 449 000.
Если может показаться, что увеличение количества классов в нашей системе всегда будет уменьшать его MPE, но это не так. Теория инкапсуляции показывает, что число классов, на которые система должна быть разложена для минимизации MPE, равно: r = sqrt (n / p), которое для нашей системы на самом деле равно 4. Например, система с 6 классами будет иметь MPE 465 666