Unterschied zwischen get und set (C++)
-
314159265358979 schrieb:
Nein, getter und setter als solches sind vollkommen okay. Nur sollte man ihnen bessere Namen geben als getX/setX.
Wie viel besser kann ein Name für nen Getter/Setter sein, als GetX/SetX?
Wobei, weil gerade Sockets angesprochen wurden: eine Funktion die etwas zurückgibt was erst berechnet oder von woanders nachgeladen werden muss, ist für mich kein Getter. D.h. die sollte dann auch nicht GetX heissen, wenn man GetX für Getter verwendet.
-
hustbaer schrieb:
Wie viel besser kann ein Name für nen Getter/Setter sein, als GetX/SetX?
.x() drückt das Zurückgeben einer Eigenschaft aus, das ist logischer. get drückt aus, dass was getan werden muss, um an den Wert ranzukommen, aber nicht was. In der Standardlib wirds ja auch so gehandhabt, als Beispiel sei .size() genannt. Bei dem Setter kommts eben drauf an, was er tun soll.
-
Ich muss sagen, dass ich das ähnlich sehe wie PI. Irgendetwas mit get* habe ich eigentlich nie, eine Memberfunktion beschreibt entweder einen Vorgang/eine Tätigkeit, oder eine Eigenschaft. Ich würde nicht so weit gehen zu sagen, dass ich niemals so ein simples set/get-System machen würde, aber meistens ist es zu Gunsten der Lesbarkeit vermeidbar.
-
314159265358979 schrieb:
Meiner Meinung nach sind getter und setter das letzte, was man braucht.
314159265358979 schrieb:
Nein, getter und setter als solches sind vollkommen okay. Nur sollte man ihnen bessere Namen geben als getX/setX.
Aha ...
-
314159265358979 schrieb:
hustbaer schrieb:
Wie viel besser kann ein Name für nen Getter/Setter sein, als GetX/SetX?
.x() drückt das Zurückgeben einer Eigenschaft aus, das ist logischer.
Wieso ist das logischer? In C++ gibt es keine "Eigenschaften", es gibt nur Funktionen. Memberfunktionen, freie Funktionen, aber keine Eigenschaften. Gäbe es die in C++ (wie es sie z.B. in C# gibt), hätte ich keine Einwände diese auch einfach "Position", "Size" etc. zu nennen. Ganz im Gegenteil: alles andere wäre plem.
get drückt aus, dass was getan werden muss, um an den Wert ranzukommen, aber nicht was.
Hä?
GetPosition() ist ein Imperativ. Das heisst soviel wie "gib mir die Position". Wenn das nicht logisch und einfach verständlich ist, weiss ich auch nicht.Und was wird bitte klarer, wenn ich statt GetPosition() nur Position() schreibe?
In der Standardlib wirds ja auch so gehandhabt, als Beispiel sei .size() genannt.
Völlig richtig. Nur dass die SCL etwas auf eine bestimmte Weise macht, heisst aber noch nicht, dass es schlau ist es selbst so zu machen. Die SCL hat vielerorts total unverständliche Abkürzungen, die man erstmal lernen muss, wenn man Code lesen oder schreiben will. Das ist OK für sowas grundlegendes wie die SCL, aber IMO nicht unbedingt wünschenswert für eigenen Code.
Ich hab' auf jeden Fall überhaupt keine Freude damit, wenn ich eine schwindelige Abkürzung wie "deque" in einem Programm finde, das ich lesen/verstehen/modifizieren muss. Oder "ios" oder was nicht noch alles.Ich sag nicht dass dein System grundsätzlich und immer schlecht ist. Ich behaupte nur, dass es damit schwerer ist
a) Bezeichnernamen konsequent zu wählen und
b) leicht verständlichen Code zu schreibenWenn ich eine Library programmiere, bei der ich davon ausgehe, dass sowieso keiner eine Chance hat besonders viel zu verstehen ohne sich eingearbeitet zu haben, und dass die Bezeichner der Library an irre vielen Stellen des User-Codes vorkommen, dann ist es vielleicht OK Klarheit/Einfachkeit zu Gunsten von Kürze zu opfern.
Sonst IMO eher nicht.
-
hustbaer schrieb:
314159265358979 schrieb:
hustbaer schrieb:
Wie viel besser kann ein Name für nen Getter/Setter sein, als GetX/SetX?
.x() drückt das Zurückgeben einer Eigenschaft aus, das ist logischer.
Wieso ist das logischer? In C++ gibt es keine "Eigenschaften", es gibt nur Funktionen. Memberfunktionen, freie Funktionen, aber keine Eigenschaften. Gäbe es die in C++ (wie es sie z.B. in C# gibt), hätte ich keine Einwände diese auch einfach "Position", "Size" etc. zu nennen. Ganz im Gegenteil: alles andere wäre plem.
Du weißt doch ganz genau, dass ich Member meine
hustbaer schrieb:
get drückt aus, dass was getan werden muss, um an den Wert ranzukommen, aber nicht was.
Hä?
GetPosition() ist ein Imperativ. Das heisst soviel wie "gib mir die Position". Wenn das nicht logisch und einfach verständlich ist, weiss ich auch nicht.Und was wird bitte klarer, wenn ich statt GetPosition() nur Position() schreibe?
Ich habs doch schon mal erklärt. Get ist nichtssagend. Ich will wissen, wo dieser Wert herkommt, das kann ich mit meinem System ausdrücken.
hustbaer schrieb:
Ich sag nicht dass dein System grundsätzlich und immer schlecht ist. Ich behaupte nur, dass es damit schwerer ist
a) Bezeichnernamen konsequent zu wählen und
b) leicht verständlichen Code zu schreibenInwiefern wird das schwerer?
-
314159265358979 schrieb:
hustbaer schrieb:
314159265358979 schrieb:
hustbaer schrieb:
Wie viel besser kann ein Name für nen Getter/Setter sein, als GetX/SetX?
.x() drückt das Zurückgeben einer Eigenschaft aus, das ist logischer.
Wieso ist das logischer? In C++ gibt es keine "Eigenschaften", es gibt nur Funktionen. Memberfunktionen, freie Funktionen, aber keine Eigenschaften. Gäbe es die in C++ (wie es sie z.B. in C# gibt), hätte ich keine Einwände diese auch einfach "Position", "Size" etc. zu nennen. Ganz im Gegenteil: alles andere wäre plem.
Du weißt doch ganz genau, dass ich Member meine
Hä?
Wir reden hier nicht über Funktionen die notwendigerweise immer als "return member;" implementiert werden können. std::vector::size(), ein ganz klassischer Getter, ist z.B. oft als "return a-b;" implementiert.
Also Member(variablen) spielen da schonmal nicht mit rein. Die sind sowieso meistens private. Welche es da gibt oder nicht gibt muss den Benutzer eine Klasse im Allgemeinen wenig kümmern.hustbaer schrieb:
get drückt aus, dass was getan werden muss, um an den Wert ranzukommen, aber nicht was.
Hä?
GetPosition() ist ein Imperativ. Das heisst soviel wie "gib mir die Position". Wenn das nicht logisch und einfach verständlich ist, weiss ich auch nicht.Und was wird bitte klarer, wenn ich statt GetPosition() nur Position() schreibe?
Ich habs doch schon mal erklärt.
Du hast gar nix erklärt. Du hast nur behauptet das eine sei logischer als das andere.
Erkläre es mir anhand des Beispiels "GetSize" vs. "Size". Wieso ist "Size" logischer als "GetSize"? Bin gespannt.Get ist nichtssagend.
Nö, ist es nicht. Es macht klar, dass das was folgt, ein Substantiv ist, und kein Verb. Gerade im Englischen können viele Wörter nämlich beides sein. CString::Empty() (MFC) z.B. macht ganz was anderes als std::string::empty().
Ich will wissen, wo dieser Wert herkommt, das kann ich mit meinem System ausdrücken.
Wo der Wert herkommt ist egal, und das kannst du mit deinem System auch nicht ausdrücken. Und solltest du auch nicht. Wichtig ist was es für ein Wert ist, und dass es sich um einen Wert, und nicht um einen Vorgang handelt.hustbaer schrieb:
Ich sag nicht dass dein System grundsätzlich und immer schlecht ist. Ich behaupte nur, dass es damit schwerer ist
a) Bezeichnernamen konsequent zu wählen und
b) leicht verständlichen Code zu schreibenInwiefern wird das schwerer?
Siehe oben: "GetXxx", "SetXxx", "IsXxx" etc. machen klar, wie Xxx zu verstehen ist. Lässt man es weg, muss man oft raten, nachlesen, den Kontext mit einbeziehen etc.
-
Du willst mich absichtlich missverstehen. Keine Lust auf so ne Diskussion.
-
314159265358979 schrieb:
Bei Settern sieht es ähnlich aus. Eine Methode .move_to() (wie oben erwähnt) drückt eine Tätigkeit aus.
Stimme soweit zu.
.set_position() ist eher nichtssagend.
Äh. Nein
Auch bleiben hier Fragen offen. Wann bemerke ich die Positionsänderung? Wird das Fenster direkt geupdatet, oder erst bei im nächsten Rendervorgang?
Richtig. Genau die selben Fragen, die auch bei "move_to" offen bleiben.
Oder, um es zusammenzufassen: get/set drückt mir zu wenig aus. Da setze oder krieg ich einen Wert. Was dann aber konkret passiert, bleibt mir verborgen.
Und inwiefern ist das bei "move_to" besser? Antwort: gar nicht.
Wenn du das Gegenteil behauptest, kann ich nur damit kontern dass ich aus Erfahrung weiss, dass man aus "move to" auch nicht mehr rauslesen kann als aus "set position". Weil die eine Library das so sieht, die nächste anders, und die übernächste nochmal anders.
Das glaubst du mir jetzt natürlich nicht. Kann ich aber auch nicht ändern.
-
314159265358979 schrieb:
Du willst mich absichtlich missverstehen. Keine Lust auf so ne Diskussion.
Ne, eigentlich nicht.
Ich sehe aber auch keinen Grund, das hier weiter ernst zu nehmen, wenn du auf keins meiner Argumente und keine meiner Fragen eingehst.Blargh.