Отказ от ответственности: ложные позитивы; Практически это полезно для «исследования», а не для «правоприменения»
Вертикальное упорядочение
В общем, мы хотим, чтобы зависимости вызова функции указывали в нисходящем направлении. То есть функция, которая называется, должна быть более реже, функция, которая выполняет призвание. Это создает хороший поток вниз по модулю исходного кода от высокого уровня до низкого уровня. Как и в газетных статьях, мы ожидаем, что наиболее важные концепции появятся на первом месте, и мы ожидаем, что они будут выражены с наименьшим количеством загрязняющих деталей. Мы ожидаем, что детали низкого уровня будут последними. Это позволяет нам снимать исходные файлы, получая суть из -за нескольких функций Фриста, без необходимости погрузиться в детали.
- Чистый код, глава 5, P84, Роберт С. Мартин, 2009

go install github . com / nikolaydubina / vertfn @ latest vertfn --verbose ./...
Улучшение ложной положительной скорости - это хорошо, например, для следующих случаев:
Чистый код, глава 5, пример кода WikiPageResponder.java
public class WikiPageResponder implements SecureResponder {
protected WikiPage page ;
protected PageData pageData ;
protected String pageTitle ;
protected Request request ;
protected PageCrawler crawler ;
public Response makeResponse ( FitNesseContext context , Request request )
throws Exception {
String pageName = getPageNameOrDefault ( request , "FrontPage" );
loadPage ( pageName , context );
if ( page == null )
return notFoundResponse ( context , request );
else
return makePageResponse ( context );
}
private String getPageNameOrDefault ( Request request , String defaultPageName )
{
String pageName = request . getResource ();
if ( StringUtil . isBlank ( pageName ))
pageName = defaultPageName ;
return pageName ;
}
protected void loadPage ( String resource , FitNesseContext context )
throws Exception {
WikiPagePath path = PathParser . parse ( resource );
crawler = context . root . getPageCrawler ();
crawler . setDeadEndStrategy ( new VirtualEnabledPageCrawler ());
page = crawler . getPage ( context . root , path );
if ( page != null )
pageData = page . getData ();
}
private Response notFoundResponse ( FitNesseContext context , Request request )
throws Exception {
return new NotFoundResponder (). makeResponse ( context , request );
}
private SimpleResponse makePageResponse ( FitNesseContext context )
throws Exception {
pageTitle = PathParser . render ( crawler . getFullPath ( page ));
String html = makeHtml ( context );
SimpleResponse response = new SimpleResponse ();
response . setMaxAge ( 0 );
response . setContent ( html );
return response ;
}
...
}