Wann soll man Details einer Funktion in Unterfunktionen extrahieren, weil man ansonsten "den Wald vor lauter Bäumen nicht sieht"?4. Drei Unterfunktionen mit allgemeinen Namen
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 sollten beschreiben, warum etwas passiert und nicht was passiert. Was passiert sollte aus dem Code ersichtlich sein.
AntwortenLöschenZur 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.
Als ob ich Dir die Antwort diktiert hätte :-).
LöschenAllerdings 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.