Статьи

Сплоченность объекта: почему это важно

Скорее всего, вы знаете о Elegant Objects (EO), альтернативной объектно-ориентированной парадигме, которая утверждает, что объекты должны быть неизменяемыми, не иметь статических методов , никогда не использовать NULL в своем коде, не использовать аннотации и так далее. Мы, адепты ЭО, заявляем о многом, но не так много людей нам верят. Эти неверующие говорят, что мы в лучшем случае тролли. Их главный аргумент: все работают по-разному, почему мы должны вас слушать? У меня нет ответа на них … ну, у меня не было ответа, пока я не создал jPeek и не начал исследовать сплоченность объекта.

Позвольте мне объяснить, как сплоченность может помочь нам, адептам Е.О., доказать некоторые из наших предположений.

Сплоченность , как характеристика программного модуля, была изобретена Ларри Константином, когда я еще не существовал, в 1974 году. Вот что это значит; взгляните на этот простой класс Java:

01
02
03
04
05
06
07
08
09
10
class Books {
  private List<String> titles;
  private List<Integer> prices;
  void addTitle(String title) {
    this.titles.add(title);
  }
  void addPrice(Integer price) {
    this.prices.add(price);
  }
}

Есть два атрибута и два метода. Метод addTitle() работает с titles атрибутов, а метод addPrice() работает только с prices атрибутов. Сплоченность в этом классе низкая , потому что titles атрибутов и prices никак не связаны друг с другом. Мы можем легко разбить этот класс на две части, ничего не потеряв:

01
02
03
04
05
06
07
08
09
10
11
12
class Books1 {
  private List<String> titles;
  void addTitle(String title) {
    this.titles.add(title);
  }
}
class Books2 {
  private List<Integer> prices;
  void addPrice(Integer price) {
    this.prices.add(price);
  }
}

Теперь у нас есть два гораздо более сплоченных класса: их атрибуты и методы связаны друг с другом. Мы больше не можем ломать Books1 , так как каждый атрибут нужен каждому атрибуту.

Вот еще один пример очень сплоченного класса:

1
2
3
4
5
6
7
8
9
class Books {
  private List<String> titles;
  void add(String title) {
    this.titles.add(title);
  }
  void delete(int id) {
    this.titles.remove(id);
  }
}

Можем ли мы разбить его на мелкие кусочки? Нет, мы не можем. Мы не можем принять участие в уроке. titles атрибутов и оба метода должны оставаться вместе. Это означает, что класс очень сплоченный.

Давным-давно было продемонстрировано, что более сплоченные классы лучше с точки зрения их склонности к ошибкам, чем классы с низкой сплоченностью, например, Victor R. Basili et al. в их исследовании «Проверка метрик объектно-ориентированного проектирования как показателей качества» .

Теперь, если мы сможем эмпирически доказать, что, например, классы без статических методов в среднем более сплочены, чем их статически богатые собратья, мы можем сказать, что утверждение о том, что «статические методы являются злом» (постулируется Elegant Objects), является научно обосновано. Мы можем взять большой набор случайных классов Java и вычислить их сплоченность. Затем мы можем отделить тех, у кого есть статические методы, от тех, у кого их нет. Далее мы можем рассчитать, какая группа имеет более высокую среднюю сплоченность. Если победит группа без статических методов, предположение будет верным.

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

Я создал библиотеку программного обеспечения с открытым исходным кодом, чтобы помочь мне провести эти эксперименты, и назвал ее jPeek.org . Это калькулятор показателей сцепления для кода Java. Не удивительно, что есть много метрик, которые мы можем использовать для расчета сплоченности. По крайней мере, тридцать из них опубликованы, и только некоторые из них были должным образом реализованы. В jPeek, благодаря его авторам, нам удалось реализовать более десятка.

Используя этот инструмент, мы можем эмпирически доказать некоторые ключевые моменты ЭО. Например, мы можем доказать, что изменчивые классы менее сплочены, аннотации негативно влияют на сплоченность, DTO — существа с низкой сплоченностью и многое другое. Таким образом, сплоченность станет транспортным средством, которое приведет Элегантные Объекты к месту, где большинство его требований будет научно доказано. Дайте нам еще несколько лет, и мы получим очень интересные результаты.

Опубликовано на Java Code Geeks с разрешения Егора Бугаенко, партнера нашей программы JCG . Смотрите оригинальную статью здесь: сплоченность объекта: почему это важно

Мнения, высказанные участниками Java Code Geeks, являются их собственными.