Как измерить метрику RFT в NDepend?

Есть ли у NDepend прямой способ измерения RFC (RFT) от CQL? Или нам нужно написать CQL-запрос для рекурсивного подсчета вызываемых методов в используемых классах (типах) самих себя? Если да, то как это выглядит? Аналогично этому?


person Aurimas Šimkus    schedule 25.03.2014    source источник


Ответы (1)


Это действительно возможно благодаря магии Метод FillIterative(). Единственная проблема заключается в том, что выполнение этого запроса кода может занять несколько секунд, и вам может потребоваться настроить время ожидания запроса (по умолчанию установлено значение 2 секунды). Обратите внимание, что эта потеря производительности связана с определением RFT, а не с проблемой используемого алгоритма.

Вот код:

// <Name>RFT</Name>
from t in Application.Types
where !t.IsInterface && !t.IsEnumeration
let methodsUsedDirectly = 
   t.TypesUsed
    .Where(tUsed => !tUsed.IsThirdParty)
    .ChildMethods()
    .Where(m => m.IsUsedBy(t))

let methodsUsedIndirectly = methodsUsedDirectly
   .FillIterative(
         methods => methods.SelectMany(
                         m => m.MethodsCalled
                               .Where(mCalled => !mCalled.IsThirdParty))
   )
   .DefinitionDomain.ToArray()

let rftLoC = methodsUsedIndirectly.Sum(m=>m.NbLinesOfCode)

select new { t, 
   methodsUsedDirectly, 
   methodsUsedIndirectly,
   rft = methodsUsedIndirectly.Length,
   rftLoC }

Выполнив этот запрос, вы не только получите показатель RFT для каждого типа, но также получите RFT в терминах строк кода (т. е. сумму LoC методов в ответе), и вы можете также для каждого типа перечисляет все методы в ответе.

NDepend Code Query RFT Response for Type

person Patrick from NDepend team    schedule 25.03.2014