C# Waarom kleine methodes beter dan zijn dan grote methodes

Gevoelsmatig zou je kunnen zeggen dat het hebben van vele kleine methodes trager werkt dan het hebben minder methodes die groter zijn. Niets hiervan is waar en dat heeft alles te maken met de manier waarop de .Net runtime werkt.

De .Net runtime roept de JIT compiler aan om de IL gegenereerde C# code te compileren naar machine code. De gehele applicatie wordt namelijk niet in één keer gecompileerd naar machine code. Dit omdat dit vertragend werkt en omdat de kans bestaat dat er code is gecompileerd welke nooit zal worden aangeroepen. Om dit te voorkomen roept de CLR de JIT compiler aan op basis van methodes. Dit minimaliseert de opstartkosten en het voorkomt dat de applicatie vastloopt als later meer code moet worden geJIT. De ontwikkelaar kan dus de irrelevante code beperken door grote methodes op te hakken in kleinere methodes. Dit levert dus performancewinst op en bovendien brengen kleine methodes meer voordelen met zich mee:

- Single Responsibility Pattern: Voor classes geldt dat zij verantwoordelijk moeten zijn voor één ding, maar ditzelfde geldt ook voor methodes. Door het ophakken van grote methodes in kleinere, ga je sneller voldoen aan dit principe.

- Leesbaarheid: Door je code op te spitsen in kleinere methodes, wordt de code een stuk leesbaarder. In plaats dat er een stuk code staat, staat er nu een beschrijvende naam (de naam van de methode).

Voorbeeld:
Stel je hebt een methode 'DoeIets'. Deze methode bepaalt aan de hand van een bepaalde voorwaarde wat er moet gebeuren. Beide paden (if of else pad) hebben een aanzienlijk aantal regels code:

public void DoSomething()
{
  if(someCondition)
  {
     // 100 lines of code
    
  }
  else
  {
     // 80 lines of code
  }
}

Op deze manier wordt door de runtime de complete methode DoeIets gecompileerd naar machine code.Dit betekent dat of de 100 regels code, of de 80 regels code voor niets worden gecompileerd. Dit is natuurlijk niet efficiënt. Om deze efficiëntie te verhogen, moet de code van de if en van het else statament ondergebracht worden in een methode:

public void DoeIets()
{
  if(someCondition)
  {
     ExecuteWithoutValidation();
    
  }
  else
  {
     SaveAndValidateMyObject();
  }
}

Op deze manier wordt alleen die code gecompileerd welke daadwerkelijk nodig is. Een vorm van lazy loading dus. Bijkomend voordeel is dat meteen duidelijk is wat er gebeurt binnen de if en else statements vanwege de naam van de methode.

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren