Набор метрик MOOD (Metrics for Object Oriented Design), предложенный Ф. Абреу в 1994 году, — другой пример академического подхода к оценке качества ОО-проектирования [6]. Основными целями MOOD-набора являются:
1) покрытие базовых механизмов объектно-ориентированной парадигмы, таких как инкапсуляция, наследование, полиморфизм, посылка сообщений;
2) формальное определение метрик, позволяющее избежать субъективности измерения;
3) независимость от размера оцениваемого программного продукта;
4) независимость от языка программирования, на котором написан оцениваемый продукт.
Набор MOOD включает в себя следующие метрики:
1) фактор закрытости метода (МНF);
2) фактор закрытости свойства (AHF);
3) фактор наследования метода (MIF);
4) фактор наследования свойства (AIF);
5) фактор полиморфизма (POF);
6) фактор сцепления (СОF).
Каждая из этих метрик относится к основному механизму объектно-ориентированной парадигмы: инкапсуляции (МНF и АНF), наследованию (MIF и AIF), полиморфизму (POF) и посылке сообщений (СОF). В определениях MOOD не используются специфические конструкции языков программирования.
Метрика 1: Фактор закрытости метода MHF (Method Hiding Factor)
Введем обозначения:
q Мv (С i) — количество видимых методов в классе С i (интерфейс класса);
q М h (С i) — количество скрытых методов в классе С i (реализация класса);
q М d (С i) = Мv (С i) + М h (С i) — общее количество методов, определенных в классе С, (унаследованные методы не учитываются).
Тогда формула метрики МНF примет вид:
,
где ТС — количество классов в системе.
Если видимость т-го метода i -го класса из j -го класса вычислять по выражению:
,
a процентное количество классов, которые видят m -йметод i -го класса, определять по соотношению:
то формулу метрики МНF можнопредставить в виде:
.
В числителе этой формулы МНF — сумма закрытости всех методов во всех классах. Закрытость метода — процентное количество классов, из которых данный метод невидим. Знаменатель МНF — общее количество методов, определенных в рассматриваемой системе.
С увеличением МНF уменьшаются плотность дефектов в системе и затраты на их устранение. Обычно разработка класса представляет собой пошаговый процесс, при котором к классу добавляется все больше и больше деталей (скрытых методов). Такая схема разработки способствует возрастанию как значения МНF, так и качества класса.
Метрика 2: Фактор закрытости свойства AHF (Attribute Hiding Factor)
Введем обозначения:
q Аv (С i) — количество видимых свойств в классе С i (интерфейс класса);
q Ah (Ci) — количество скрытых свойств в классе С i (реализация класса);
q Ad (Ci) = Аv (С i) + Ah (Ci) — общее количество свойств, определенных в классе С i (унаследованные свойства не учитываются).
Тогда формула метрики AHF примет вид:
,
где ТС — количество классов в системе.
Если видимость т- го свойства i -го класса из j -ro класса вычислять по выражению:
,
а процентное количество классов, которые видят т -есвойство i -ro класса, определять по соотношению:
,
то формулу метрики AHF можно представить в виде:
.
В числителе этой формулы AHF — сумма закрытости всех свойств во всех классах. Закрытость свойства — процентное количество классов, из которых данное свойство невидимо. Знаменатель AHF — общее количество свойств, определенных в рассматриваемой системе.
В идеальном случае все свойства должны быть скрыты и доступны только для методов соответствующего класса (AHF = 100%).
Метрика 3: Фактор наследования метода MIF (Method Inheritance Factor)
Введем обозначения:
q M i (С i) — количество унаследованных и не переопределенных методов в классе С i;
q M 0 (С i) — количество унаследованных и переопределенных методов в классе С i;
q M n (С i) — количество новых (не унаследованных и переопределенных) методов в классе С i;
q M d (С i) = M n (С i) + M 0 (С i) — количество методов, определенных в классе С i;
q M a (С i) = M d (С i) + M i (С i) — общее количество методов, доступных в классе С i.
Тогда формула метрики MIF примет вид:
.
Числителем MIF является сумма унаследованных (и не переопределенных) методов во всех классах рассматриваемой системы. Знаменатель MIF — это общее количество доступных методов (локально определенных и унаследованных) для всех классов.
Значение MIF = 0 указывает, что в системе отсутствует эффективное наследование, например, все унаследованные методы переопределены.
С увеличением MIF уменьшаются плотность дефектов и затраты на исправление ошибок. Очень большие значения MIF (70-80%) приводят к обратному эффекту, но этот факт нуждается в дополнительной экспериментальной проверке. Сформулируем «осторожный» вывод: умеренное использование наследования — подходящее средство для снижения плотности дефектов и затрат на доработку.
Метрика 4: Фактор наследования свойства AIF (Attribute Inheritance Factor)
Введем обозначения:
q Аi (С i) — количество унаследованных и не переопределенных свойств в классе С i;
q А0(С i) — количество унаследованных и переопределенных свойств в классе С i;
q An (Ci) — количество новых (не унаследованных и переопределенных) свойств в классе С i;
q Аd(С i) = An (Ci) + А0(С i) — количество свойств, определенных в классе С i;
q Аa(С i) = Аd(С i)+ Аi (С i) — общее количество свойств, доступных в классе С i.
Тогда формула метрики AIF примет вид:
.
Числителем AIF является сумма унаследованных (и не переопределенных) свойств во всех классах рассматриваемой системы. Знаменатель AIF — это общее количество доступных свойств (локально определенных и унаследованных) для всех классов.
Метрика 5: Фактор полиморфизма POF (Polymorphism Factor)
Введем обозначения:
q M 0 (С i) — количество унаследованных и переопределенных методов в классе С i;
q Mn (С i) — количество новых (не унаследованных и переопределенных) методов в классе С i;
q DC (С i) — количество потомков класса С i;
q Md (С i) = Mn (С i) + M 0 (С i) — количество методов, определенных в классе С i.
Тогда формула метрики POF примет вид:
.
Числитель POF фиксирует реальное количество возможных полиморфных ситуаций. Очевидно, что сообщение, посланное в класс С i связывается (статически или динамически) с реализацией именуемого метода. Этот метод, в свою очередь, может или представляться несколькими «формами», или переопределяться (в потомках С i).
Знаменатель POF представляет максимальное количество возможных полиморфных ситуаций для класса С i. Имеется в виду случай, когда все новые методы, определенные в С i, переопределяются во всех его потомках.
Умеренное использование полиморфизма уменьшает как плотность дефектов, так и затраты на доработку. Однако при POF > 10% возможен обратный эффект.
Метрика 6: Фактор сцепления COF (Coupling Factor)
В данном наборе сцепление фиксирует наличие между классами отношения «клиент-поставщик» (client-supplier). Отношение «клиент-поставщик» (С c =>Cs) здесь означает, что класс-клиент содержит но меньшей мере одну не унаследованную ссылку на свойство или метод класса-поставщика.
Если наличие отношения «клиент-поставщик» определять по выражению:
.
то формула для вычисления метрики COF примет вид:
Знаменатель COF соответствует максимально возможному количеству сцеплений в системе с ТС-классами (потенциально каждый класс может быть поставщиком для других классов). Из рассмотрения исключены рефлексивные отношения — когда класс является собственным поставщиком. Числитель COF фиксирует реальное количество сцеплений, не относящихся к наследованию.
С увеличением сцепления классов плотности дефектов и затрат на доработку также возрастают. Сцепления отрицательно влияют на качество ПО, их нужно сводить к минимуму. Практическое применение этой метрики доказывает, что сцепление увеличивает сложность, уменьшает инкапсуляцию и возможности повторного использования, затрудняет понимание и усложняет сопровождение ПО.