Tutti ricorderete il tool per l’analisi delle code metrics in ambiente .NET. L’ultima release di NDepend, la versione v2018.1 rilasciata il 7 di Marzo di quest’anno, introduce la compatibilità con il .NET Core 2.1.

Supporto del .NET Core: verso l’Internet of things

.NET Core è la versione ridotta e multipiattaforma del framework .NET che supporta Windows, MacOS e Linux così come dispositivi IoT. Abbiamo apprezzato lo sforzo fatto dall’azienda per non garantire la piena compatibilità con questa versione del Framework meno diffusa, in modo da poter assicurare la qualità del codice anche in questo ambito dello sviluppo software. L’industria legata all’internet of things è in grande espansione e la disponibilità di processori sempre più economici e capaci di consumare poca corrente apre scenari inesplorati.

Segnalazioni più precise

Un altro sforzo è stato indirizzato verso il tentativo di ridurre il numero di “falsi positivi”. Falso positivo è un termine che indica tutti quei casi in cui non c’era un problema, ma viene comunque segnalato per errore.

Alcune interessano le naming convention e le eccezioni a queste per gli UnitTest, le classi candidate a essere trasformate strutture e ancora varie modifiche riguardano le interfacce vuote, l’override dei metodi, i metodi che dovrebbero essere dichiarati statici e via discorrendo. Al di là delle singole modifiche l’attenzione in questo ambito è sicuramente un segnale positivo che porterà a segnalazioni sempre più pertinenti senza la necessità di modificare le regole a mano.

A quando il refactoring automatico tramite AI e reti neurali?

L’altra direzione verso cui NDepend si sta muovendo è quella delle API. Con l’avanzare delle reti neurali e delle varie tipologie di intelligenza artificiale l’idea di automatizzare parte del refactoring si prospetta sempre più vicina. L’idea di usare il machine learning e le reti neurali non è poi così assurda visto che il codice open source ci garantisce una immensa base dati disponibile per l’apprendimento. L’aspetto più complesso riguarderebbe lo sforzo necessario a farlo in maniera il più possibile “unsupervised“. Se da un lato infatti i linguaggi di programmazione non presentano le stesse sfide che evidenzia la comprensione del linguaggio naturale (vedi conversational AI) al contempo la fase di training più efficiente richiederebbe di dare in pasto alla rete neurale parti di codice in versione naturale e ottimizzata. L’altra speranza potrebbe venire da Reinforcement Learning e General Adversarial Networks. Al momento insomma le speranze per il futuro sono tante.

qualità software

Ma è davvero così importante il refactoring e il rispetto delle code metrics?

Tra le proprietà interne del codice individuate dall’ingegneria del software la leggibilità e la modularità sono fondamentali. Tuttavia per un software legacy in produzione è un rischio notevole, oltre che un notevole investimento di tempo, il tentare di decifrare le vecchie funzionalità e modificarle senza produrre danni. Nel mondo lavorativo la code coverage (la copertura del codice mediante unit test) è spesso piuttosto bassa, specialmente appunto per il codice più vecchio.

Per le suddette ragioni il più delle volte si cerca di costruire un nuovo sistema software che vada a sostituire il precedente, ma il problema in questo caso è nella raccolta dei requisiti. Per farla breve tool di refactoring automatico che utilizzino le API di software come NDepend e Resharper potrebbero produrre una reale svolta nel mondo della programmazione.

NDepend permette di individuare già a colpo d’occhio lo stato del codice, sui motivi per cui un metodo lunghissimo sia così deleterio lasciamo a voi il compito di approfondire.