- Почему мы группируем вещи в классах и какими должны быть принципы?
Вы подчеркиваете "Группирование" или "Классы?"
Если вы спрашиваете, почему мы группируем вещи, то я бы добавил слова Медельта «Ремонтопригодность», хотя я бы перефразировал его как «Чтобы уменьшить потенциальную стоимость волновых эффектов».
Подумайте на мгновение не о фактической связи между вашими компонентами (классами, файлами, какими бы они ни были), а о потенциальной связи, то есть максимально возможном количестве зависимостей исходного кода между этими компонентами.
Существует теорема, которая показывает, что при заданной цепочке компонентов a - b - c - d - e, такой, что a зависит от b, и т. Д., Вероятность того, что изменение e затем изменит компонент c, не может быть больше чем вероятность того, что изменение е затем изменит d. А в реальных программных системах вероятность того, что изменение e повлияет на c, обычно меньше вероятности того, что изменение e повлияет на d.
Конечно, вы можете сказать, это очевидно. Но мы можем сделать это еще более очевидным. В этом примере d имеет прямую зависимость от e, а c имеет косвенную (через d) зависимость от e. Таким образом, мы можем сказать, что статистически система, сформированная преимущественно из прямых зависимостей, будет страдать от более сильного волнового эффекта, чем система, сформированная преимущественно из косвенных зависимостей.
Учитывая, что в реальном мире каждый волновой эффект стоит денег, мы можем сказать, что стоимость волнового эффекта обновления системы, сформированного преимущественно из прямых зависимостей, будет выше, чем стоимость волнового эффекта обновления системы формируется преимущественно из косвенных зависимостей.
Теперь вернемся к потенциальной связи. Можно показать, что в контексте абсолютной инкапсуляции (например, Java или C #, где рекурсивная инкапсуляция не используется широко) все компоненты потенциально связаны друг с другом либо прямой, либо косвенной зависимостью с одним промежуточным компонентом. По статистике, система, которая сводит к минимуму прямую потенциальную связь между ее компонентами, сводит к минимуму потенциальную стоимость эффекта ряби из-за любого обновления.
И как нам достичь этого различия между прямой и косвенной потенциальной связью (как будто мы еще не выпустили кошку из сумки)? С инкапсуляцией.
Инкапсуляция - это свойство того, что информация, содержащаяся в моделируемом объекте, доступна только через взаимодействия на интерфейсах, поддерживаемых этим моделируемым объектом. Информация (которая может быть данными или поведением), которая не доступна через эти интерфейсы, называется «Информация скрыта». Благодаря скрытому поведению внутри компонента мы гарантируем, что к нему могут получить косвенный доступ (через интерфейсы) только внешние компоненты.
Для этого обязательно требуется какой-то контейнер группировки, в котором может быть скрыта какая-то более мелкая функциональность.
Вот почему мы, "группировка", вещи.
Что касается того, почему мы используем классы для группировки вещей:
A) Классы предоставляют поддерживаемый языком механизм для инкапсуляции.
B) Мы не просто используем классы: мы также используем пространства имен / пакеты для инкапсуляции.
С уважением,
Ed.