Out paramater. Vorne oder hinten?



  • Abend,

    wenn ich eine Funktion mit einem output Paramater habe, definiert ihr den ganz vorne oder ganz hinten in der Parameterliste? Am besten mit Begründung:)

    bool convertStuff(Stuff& stuff, const Input& input); // Out param vorne?
    bool convertStuff(const Input& input, Stuff& stuff);  // Oder hinten?
    


  • Falls es ein Subjekt gibt im Sinne von

    Deutschunterricht schrieb:

    Subjekt Prädikat Objekt Objekt Objekt...

    will meinen

    Volkard schrieb:

    Täter Prädikat Opfer/Werkzeug Opfer/Werkzeug Opfer/Werkzeug ...

    dann immer das Subjekt zuerst.

    Ist der output-Parameter der Täter und saugt sich die Daten oder ist ein anderer Parameter der Täter und drückt dem output-Parameter die Daten rein?

    Klappt meistens. Ist so eine Lisp-Angewohnheit aus den späten 60-er Jahren und wie ich finde einfach gut.

    OO wäre der Täter halt *this.

    Kann man keinen Täter ausmachen, wird's willkürlich. Schon immer und noch.



  • Ich hab' beides schon gesehen. Und imho ist es auch beides gleich gut verwendbar, solange du es vernünftig dokumentierst.


  • Mod

    Ich mache es meistens Input->Output, weil ich die Reihenfolge logischer finde: Vorne rein, hinten raus :p . Aber das eigentlich nur in Code den niemals jemand zu sehen bekommt. Denn ich sollte es umgekehrt machen, weil das dann konsistent zur Standardbibliothek wäre.

    Ich muss jedoch sagen, dass außer der Standardbibliothek die meisten anderen Bibliotheken denen ich begegnet bin es so wie ich privat mit der Reihenfolge Input->Output halten.



  • Ich frage vor allem wegen Default parametern. Wenn es die nicht gäbe, würde ich ohne zu überlegen auch den Output Paramter hinten anhängen, da das mMn einfach natürlicher ist.

    Aber es kann ja Methoden a la

    bool foo(Output& o, Input1 i1, Input2 i2 = 33);
    

    geben und da MUSS dann Output nach vorne.
    Drum dachte ich mir, dass ich generell den Out param nach vorne nehme, damit es immer gleich ist. Sonst hab ich bei Methoden ohne Default Params den Out Param ganz hinten und bei Methoden MIT Default Params den Out Param vorne:/



  • SeppJ schrieb:

    Ich mache es meistens Input->Output, weil ich die Reihenfolge logischer finde: Vorne rein, hinten raus :p . Aber das eigentlich nur in Code den niemals jemand zu sehen bekommt. Denn ich sollte es umgekehrt machen, weil das dann konsistent zur Standardbibliothek wäre.

    Ich muss jedoch sagen, dass außer der Standardbibliothek die meisten anderen Bibliotheken denen ich begegnet bin es so wie ich privat mit der Reihenfolge Input->Output halten.

    Das Übel ist

    char * strcpy ( char * destination, const char * source );
    

    Und ab da sind Probleme da.
    Im Deutschen auch. Wo gleichgesetzt oder kopiert wird, hat man quasi zwei Subjekte.
    "volkard ist papa"
    oder
    "papa ist volkard"
    Zwei dumme Subjekte. Das gibt die offizielle Grammatik gar nicht her. Da wird getrickst. Ich habe bestimmt schon 5 Auswege gesehen. Das lustigste war glaube ich ein nominatisiertes Akkusativobjekt.

    In C++ würde man sowas statt zu einer Methode zu einer globalen Funktion machen. Aber die Reihenfolge bleibt fraglich. Es sind ja beide gut.

    Bei Zuweisungen mach ich gerne wie SeppJ als src->dst. Aber dann ist es gerade andersrum als a=5. Schade.


  • Mod

    Auch wenn man zwei Subjekte hat, so ist beim Kopieren doch trotzdem eines ganz eindeutig die Quelle und ein anderes das Ziel. Oder verstehe ich gerade nicht, worauf du hinaus willst?



  • SeppJ schrieb:

    Auch wenn man zwei Subjekte hat, so ist beim Kopieren doch trotzdem eines ganz eindeutig die Quelle und ein anderes das Ziel. Oder verstehe ich gerade nicht, worauf du hinaus willst?

    Allgemein ist das Subjekt (this/self/me) der Täter und das Objekt das Opfer.

    Nur beim Kopieren greift das nicht. Da nehmen wir eine Sonderregel. Zum Beispiel wählen wir (willkürlich!) die Quelle als Subjekt (this/self/me).

    Es geht mir um die philosophische Betrachtung und Erwähnung der Willkürlichkeit dieser Wahl.



  • Beim "natürlichen" Kopieren (d.h. Kopier-Konstruktion oder Zuweisung) steht auch das Ziel an erster Stelle bzw. in this. Von daher würde ich bei einer eigenen Kopier/Konvertierungsfunktion genauso vorgehen.



  • CStoll schrieb:

    Beim "natürlichen" Kopieren (d.h. Kopier-Konstruktion oder Zuweisung) steht auch das Ziel an erster Stelle bzw. in this. Von daher würde ich bei einer eigenen Kopier/Konvertierungsfunktion genauso vorgehen.

    cin.get(ch);
    cout.put(ch);
    

    Hier ist jeweils der "schlaue" stream links.
    Aber

    size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
    size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
    


  • asm mov ist je nach syntax auch sorum oder andersrum und beide sind nicht dumm.


Log in to reply