Есть ли у NDepend прямой способ измерения RFC (RFT) от CQL? Или нам нужно написать CQL-запрос для рекурсивного подсчета вызываемых методов в используемых классах (типах) самих себя? Если да, то как это выглядит? Аналогично этому?
Как измерить метрику RFT в NDepend?
Ответы (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 методов в ответе), и вы можете также для каждого типа перечисляет все методы в ответе.
person
Patrick from NDepend team
schedule
25.03.2014