Indikator #2 – Variablen

So grundlegend Variablen in der Programmierung sind, so falsch kann man sie benutzen.

Es ist nicht überraschend, dass diese oft falsch in den meisten Fällen oder unnötigerweise benutzt werden. Meistens werden sie ähnlich wie Kommentare verwendet. Aber das ist grundlegend falsch.

Eine Variable dient dazu Inhalte für die mehrfache Verwendung einfach zugänglich zu machen. Dabei sollte der Name den nur den Inhalt wieder spiegeln. Fängt man an mehr Variablen zu verwenden, ist dies ein Indikator dafür, das zu viele Dinge gemacht werden die hier gar nicht gemacht werden sollten.

Dinge die man sich merken muss, kosten uns Ressourcen und machen es schwieriger den code zu verstehen.

Aus meiner Sicht können in den seltesten Fällen Variablen dazu verwendet werden den Code lesbarer zu gestalten, das scheint nur auf den ersten Blick so. In der Regel kann der Code so angepasst werden das man keine Variablen benötigt. Lesbarkeit kommt in erster Linie von guten Design.

Beispiele

Wichtig ist zu erkennen was nicht stimmt und das korrigieren zu können. Doch wie erkennt man diese?

Wenn eine Variable verwendet wird um Dinge zu Kürzen

Wenn der benötigte Inhalt innerhalb eines Objektes selektiert wird, dann fängt man oft an Variablen zu verwenden. Beispiel:

var author = Books.Where(e => e.Published()).OrderBy(d => d.PublishingDate()).Author().Name;

Console.WriteLine($"The author of the latest book is: {Author}");

Hier sind gleich mehrere Probleme: Erstens, der Name „author“, ich muss später wissen welche Art von Variable es ist, von Namen her könnte auch eine Author-Klasse sein.

Zweitens, ich benutze die Variable nur einmal. Hmm, aber jetzt das ganze Konstrukt in den ein den WriteLine einzutragen, macht es auch nicht wirklich lesbarer.

Könnte also so aussehen: (Teil I)

Console.WriteLine($"The author of the latest book is: {Books.Where(e => e.Published()).OrderBy(d => d.PublishingDate())
First().Author().Name}");

Okay, aber nein. Das reicht nicht, also warum nicht eine Methode, welche die Selektierung extrahiert?

Also so: (Teil II)

private string LatestPublishedAuthor(List<Book> books)
=> Books
.Where(e => e.Published())
.OrderBy(d => d.PublishingDate())
First()
.Author()
.Name;

Console.WriteLine($"The author of the latest book is: {LatestPublishedAuthor(Books))}");

Es ist wahrscheinlich das diese Logik wiederverwendet wird, aktuell könnte man diese nur in der Klasse benutzen, ggf. will man das aber auch woanders wiederverwenden. Daher, warum nicht, eine eigene Klasse: (Teil III)

public class LatestPublishedBook: IBook
{
public LatestPublishedBook(IEnumerable<IBook> books) {
_origin = book;
}
private IBook Value()
=> _origin
.Where(e => e.Published())
.OrderBy(d => d.PublishingDate())
.First();

public Author Author => Value().Author;
}

Console.WriteLine($"The author of the latest book is: {new LatestPublishedBook(Books).Author())}");

Ja, es ist mehr Code, da stimmt ich zu. Aber es:

  1. Deklarative, sie sagt aus was es ist.
  2. Sauberer, keine Variablen.
  3. Wiederverwendar,die Klasse kann einfach wiederverwendet werden.
  4. Testbarkeit,als Klasse kann dies nun einfach getestet und ausgetauscht werden.
Print Friendly, PDF & Email