View on GitHub

wiki

Technical Excellence Wiki

Принцип совместного повторного использования [draft]

Оригинальный текст из книги Робертом Мартина Agile Principles, Patterns, and Practices.


Принцип совместного повторного использования (Common Reuse Principle – CRP)

Все классы внутри компонента используются совместно. Если вы можете повторно использовать один класс, то можете использовать и все остальные.


Этот принцип помогает решить, какие классы включать в компонент. CRP гласит, что классы, которые, скорее всего, будут использоваться совместно, принадлежат одному компоненту.

Классы редко используются изолированно. Обычно повторно используемые классы кооперируются с другими классами, являющимися частями одной и той же абстракции. CRP утверждает, что такие классы должны входить в один компонент. Естественно ожидать, что между классами в этом компоненте будет много взаимных зависимостей. Простой пример – класс контейнера и сопутствующие ему итераторы. Эти классы используются совместно, потому что они тесно связаны. И, значит, должны принадлежать одному компоненту.

Но CRP говорит не только о том, какие классы помещать в один компонент, а также о том, какие не помещать туда. Если один компонент пользуется другим, то между ними образуется зависимость. Может случиться так, что первому компоненту нужен всего один класс из второго. Но от этого зависимость отнюдь не становится слабее. Первый компонент все равно зависит от второго. При каждом новом выпуске второго компонента придется заново проверять и выпускать первый. И это справедливо даже в том случае, когда причиной нового выпуска используемого компонента является изменение в классе, который использующему компоненту не интересен.

Очень часто компоненты оформляются в виде DLL-библиотек. Если используемый компонент выпущен в виде DLL, то использующий его код зависит от этой DLL в целом. Любая модификация данной DLL, даже если речь идет об изменении класса, который никак не касается использующей программы, обязательно приводит к выпуску новой версии DLL. Новую DLL необходимо повторно развертывать и заново тестировать все использующие ее программы.

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

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

Адаптировал: Кротов Артём.

Остались вопросы? Задавай в нашем чате.