LCOM4 опрос о способе расчета

Недавно я столкнулся с проблемой семантики при расчете LCOM4, ​​метрики, используемой для определения когерентности методов и свойств класса.

Вступление

LCOM4 является "четвертым методом расчета недостатка в сплоченности методов" и был описан Hitz и Montazeri ( http://www.isys.uni-klu.ac.at/PDF/1995-0043-MHBM.pdf) и в настоящее время является лучшим способом определить, сколько обязанностей принадлежит классу.

Я постараюсь не использовать конкретный язык разработки, потому что мой вопрос касается всех языков ООП.

Позвольте мне в основном объяснить, как это работает людям, которые не знают, с алгоритмом по умолчанию:

Class Foo {
    property a,b

    function f1() { this.a = 1 }
    function f2() { this.f1() }
    function f3() { this.b = 3 }
}

Этот класс имеет два потока:

  • атрибут a является общим для f1() и f2()
  • атрибут b является общим для f3()

Таким образом, LCOM4 для Foo равен 2.

Давайте изменим, например, функцию f2(), чтобы она также разделяла свойство b.

Class Foo {
    property a,b

    function f1() { this.a = 1 }
    function f2() { this.f1(); this.b = 1 }
    function f3() { this.b = 3 }
}

Теперь у этого класса только один поток:

  • оба атрибута a и b являются общими для f1(), f2() и f3().

Это означает, что LCOM4 для Foo теперь равен 1.

LCOM4 = 0 или LCOM4 = 1 означает, что класс не имеет ни одной или только 1 ответственности, что каждый разработчик должен хотеть для своих классов, поскольку они уважают S из хороших практик S OLID.

Вы можете найти больше информации с графиками здесь: http://www.aivosto.com/project/help/pm-oo-cohesion.html

Мой вопрос

Давайте представим, что вы написали такой класс:

Class Bar {
    property a

    static function build() { return new self }
    function Bar() { this.a = 5 }
}

... и, конечно же, при выполнении new selfЯ создаю новый экземпляр Bar, построенный с использованием метода Bar объявлен.

На основании работ Хитца и Монтазери, что такое LCOM4 моего класса Bar?

Множество инструментов метрики, которые я использую, говорят, что LCOM4=2, но для меня класс имеет только 1 ответственность, и поэтому его LCOM4 должен быть 1. Кроме того, даже если это не совсем явно, оба метода build() а также Bar() должен принадлежать тому же графику функций, что и build() звонит Bar() (ну, я знаю, это вызывает другой экземпляр, но даже если это не тот же объект, это тот же класс).

Каково ваше мнение по этому поводу?

У кого-нибудь есть ответ о том, как бороться с такого рода занятиями? (Я прочитал много документов Хитца и Монтазери, но я, вероятно, скучаю по некоторым)

Если нет ответа по этому поводу, можем ли мы улучшить способ вычисления LCOM4, ​​чтобы приблизить его к числу ответвлений класса?

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

Спасибо вам, ребята,

1 ответ

Согласно предоставленной вами документации:

В дополнение к этому простому формальному улучшению определения LCOM, мы хотели бы избавиться от более семантических недостатков в определении LCOM: во-первых, весьма распространенный принцип проектирования, ограничивающий доступ к переменным экземпляра специальными методами чтения / записи. вводит аномалию этой меры: в противном случае связный класс будет давать очень высокие значения LCOM, так как все "реальные" методы будут давать изолированные узлы в графе, поскольку они больше не будут напрямую совместно использовать какую-либо переменную экземпляра.

Я интерпретирую это, поскольку статический метод и метод экземпляра разделены и, таким образом, составляют общий LCOM4 = 2. Этот результат подтверждается определением:

Они определяют отсутствие согласованности в методах (LCOM) как число пар методов, работающих с непересекающимися наборами переменных экземпляра, уменьшенное на количество пар методов, действующих как минимум на одну переменную общего экземпляра.

В вашем случае это LCOM4 = 1 + 1 - 0 = 2, как указано выше.

Другие вопросы по тегам