Hledám nástroj pro statickou statistickou analýzu kódu
- David Grudl
- Nette Core | 8227
Tohle nosím v hlavě už mnoho let, ale teď se mi zdá, že by mohlo být relativně snadno realizovatelné. Jednak možná už něco takového existuje, nebo by se k tomu dal „znásilnit“ PHPStan či Rector.
Hledám nástroj, který spustím nad vlastním kódem, a on vygeneruje statistiku počtu vytváření objektů a volání metod u tříd spadajících pod nějaký namespace.
Příklad výstupu pro namespace Nette\*
:
Nette\Utils\Strings::substring() 153x
Nette\Utils\ArrayList::__construct() 57x
Nette\Utils\ArrayList::count() 57x
Nette\Forms\Form::__construct() 3x
...
Dokonalé by bylo, kdyby dokázal do statistiky zahrnout i kolikrát se u jednotlivých metod používají jednotlivé parametry, nejlépe s rozlišením na poziční a pojmenované, a jestli se využívá návratová hodnota.
A úplně nejdokonalejší by bylo, kdyby dokázal říct, od kterých tříd spadajících do namespace se dědí a které metody se přepisují.
K čemu by to bylo dobré?
Jednou ročně bych požádal co nejvíc uživatelů o vygenerování statistik z jejich codebase a anonymizované odeslání. Získal bych tak perfektní představu, které featury jsou používané a který kód je naopak mrtvý. Jaké API uživatelům vyhovuje a jaké ne. Což by bylo hodně důležité vodítko při dalším vývoji.
Existuje už něco takového? Nebo dokážete takový nástroj vytvořit?
- Polki
- Člen | 553
Určitě by něco takového šlo vytvořit. Minimálně nad PHP 8 v tom nevidím problém. Jestli to existuje nevím, ale dokážu si představit, že pokud se něco takového vytvoří, tak by k tomu mohlo být volitelné rozšíření, které se bude spouštět cronem a jednou za rok bude automaticky projíždět kód a odesílat anonymně data na mail samo, takže uživatelé nebudou muset spouštět a odesílat statistiku ručně.
Jediný problém, kdy by statistika nemusela být přesná si myslím, že je použití proměnných místo názvů:
function foo(string $class, string $method, string $value): string
{
return $class::$method($value);
}
Kde třída a metoda se načítají například z databáze apod.
- matyx
- Člen | 9
@DavidGrudl Zajímavý nápad. Šel by na to použít psalm (asi by to šlo i s phpstanem). Zkusil jsem vytvořit PoC nad nette-sandboxem, výsledek můžeš vidět tady.
Má to určité limity – výsledek silně závisí na kvalitě zkoumaného kódu (když se nepodaří statické analýze určit typ, tak to (asi?) nic nevypíše). Ale pro statistické účely by to nemuselo vadit. S trochou práce by se to dalo naučit i počítání použitých argumentů.