VOID ist böse?

Für alle die mit diesem Begriff (noch) nichts anfangen können. VOID bedeutet so viel wie „Leere“ oder „Nichts“. Es kommt häufig als Rückgabewert in Funktionen oder Methoden vor und ist meines Erachtens nur in den seltensten Fällen sinnvoll.

Hier mal ein neutrales (d.h. sprachunabhängiges) abstraktes Beispiel:
baueEinHaus(haus);
bestelleUmzugswagenZu(haus);
zieheEinIn(haus);
So weit so gut, aber was ist nun wenn das Haus noch nicht gebaut wurde, weil die Baustoffe gerade nicht lieferbar sind? Oder was ist wenn der
Umzugswagen eine Panne hat? Dann kann man ja unmöglich einziehen – Oder? Die verwendeten Funktionen sagen uns ja nicht ob alles geklappt hat, müssen wir einfach mal den Gegebenheiten vertrauen und das Beste hoffen. Allerdings ist dieses in unserer Gesellschaft schon nicht immer besonders gut. Bei der Programmierung kann es aber extrem „ungemütlich“ werden, da es zu undefinierten Zuständen kommen kann. Denn niemand weiß wie nun der aktuelle Stand des Hauses ist? Die einzelnen Funktionen geben uns ja nichts zurück? Also nur VOID.

Besser wäre es wenn wir immer genau wüssten was los ist. Jeder Schritt könnte uns doch mitteilen ob alles geklappt hat. Es würde ja schon ein „ja“ oder „nein“ reichen. Selbstverständlich kann jede Funktion (egal in welcher Sprache) auch Daten zurück liefern. Also passen wir unser Beispiel entsprechend an:
wenn(baueEinHaus(haus) = ja) dann...
wenn(bestelleUmzugswagenZu(haus) = ja) dann...
wenn(zieheEinIn(haus) = ja) dann...
trinkeBierIn(haus)
Prima! Jetzt wissen wir genau was passiert ist oder was nicht. Und für alle aufmerksamen Leser gibt’s auch noch ein Bier wenn alles geklappt hat.
Dieses Beispiel erinnert mich am ehesten an „Logo“ eine Programmiersprache für Kinder. Im realen Programmiererleben würde es sich wahrscheinlich um ein Konstrukt aus verschachtelten „if“ (wenn) Abfragen handeln.

Ich will damit nur verdeutlichen wie wichtig es ist immer genau definierte Zustände zu erreichen. Nichts ist schlimmer in der Programmierung als „Prinzip Hoffnung“.
Nach dem Motte „Es wird schon gut gehen“. Dieses Verhalten habe ich oft und immer wieder bei JAVA kennengelernt und ärgert mich nach wie vor. In meinem Berufsalltag lernte ich auch immer mal Programmierer kennen, welche zu mir meinten das sie sich ja nicht um alles kümmern könnten?

DOCH! Nur so entsteht robuster Code!

​Anmerkung: Ja ich weiß es gibt auch „Exceptions“, aber das ist auch nicht immer die Lösung und meines Erachtens kein guter Stil.

Objekte oder Funktionen?

Wo liegt den der Unterschied? Ganz einfach eine Funktion ist eine Zusammenfassung von Befehlen um eine Aufgabe zu lösen. Meisten übergibt man Funktionen Parameter und erwartet ein entsprechendes Ergebnis. Schon mal nicht schlecht. Jedoch wird es bei komplexeren Aufgabenstellungen recht
schnell Unübersichtlich. Eine andere Lösung muss her.
 
Hier kommen sogenannte Objekte zum Einsatz. Objekte sind intelligente Elemente einer objektorientierten Sprache wie z.B. PHP 5.x, C++ oder Objective-C. Objekte besitzen auch Funktionen, nur das man diese hier Methoden nennt. Objekte bringen eine methodenübergreifende Eigenintelligenz mit.
 
Vielleicht sollte ich es versuchen an einem Beispiel zu erklären. Als erstes mal ein Versuch mit Funktionen.
ergebnis1 = addiere(1,2,3) ergibt 6
ergebnis2 = addiere(1,2,4) ergibt 7
ergebnis3 = addiere(1,2,5) ergibt 8
 Wir addieren also immer 1,2 und eine weitere Zahl. Ich finde man könnte dieses übersichtlicher mit Objekten machen – Oder? Also dann mal so:
objekt = neuesObjekt(1,2);
ergebnis1 = objekt->addiere(3) ergibt 6
ergebnis2 = objekt->addiere(4) ergibt 7
ergebnis3 = objekt->addiere(5) ergibt 8
Wir teilen unserem Objekt also einmalig die Werte 1 und 2 mit, um danach nur noch die Ergebnisse durch Angabe der dritten Zahl zu ermitteln. Ich finde es ist einfacher so?
 
Vielleicht ist dieses Beispiel nicht optimal, deshalb mal ein komplexeres. Diesmal aber nur als Objekt welches eine Email versenden soll.
email = neueEMail(absender@domain.de, Betrefftext)
email->empfaengerHinzufuegen(empfaenger@domain.de)
email->empfaengerHinzufuegen(empfaenger@nsa.gov)
email->setzteText(Hier steht der Text)
email->versenden
Im inneren dieses Objektes ist bestimmt so einiges abzuhandeln, aber nach außen ist es sehr einfach und vor allem übersichtlich eine Email zu versenden. Problemstellungen können so auch prima von verschiedenen Personen gelöst werden. Nur die Namen der Methoden (oder auch Schnittstellen) müssen vorher vereinbart werden.
 
In PHP heißen diese Objekte allerdings Klassen – machen aber sonst dass gleiche. Sicherlich kann man nicht für jeden „Pups“ eine Klasse basteln, aber eine tolle Erfindung ist es allemal –Oder?

Übersichtlicher Code

Oft stehe ich vor dem Problem in fremdem oder uraltem eigenem Programmcode
wühlen zu müssen. Dieser ist oft unübersichtlich und wird von Bedingungen erschlagen.
Immer wieder treffe ich folgende beispielhafte Konstrukte.
 
wenn(name == '') {
    ausgabe("Bitte Namen eingeben");
} sonstwenn(name == 'paul') {
    ausgabe("Hallo Paul");
} sonstwenn(name == 'fritz') {
    ausgabe("Hallo Fritz");
} sonstwenn{
    ausgabe("Dich kenn ich nicht !");
}

Ich persönlich finde es recht unübersichtlich. Gerade wenn es sich um viele verschiedene Bedingungen handelt.
Schöner wäre doch so etwas:
 
do {

    wenn(name == '')      { ausgabe("Bitte Namen eingeben");  continue; }
    wenn(name == 'paul')  { ausgabe("Hallo Paul");            continue; }    
    wenn(name == 'fritz') { ausgabe("Hallo Fritz");           continue; }
   
    ausgabe("Dich kenn ich nicht !");

} while(false);

Ich nutze also eine "do-while" Schleife um nach der ersten erfüllten Bedingung ans Ende zu springen.
Sollte keine Bedingung treffen, erscheint auch hier der entsprechnde Text.