Meer informatie Ja, ik geef toestemming
Door Peter Paul Keulers Leestijd 6 min.

Codekwaliteit beoordelen met PhpMetrics

PhpMetrics is een tool waarmee je op een objectieve manier kunt kijken naar de kwaliteit van code. Het is niet de enige beschikbare tool maar wel een heel krachtige die de resultaten bovendien op een begrijpelijke en zeer fraaie manier grafisch weergeeft (waarbij zelfs rekening wordt gehouden met kleurenblinde gebruikers).

Maar waar kijkt PhpMetrics nu precies naar? Een overzicht.

Violations

Om te zorgen dat code inzichtelijk, overdraagbaar en goed te onderhouden is, zijn er allerlei conventies bedacht. De vijf belangrijkste principes met betrekking tot object-georiënteerd programmeren zijn geformuleerd in SOLID: Single responsibilty principle, Open/closed principle, Liskov substitution principle, Interface segregation principle en Dependency inversion principle. PhpMetrics toont de Violations of schendingen van dit soort conventies.

Unit testing

Tegenwoordig is het normaal dat je naast de ‘normale’ code van een applicatie ook automatische tests schrijft. Deze tests worden uitgevoerd bij het leveren van nieuwe code om de stabiliteit van de applicatie te waarborgen. PhpMetrics laat zien welke delen van de code door deze tests worden afgedekt. Een hoge ‘code coverage’ is belangrijk, maar 100% is onmogelijk. PhpMetrics laat ook zien hoe lang iedere test duurt. Langzame tests vertragen de oplevering en moeten herschreven worden.

Size & volume

Hier worden de simpele kwantitatieve gegevens van de code weergegeven:

LLOC (aantal regels code per bestand); CLOC (aantal regels met commentaar); Volume (hoeveel tekens in het bestand); Intelligent Content (daadwerkelijk nuttige informatie in het bestand); Comment Weight (verhouding commentaar en code).

PhpMetrics geeft inzicht in hoe beschrijvend de code is. Staat er veel beschrijvende uitleg in? Zit er veel code in een enkel bestand (niet onderhoudbaar) of zijn het veel kleine brokken informatie (wel onderhoudbaar).

Complexity & defects

Hoe complex is de code?

Weighted Methods per Class: hoeveel functies/gedrag zit er in een class (een object) en hoe complex zijn die individuele functies?

Class Cyclomatic Complexity: hoeveel ‘beslispunten’ zijn er in een class. Hoe meer, des te complexer.

Maximum method cyclomatic complexity: hoeveel ‘beslispunten’ zijn er in de meest complexe functie van een class.

Relative data complexity: hoeveel gegevens worden gelezen en weggeschreven door een class? Hoe meer data, des te complexer.

Relative Structural Complexity: hoe gestructureerd is een class/bestand?

Bugs/Defects: een schatting van de hoeveelheid bugs en gebreken.

Jorick en Jochem

Object oriented metrics

Dit zijn metingen verricht op individuele classes (Gebruikers, Projecten, etc.).

Lack of Cohesion of Methods: is de code samenhangend? Samenhangend = onderhoudbaar.

Volume: hoe groot is de class? Groter = minder goed onderhoudbaar.

Class Cyclomatic Complexity: hoeveel beslispunten/momenten zijn er in een class? Hoe meer des te complexer.

Maximum Method Cyclomatic Complexity: hoeveel beslispunten/moment in de meest complexe methode (gedrag) van de class (het object)?

Bugs: benadering van het aantal bugs in de class op basis van de punten hierboven.

Difficulty: benadering van de complexiteit op basis van de punten hierboven.

 

Object Relations

Een grafische weergave van de afhankelijkheden van verschillende objecten zie je in een oogopslag of je te maken hebt met grote/zware applicatie.

 

Object georiënteerd programmeren in het kort

Een object is iets of iemand uit de echte wereld, bijvoorbeeld Teun Vos of een Tesla. Zo’n object behoort tot een class, in dit geval Personen of Auto’s. Een functie of method is het gedrag binnen een class, in dit geval bijvoorbeeld Eten of Rijden.

De class (auto) bevat attributen (merk, aandrijving, kleur, toestand) en is als het ware een blauwdruk voor de objecten. Als je attributen een waarde geeft krijg je een object (Tesla, elektrisch, rood, rijdend met 120 km/u).

Classes zijn op deze manier dus duizenden keren opnieuw te gebruiken. Goed geprogrammeerde object georiënteerde code is zeer gestructureerd. En daardoor makkelijk leesbaar, herbruikbaar en daarnaast ook beter te onderhouden.

Coupling

Op basis van twee definities wordt duidelijk gemaakt wat de mate van onderlinge afhankelijkheid is tussen verschillende delen code:

Afferent coupling: Hoeveel andere classes zijn afhankelijk van deze class?

Efferent coupling: Van hoeveel andere classes maakt deze class gebruik?

Hoe lager de waardes, hoe meer samenhang en hoe beter de onderhoudbaarheid.

Package oriented metrics

Dit zijn beoordelingen over grotere delen van de code (packages):

Classes: hoeveel classes (objecten) zitten in dit deel van de code? Als het teveel zijn zou er geherstructureerd moeten worden.

Abstraction: er zijn classes die iets ‘doen’ en classes die niets doen maar alleen vertellen hoe het moet. Er is balans tussen beide nodig om structuur aan te brengen en functionaliteit te kunnen implementeren.

Instability: hoe goed kan dit deel van de code overweg met aanpassingen of herschrijven?

Distance from the main sequence: combinatie van abstraction en instability om aan te geven of de implementatie in balans is.

De laatste vier kolommen geven aan wat de afhankelijkheid is van deze package met andere packages in de applicatie. Samen geeft dit op een hoger niveau aan hoe stabiel en gestructureerd de code in elkaar steekt.

Package relations

Een grafische weergave van de afhankelijkheden van verschillende open-source packages (die op Internet te vinden zijn) en worden toegepast in de applicatie. Als we bijvoorbeeld een Excel export willen implementeren, dan gebruiken we de PHPExcel package. Wordt zo’n package door andere packages gebruikt, dan wordt dat zichtbaar in deze afbeelding.

PHP metrics logical lines

Alles doorlopen - wat nu?

Nadat we de code van een applicatie met PhpMetrics hebben ‘doorgemeten’ hebben we een goed inzicht in de staat van de applicatie. Hoe complex, gestructureerd en onderhoudbaar is de code? Zijn de resultaten zeer slecht, dan is volledige herbouw van de software noodzakelijk. Maar het kan ook zijn dat refactoring een oplossing biedt, in dat geval worden delen van de code herschreven.

Lees hier meer over software herbouwen of refactoring.

De PhpMetrics tool is een onderdeel van een (bredere) applicatie assessment waarmee we inzicht geven in de codekwaliteit van software. Applicatie assessment is een separate dienst van Way2Web maar wordt ook doorlopend toegepast bij onze eigen software development.

Bent u klaar voor the next level?

De digitale transformatie biedt fantastische nieuwe mogelijkheden en kansen. Ook voor uw onderneming, dat weet ik zeker. Als IT-specialist én ondernemer praat ik daar graag eens met u over verder. Geheel vrijblijvend natuurlijk. Zullen we een afspraak maken?