Clean Code: Variable vs. Methode

aCleanCoder

Mitglied
Nabend,

in einem Video zum Thema Clean Code wurde gesagt, dass man Zwischenvariablen verwenden sollte, um es etwas leserlicher zu machen.

Also statt

Java:
    if (days == 1 && (startDate.DayOfWeek == DayOfWeek.SATURDAY || startDate.DayOfWeek == DayOfWeek.SUNDAY)) {
        //
    }

wäre folgende Variante besser

Code:
    var isJustASingleSaturdayOrSunday = days == 1 && (startDate.DayOfWeek == DayOfWeek.SATURDAY || startDate.DayOfWeek == DayOfWeek.SUNDAY)
        if (isJustASingleSaturdayOrSunday) {
            //
        }

Macht für mich auch soweit Sinn dem ganzen einen Kontext zu geben. Generell mache ich das soweit auch schon, allerdings in der Regel über eine Methode, statt einer Zwischenvariable

Code:
    private boolean isJustASingleSaturdayOrSunday() {
        return    days == 1 && (startDate.DayOfWeek == DayOfWeek.SATURDAY || startDate.DayOfWeek == DayOfWeek.SUNDAY)
    }

Ist das eher eine Frage des Geschmacks welche Variante man wählt? Wie würdet ihr es machen? Aber fällt wohl eher in die Kategorie "Kommt drauf an" !? 😀
 
Eine Methode daraus zu machen, halte ich eigentlich immer für eine gute Idee. Zumal du dann die Methode auch testen kannst (vorausgesetzt, sie ist für den Testcode sichtbar).
Ob du die Methode jetzt auf Instanzvariablen deines Objektes zugreifen lässt (also eher objektorientiert denkst), oder alle nötigen Inputs für die Methode auch als Parameter der Methode modellierst (also days und startDate) (also eher funktional denkst), ist vermutlich auch Geschmackssache.
 
Danke für die Antworten, dann würde ich es auch so weiter beibehalten 🙂

Es gab in dem Video auch ein Kommentar, wo auch gefragt wurde, was denn gegen eine Methode sprechen würde.
Die Begründung vom Uploader war, dass dies die Strukurkomplexität der Klasse erhöhen würde, da man zB bei der Analyse auf viele private Methoden stoßen würde, die nichts mit der eigenen Aufgabe zu tun haben.
 
Danke für die Antworten, dann würde ich es auch so weiter beibehalten 🙂

Es gab in dem Video auch ein Kommentar, wo auch gefragt wurde, was denn gegen eine Methode sprechen würde.
Die Begründung vom Uploader war, dass dies die Strukurkomplexität der Klasse erhöhen würde, da man zB bei der Analyse auf viele private Methoden stoßen würde, die nichts mit der eigenen Aufgabe zu tun haben.
Das ist aber doch nicht das Thema. Dann erhöht sich die Strukturkomplexität. Wenn diese zu hoch ist, dann muss man da halt auch etwas machen.

Bei privaten Methoden ist z.B. immer die Frage: was macht die Methode? Ist es etwas bzw. gehört es zu etwas, das man selbst wieder Kapseln kann? Dann hat man eine neue Klasse die getestet werden kann und die Strukturkomplexität der ursprünglichen Klasse ist reduziert.
 
Es gab in dem Video auch ein Kommentar, wo auch gefragt wurde, was denn gegen eine Methode sprechen würde.
Man sollte nicht alles, was andere sagen, immer als wahr nehmen. Sondern immer prüfen, abwägen, und selber bewerten.
Der Videoautor mag seine Gründe dafür haben, vielleicht hat er aber auch keine Ahnung und lebt davon, Videos ins Netz zu stellen. Auch Geistesgrößen wie Knuth, Lamport, usw. haben letztendlich nur ihre eigene Meinung zum Besten gegeben, haben diese aber auch ausführlich und nachvollziehbar begründet, und oft hat sich deren Meinung zu bestimmten Themen aus jahrelanger Erfahrung gebildet.

Das Selberdenken nimmt einem niemand nirgendwo ab, das kann und darf man nicht aus der Hand geben. In allen Dingen.


Die Begründung vom Uploader war, dass dies die Strukurkomplexität der Klasse erhöhen würde, da man zB bei der Analyse auf viele private Methoden stoßen würde, die nichts mit der eigenen Aufgabe zu tun haben.
Wenn du viele private Methoden hast, die deklariert wurden um einzelne Arbeitsschritte lesbar zusammenzufassen: Wie kann es dann sein, daß diese Methoden mit der eigentlichen Aufgabe nichts zu tun haben sollten?

PS: Ohne Unittests ihre Wichtigkeit absprechen oder Testbarkeit kleinreden zu wollen: Aber um eine komplexere Methode in mehrere einfache Methoden aufzuteilen kann man es durchaus in Kauf nehmen, mehrere private Methoden nicht mehr testen zu können. Der Unittest wird wahrscheinlich so oder so einen Fehler werfen wenn etwas nicht stimmt, und die privaten Methoden werden da ja trotzdem auch aufgerufen, auch wenn es keinen extra Test für gibt.
Den Fehler wird man also wahrscheinlich trotzdem bemerken, aber beheben kann man ihn bedeutend schneller, wenn man fünf Methoden hat und an deren Namen man schon ablesen kann was sie liefern sollte. Und das läßt sich dann relativ einfach debuggen. Ich bin ja kein Programmierer, aber ich würde mal behaupten daß Codelesbarkeit da mehr bringt als für jedes Codefitzelchen einen separaten Unittest zu haben.
 
Ist das eher eine Frage des Geschmacks welche Variante man wählt? Wie würdet ihr es machen? Aber fällt wohl eher in die Kategorie "Kommt drauf an" !?
Ich finde, einen komplexen Ausdruck durch die Deklaration einer gut benannten Variable zu dokumentieren, kann durchaus eine sinnvolle Alternative zur Auslagerung in eine Methode sein. Voraussetzung wäre für mich, dass der Ausdruck ohnehin nur an einer Codestelle vorkommt und vielleicht noch, dass die Abstraktionsstufe des Ausdrucks nicht zu weit unterhalb der des Codes seiner Verwendung sein sollte.
 
Was ich noch anfügen möchte:
Ich habe mich neulich mal mit jemandem hingesetzt, um gemeinsam etwas Code zu debuggen den ich vor über einem Jahr mal geschrieben habe, sich da allerdings mehrere Fehler eingeschlichen haben die ich alleine nicht mehr sehe. Betriebsblindheit.

Dieser Jemand war sehr erstaunt darüber, daß ich nach so langer Zeit immer noch weiß, was ich mir wo wie gedacht habe und da immer noch einen guten Überblick darüber habe. Tatsache is aber: Diesen Überblick habe ich überhaupt nicht. Ich weiß nur noch, daß ich den Code möglichst so geschrieben habe, daß ich ihn als Anleitung, als Fließtext lesen kann. Und weiß daher z.B., daß ich hinter einer Objektreferenz, die "set" heißt, auch ein Set erwarte und es ein Fehler sein muß, wenn es kein Set ist.

Soweit ich das verstanden habe, ist genau das das große Ziel von Clean Code. Nur um die Wichtigkeit von Codelesbarkeit mal einzuordnen, kann man m.M.n. gar nicht hoch genug einschätzen.
 

Zurück
Oben