Direkt zum Hauptbereich

Wald oder Bäume

Wann soll man Details einer Funktion in Unterfunktionen extrahieren, weil man ansonsten "den Wald vor lauter Bäumen nicht sieht"?

Und wann soll man lieber die Details sichtbar lassen?

Welches sind die Vor- und Nachteile ​​der folgenden Beispiele und welches favorisiert ihr?

1. Alle Details


import sys

def main():
    numbers = [int(argument) for argument in sys.argv[1:] if str.isnumeric(argument)]

    for i in range(0, len(numbers)):
        for j in range(1, len(numbers) - i):
            if numbers[j] < numbers[j - 1]:
                numbers[j-1:j+1] = [numbers[j], numbers[j - 1]]

    print(', '.join([str(number) for number in numbers]))

if __name__ == '__main__':
    main()

2. Alle Details mit Kommentaren


import sys

def main():
    #Read numbers from command line
    numbers = [int(argument) for argument in sys.argv[1:] if str.isnumeric(argument)]

    #Sort numbers
    for i in range(0, len(numbers)):
        for j in range(1, len(numbers) - i):
            if numbers[j] < numbers[j - 1]:
                numbers[j-1:j+1] = [numbers[j], numbers[j - 1]]

    #Write numbers to console
    print(', '.join([str(number) for number in numbers]))

if __name__ == '__main__':
    main()

3. Drei Unterfunktionen mit konkreten Namen


import sys

def main():
    numbers = readNumbersFromCommandLine()
    sort(numbers)
    writeNumbersToConsole(numbers)

def readNumbersFromCommandLine():
    return [int(argument) for argument in sys.argv[1:] if str.isnumeric(argument)]

def sort(numbers):
    for i in range(0, len(numbers)):
        for j in range(1, len(numbers) - i):
            if numbers[j] < numbers[j - 1]:
                numbers[j-1:j+1] = [numbers[j], numbers[j - 1]]

def writeNumbersToConsole(numbers):
    print(', '.join([str(number) for number in numbers]))

if __name__ == '__main__':
    main()

4. Drei Unterfunktionen mit allgemeinen Namen


import sys

def main():
    numbers = getNumbers()
    sort(numbers)
    setNumbers(numbers)

def getNumbers():
    return [int(argument) for argument in sys.argv[1:] if str.isnumeric(argument)]

def sort(numbers):
    for i in range(0, len(numbers)):
        for j in range(1, len(numbers) - i):
            if numbers[j] < numbers[j - 1]:
                numbers[j-1:j+1] = [numbers[j], numbers[j - 1]]

def setNumbers(numbers):
    print(', '.join([str(number) for number in numbers]))

if __name__ == '__main__':
    main()

Kommentare

  1. Kommentare sollten beschreiben, warum etwas passiert und nicht was passiert. Was passiert sollte aus dem Code ersichtlich sein.

    Zur Gruppierung eignen sich die Funktionen dann auch besser und geben dem Abschnitt einen Namen, genau wie deine Kommentare.

    Das die Funktion dann nur an einer einzigen Stelle verwendet wird ist dann nicht so schlimm.

    Wenn es sich mit der Funktion dann doch komisch überdimensioniert an, ist es dann doch besser Inline zu schreiben.

    Ich denke an Code smells. Müsste ich Mal lesen.

    AntwortenLöschen
    Antworten
    1. Als ob ich Dir die Antwort diktiert hätte :-).

      Allerdings stoße ich bei manchen Entwicklern auch auf das Argument, dass Unterfunktionen nerven, da man dann immer im Code hin und her springen muss, um zu erfahren was der Code denn nun eigentlich machen würde. Es sei doch viel besser wenn alles in einer Funktion an einer stelle wäre, weil der Code dann viel besser zu verstehen sei.

      Löschen

Kommentar veröffentlichen

Beliebte Posts aus diesem Blog

Utopie gesucht

In den 90er Jahren gab es meiner Meinung nach eine positive Zukunftssicht. Das sah man u.a. in der Serie Star Trek The next generation. Heute dagegen scheint es nur noch pessimistische Blicke auf die Zukunft zu geben. Auch die aktuellen Star Trek Serien stellen eine düsterere Welt dar. Dies könnte zu einer selbst erfüllenden Prophezeiung werden. Gibt es in der aktuellen Popkultur noch Utopien?

Avatar - mit Glatze bitte!

Vor einigen Monaten kamen zwei neue Mitarbeiter in unser Team. Da einer von ihnen auch Martin hieß, führte das oft zu Verwechslungen und der Nachfrage „welcher jetzt?“ – vor allem in der Remote-Kommunikation. Beschreibungen wie „der zweite Martin“ oder „der andere Martin“ hielt ich für unpassend. Also schlug ich vor, dass ich von nun an einfach einen anderen Rufnamen erhalte und wählte: „Guybrush“. Damit das auch immer präsent ist, ersetzte ich auch mein Profilbild an allen mir möglichen Orten durch ein Pixelbild von Gybrush aus Monkey Island 2 : Wie erwartet, setzte sich das sehr schnell durch. Vor einigen Tagen wollte ich dieses Bild jedoch durch eine etwas auflösungsstärkere Variante ersetzen. Die gefundenen Bilder machten jedoch sehr deutlich, dass es doch erheblich an Ähnlichkeit mangelte. Vor allem die Haare entsprachen so gar nicht meiner Frisur. Also beschloss ich, dass dies doch mal ein guter Einsatz für einen AI-Bildgenerator wäre. Die zwei mit denen ich bisher gearbeitet h...

Markt und Staat - Teil 1

"Entschuldigen Sie bitte! Was heißt Mittagessen nach Vortragsthema?" "Nun, das heißt, dass der Ablauf des Mittagessens sich nach den Themen des jeweiligen Tages richtet." "Können Sie mir das etwas genauer erklären?" "Aber gerne. Sehe Sie, der erste Tag steht unter dem Thema 'Der demokratische Staat'. Zu Tagesbeginn sammeln wir von allen Konferenzteilnehmern 5,- Euro ein: die Mittagessenpauschale." "Verstehe." "Im Laufe des Vormittages teilen wir Speisekarten mit den verfügbaren Mahlzeiten aus. Sie kreuzen an, welches Gericht Ihnen zusagt und geben die Karte bis zum Mittag wieder bei uns ab." "Ok. Ich schreibe also meinen Namen auf den Zettel..." "Nein." "Aber woher wollen Sie dann wissen für wen welches Gericht ist?" "Das ist nicht wichtig. Alle Teilnehmer bekommen das gleiche." "Aber warum dann die Sache mit dem Ankreuzen?" "Um festzustellen, für welche Mahlzeit s...