Een onderdeel van het S.O.L.I.D. principe is Single Responsibility. Door elke class en hierin elke methode slechts één verantwoordelijkheid te geven zou de code leesbaarder moeten worden.
Ik houd echt van Single Responsible code, alleen soms denk ik dat we er in doorslaan. Methodes worden verbannen geabstraheerd naar helpers, omdat ze niet (lijken te) passen binnen de verantwoordelijkheid van een specifieke class.
Om de abstractie vervolgens te kunnen gebruiken wordt hij publiek toegankelijk gemaakt. Dit terwijl hij eerst gewoon private of protected had kunnen zijn. De toegankelijkheid voor lief genomen, het is immers geen grote ramp. Maar het was misschien niet nodig geweest.
One-time-use helpers
Door een methode te abstraheren naar een helper en deze publiek te maken verandert de API van de applicatie. Het is alsof je de muur naar de keuken van een restaurant uitbreekt. Ineens hebben de gasten weet van wat er binnen de keuken gebeurd. (Het is misschien een slecht voorbeeld, maar je snapt het punt).
Soms wil je een helper methode hebben, bijvoorbeeld omdat hij echt meerdere malen gebruikt wordt. Maar in de meeste gevallen is een ‘helper’ methode die wordt verplaatst naar een helper class juist gemaakt voor een one-time-use.
Daarnaast is er de kans dat een dergelijke class wordt gezien als een plek om vooraf al methodes te definiëren onder het idee: misschien heb ik hem vaker nodig. Of het is toch handig voor als je hem nogmaals nodig hebt.
Een helper (of utils) class wordt dan een vergaarbak van methodes die elders niet ‘wenselijk’ zijn. Maar de single responsibility van deze vergaarbak zelf is ver te zoeken.
Voorkom vergaarbakken
Noem je helper class niet Utils
of Helper
, maar maak meerdere classes. Bijvoorbeeld voor string (manipulaties), voor array, voor talen, enzovoort.
Daarnaast moet iedere methode zo min mogelijk afhankelijkheden hebben. Elke methode moet op zichzelf kunnen staan.
Wees pragmatisch
Het is helemaal niet verkeerd om op meerdere plekken dezelfde of vergelijkbare code te hebben. Classes mogen soms ‘helper’ methodes hebben, ook al passen deze helemaal niet binnen de scope van de class zelf.
Heb je de logica echt vaker nodig verplaats hem dan. Maar besef wel dat de functionaliteit van de classes die deze nieuwe herbruikbare functie gebruiken kan wijzigen. Soms betekent dit dat je helper methode aangepast moet worden. Dit gaat in de meeste gevallen vrij eenvoudig, maar helaas niet altijd.
Vraag jezelf altijd af: Is dit abstractie waard en wordt de code daar simpeler van?