Haftungsausschluss: falsch positive Ergebnisse; Praktisch ist dies eher für "Erkundungen" als für die "Durchsetzung" nützlich
Vertikale Ordnung
Im Allgemeinen möchten wir, dass Funktionsanrufabhängigkeiten in die nach unten gerichtete Richtung zeigen. Das heißt, eine Funktion, die aufgerufen wird, sollte eine Funktion brüllen, die das Aufruf ausübt. Dies erzeugt einen schönen Fluss im Quellcode -Modul von hoher Ebene bis zu niedriger Ebene. Wie in Zeitungsartikeln erwarten wir, dass die wichtigsten Konzepte an erster Stelle stehen, und wir erwarten, dass sie mit der geringsten Menge an Umweltdetails ausgedrückt werden. Wir erwarten, dass die Details auf niedriger Ebene zuletzt kommen. Auf diese Weise können wir Quelldateien überfliegen und den Kern aus den wenigen Funktionen richten, ohne sich in die Details einwirken zu müssen.
- Clean Code, Kapitel 5, P84, Robert C. Martin, 2009

go install github . com / nikolaydubina / vertfn @ latest vertfn --verbose ./...
Die Verbesserung der falschen positiven Rate ist gut, z. B. für folgende Fälle:
Clean Code, Kapitel 5, Code Beispiel 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 ;
}
...
}