LINQ Coding Guidelines #10–Methoden richtig verwenden

20. April 2015

Manche LINQ-Funktionen bieten Shortcuts an um zwei Dinge auf einmal zu tun. Keine gute Idee wie ich finde…

Empfehlung: Der Aufruf von LINQ-Methoden sollten sich auf die jeweilige Intention der Methode beschränken.

 

 

Simple Beispiele von Microsoft:

   1: string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 

   2: string startsWithO = strings.First(s => s[0] == 'o'); 

Und:

   1: int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

   2: int oddNumbers = numbers.Count(n => n % 2 == 1); 

Die Aufgabe von First(), Any(), Count() und anderen Aggregat-Funktionen dürfte klar sein. Leider gibt es auch Überladungen, die ein zusätzliches Filterkriterium übernehmen, was aber über den eigentlichen Sinn und Zweck hinausgeht – für die Filterung ist Where() da. Das ist ein – wie ich finde unnötiger – Shortcut, der das Single Responsibility-Prinzip verletzt.

Ergo sollten die Filterungen in den Bespielen mit Where() erfolgen und die nachfolgenden Aufrufe von First() und Count() ohne weitere Argumente.

Damit diese Aussagen nicht falsch interpretiert werden: Ich bin durchaus ein Freund von Hilfsmethoden die mehrere Aufrufe zusammenfassen. Sie können den Code-Umfang deutlich reduzieren und den Code lesbarer gestalten. Nur sollte die Methode klar ausdrücken, was sie tut. Mit zusätzlichen Methoden AnyWhere(), FirstWhere() oder CountWhere() hätte ich nicht das geringste Problem, die vorhandenen Methoden drücken aber den Zweck nicht vollständig aus.

PS: Es gibt durchaus Funktionen, bei denen ein Prädikat Sinn macht, z.B. TakeWhile(). Also nicht das Kind mit dem Bade ausschütten… 😉