Nur so ein Gedanke… und doch ein Kommentar!


Vor ein paar Tagen habe ich auf einen Blogpost von Piers Cawley verwiesen, in dem er meinte, man solle immer, wenn man ein Stück Code zum zweiten mal schreibt, nachsehen, ob nicht vielleicht die Smalltalk-Klassenbibliothek eine Lösung für genau dieses Problem bereithält.

Nun ist es tatsächlich so, dass die  Smalltalk-Klassenbibliothek eine wahre Fundgrube ist. Schliesslich stecken hier rund 30 Jahre Entwicklungsgeschichte drin.

Was mich an Cawleys Post nach etwas Nachdenken stört, ist die Sache mit dem zweiten Mal. Eigentlich sollte man sich schon beim ersten Schreiben einer Methode schon Gedanken darüber machen, ob es nicht vielleicht schon eine Lösung für das Problem gibt.

Ein kleines Beispiel: vor einiger Zeit arbeiteten wir an einem O/R-Persistenzframework (damals machte man sowas selber😉 ). Dabei werden aus Listen von zu mappenden Attributen und ihren WertenSQL-Statements generiert, dieständig aus komma-separierten Listen bestehen, etwa sowas:

select name, vorname, geburtsdatum from table1 where ...

Um also eine Attributliste in einen String zu verwandeln, in dem nach jedem ausser dem letzten Eintrag ein Komma eingefügt wird, implementierten wir damals eine Methode in der Klasse Collection, die in etwa so aussah:

Collection>>asCommaSeparatedListOn: aStream

1 to: self size - 1 do: [:index|
(self at: index) printOn: aStream.
aStream nextrPutAll: ', '.
].
self size >= 1 ifTrue: [
aStream nextPutAll: self last printString].

Ich würde im Nachhinein sogar vermuten, dass die Methode damals noch etwas umständlicher aussah und schlechter zu lesen war. Wirklich Smalltalk-like ist diese Art der Iteriererei aber nicht gerade.

Heute, nachdem mich ein Kollege mal auf die richtige Methode gestossen hat, würde ich in etwa folgenden Code nutzen:

aCollection
do: [:item| aStream nextPutAll: item printString]
separatedBy: [aStream nextPutAll: ', '].

Genau das meinte Cawley wohl: die Smalltalk Klassenbibliothek ist voll von eleganten Lösungen für alle möglichen Probleme. Es braucht allerdings ein wenig Zeit und Erfahrung, diese Kniffe zu kennen bzw. zu wissen, wie und wo man danach sucht…