Java/Android-Grundlagen: Code wiederverwenden

Java/Android-Grundlagen: Code wiederverwenden

Guter Code lässt sich wiederverwenden. Das ist ein wichtiges Prinzip in der Software-Entwicklung und sogar ein Qualitätsmerkmal von gutem Code.

Wenn ihr also Code schreibt, um eine Aufgabe zu erledigen oder ein Problem zu lösen, dann versucht diesen Code so zu schreiben, dass ihr ihn an anderen Stellen oder sogar in anderen Projekten wiederverwenden könnt.

Wie geht das? Hier ist ein Beispiel:

Abstrahieren durch Parametrisierung

Um einen einfachen Dialog mit einem OK-Button anzuzeigen, muss man mindestens 5 Zeilen Code schreiben. Will man in einer App mehrere solcher OK-Dialoge haben, müsste man diese 5 Code-Zeilen an verschiedene Stellen kopieren und anpassen. Das ist natürlich nicht schön. Besser ist es, diese 5 Zeilen zu „abstrahieren“, also auf das gemeinsame Minimum zu reduzieren und in einen einzigen Aufruf zu kapseln. So kann das dann einfach wiederverwendet werden.

Hier sind die 5 Zeilen für einen OK-Dialog:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Das ist eine Testnachricht.");
builder.setPositiveButton("OK", null);
AlertDialog dialog = builder.create();
dialog.show();

Um das wiederverwenden zu können, erstellen wir eine neue Klasse, nennen sie zum Beispiel „OkDialog“ und schreiben eine Methode dafür. In diesem Fall bietet sich eine statische Methode an. So können wir den Dialog später mit einer simplen Code-Zeile erzeugen.

Wir haben unsere 5 Code-Zeilen parametrisiert. Den Context übergeben wir von außen, und auch die Nachricht, die angezeigt werden soll, wird übergeben. Diesen Vorgang nennt man ganz allgemein „abstrahieren“. Wir verallgemeinern unseren Code so sehr, dass wir ihn mit wenigen Parametern so anpassen können, dass er überall in unserer App gut wiederverwendet werden kann.

Überall dort, wo wir nun einen OK-Dialog brauchen, genügt jetzt eine einzige simple Code-Zeile:

OkDialog.show(this, "Das ist eine Testnachricht.");

Oder eben:

OkDialog.show(this, "Irgend ein beliebiger Text");

Abstrahieren durch Delegation

Man kann Code aber auch wiederverwenden, indem man die spezifischen Teile weglässt und am jeweiligen Aufrufer überlässt. Das gelingt mit so genannten Listenern oder Callbacks.

Anstatt einen OK-Dialog anzuzeigen, wollen wir zum Beispiel einen Dialog haben, der nach der Bestätigung des Nutzers eine Aktion ausführen soll. Ganz typisch sind hier zum Beispiel diese Bestätigungs-Dialoge, die man sieht, wenn man Elemente löschen möchte. Das kennt man, man klickt irgendwo auf Löschen, und es erscheint die Frage: „Bist du sicher, dass du das jetzt löschen möchtest?“. Entweder man klickt dann auf „Ja“ oder auf „Nein“. Wenn man auf „Ja“ klickt, wird eine Aktion ausgeführt, eben das Löschen.

Wenn wir einen solchen Bestätigungsdialog abstrahieren wollen, um ihn leicht wiederzuverwenden, müssen wir nicht nur die Nachricht/Frage als Parameter übergeben, sondern auch die spezifische Aktion die ausgeführt werden soll, wenn der Nutzer auf „Ja“ klickt. Das geht so:

Wir definieren einen Listener mit genau einer Methode, die aber nicht implementiert ist. Wir schreiben nur hin, wie die Methode heißt. In unserem Fall „onConfirmed“. Und die rufen wir auf, wenn der Nutzer auf „Ja“ klickt. Neben dem Context und der Message muss man nun auch den Listener übergeben. Der enthält dann die konkrete Implementierung der auszuführenden Aktion.

So wird der ConfirmDialog benutzt:

ConfirmDialog.show(this, "Möchtest du das wirklich löschen?", this::delete);

Der Ausdruck „this::delete“ benennt die Methode, die aufgerufen werden soll, wenn der Dialog bestätigt wird. In der delete-Methode würde dann also der Code stehen, der die eigentliche Aktion, das Löschen, ausführt.

Fazit

Überlege dir beim Programmieren, wie du deinen Code allgemeiner formulieren kannst und lagere ihn in eine eigene Klasse aus. Übergebe dann Parameter, um das Verhalten an die jeweilige spezifische Situation anzupassen.