Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

1

26.06.2012, 16:14

Getter/Setter gut oder schlecht?

EDIT by dot: Abgetrennt von hier

Zitat

Außen mittels Getter- und Setter-Methoden erreichbar sein

Was ist an öffentlichen Variablen so schlecht?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (26.06.2012, 18:16)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

26.06.2012, 16:15

Zitat

Außen mittels Getter- und Setter-Methoden erreichbar sein

Was ist an öffentlichen Variablen so schlecht?

Die Frage ist eher: Was ist an Getter- und Setter-Methoden besser? ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (26.06.2012, 16:46)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

26.06.2012, 16:43

Zitat

Außen mittels Getter- und Setter-Methoden erreichbar sein

Was ist an öffentlichen Variablen so schlecht?

man kann keine Wertprüfung vornehmen (in dem Fall wären bei den Koordinaten negative Werte vollkommen falsch) und man kann nicht auf Wertänderungen reagieren
dadurch kann man inkonsistente Zustände eines Objekts ggf. nicht verhindern (beispielsweise wenn eine Veränderung von außen gar nicht vorgesehen ist)

Getter können auch nur der Abstraktion dienen, indem sie nicht direkt das liefern, was gespeichert wird, sondern dies in einer formatierten oder umgewandelten Form liefern

weiterhin ist es ein durchaus uneinheitliches Bild, wenn es für ein paar Eigenschaften Getter und Setter gibt und für andere wieder öffentliche Membervariablen
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

4

26.06.2012, 17:31

Sacaldur hat es schon ganz gut gesagt, Setter und Getter bieten dir einen gewissen Grad an flexibilität. Ein Setter ist häufig nicht nur ein einfaches "Speicher mal das", sondern wandelt das in irgendeiner form um, oder macht noch etwas ganz anderes nebenbei, was der Benutzer aber nicht unbedingt wissen muss. Das wichtigste, warum man Member IMMER privat machen sollte, ist der gekapselte Zugriff. Es gibt ncihts schlimmeres, als wenn irgendwo in deinem Programm, irgendein Teilstück dir irgendwas ändert, und du das nicht nachvollziehen kannst. Allein dafür bieten dir Setter und Getter einen enormen Vorteil. Du kannst deine Breakes direkt in die Funktion setzen, und damit jede Veränderung mitverfolgen, wobei ohne S/G das Suchen im Code los geht. Hat mir schon mehr als einmal geholfen einen kleinen aber nervigen Fehler zu finden. Und S/G verbrauchen auch keine Performance, oder unnützen Sprünge im Code, was oftmals das Todschlag Argument dagegen ist. Deklariere sie als "inline" und sie sind genauso schnell. Klassen wurden nicht umsonst so konstruiert, das man die Möglichkeit hat, alles was man möchte und was den User nicht interessiert, zu verstecken, und nur das nach außen schimmern zu lassen, was wirklich gebraucht wird.



Was mir jetzt aber noch in deinem Code auffällt, du nutzt für JEDES Tile ein eigenes Sprite. Ich frage mich warum? Gib der Map als Ganzes EIN Sprite, wird denke ich auch schon was bringen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

26.06.2012, 17:40

Getter und Setter bieten gegenüber öffentlichen Membern keine wesentliche Verbesserung, da sie rein semantisch immer noch Implementierungsdetails nach außen propagieren. Auch wenn durch Getter und Setter viellieicht eine zusätzliche Membran da ist, die Verhindert, dass interner Zustand direkt veränder wird, lösen diese nicht das eigentliche Designproblem. Stattdessen besser so designen, dass man keine Getter und Setter braucht...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (26.06.2012, 17:50)


6

26.06.2012, 17:49

Besser einfach so designen, dass man keine Getter und Setter braucht...
das musst du mir genauer erklären...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

26.06.2012, 17:50

Gib mir ein Beispiel, wo du meinst, Getter und Setter zu brauchen ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

26.06.2012, 21:31

C-/C++-Quelltext

1
2
3
4
5
6
class MMO_player {
int money;

public:
 void change_money(int money_difference) { atomic_add(&money,money_difference); }
};

Ist aber einer der wenigen Fälle, die mir spontan einfallen würden. Da finde ich ja die property Semantik einiger Sprachen echt interessant. Persönlich scheue ich mich nicht auf öffentliche Variablen zurück zu greifen, denn ich will voran kommen und nicht meinen Code mit 2 zusätzlichen Zeilen erweitern die eigentlich nichts machen (IMHO).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

26.06.2012, 21:41

Ok, da kann man drüber streiten, aber wenn du mich fragst, ist das schon eher einfach nur eine normale Methode als ein Setter...

Wobei man zugegeben wohl ein sinnvolleres Beispiel mit konkretem Kontext braucht, um sinnvoll diskutieren zu können...

  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

26.06.2012, 21:46

Properties sind wirklich ein wahrer Segen. :)
Ich finde es sehr schade das es sowas nicht in C++ gibt.
Wobei, könnte man mit Operatorüberladung nicht eine änliche Funktionalität herstellen?


Ein Beispiel aus C# wo es nötig ist: (Die Klasse schmeißt ein Event, wenn sich der Zustand ändert. Habe ich in meinen Gui-Systemen verwendet.)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  public class StateChangeEvent<T> where T : IEquatable<T>
    {
        [...]
        public event StateChangeHandler<T> Event;
        protected T StateInner;
        public virtual T State
        {
            get { return this.StateInner; }
            set
            {
                if (!((IEquatable<T>)value).Equals(this.StateInner))
                {
                    T OldState = this.StateInner;
                    this.StateInner = value;
                    if (this.Event != null)
                        this.Event.Invoke(this.Parent, new StateChangeEventArgs<T>(OldState, value));
                }
            }
        }
        [...]
    }


Ich verwende wenn es möglich ist immer Variablenzugriffe. Weshalb auch nicht?
Zumindest in C# mit den erwähnten Properties deren Aufrufsyntax mit dem einer Variable übereinstimmt, sehe ich keinen Gund nur Properties nach außen zu verwenden.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (26.06.2012, 22:12)


Werbeanzeige