Eine Membervariable aus eine Methode heraus an eine freie Funktion zu übergeben, ist kontrolliert.
Ich halte es im Gegenteil eher für ein Designproblem, wenn man private-Member und dazu jeweils einen public-Getter und Setter hat. Damit gibt nämlich das Interface der Klasse den internen Aufbau wieder, den man ja eigentlich kapseln wollte. Wenn dann noch die Settermethode nichts weiter tut, als den Member zuzuweisen, dann hätte man das sich auch sparen, und den Member public machen können.
Und was das Zwischenobjekt angeht, das du ansprichst: Wenn du nichts weiter tust, als hinterher die Änderungen am Zwischenobjekt ungeprüft in dein eigentliches Objekt zu übernehmen, hast du auch nichts gewonnen, sondern nur zwei unnötige Kopieroperationen hinzugefügt.
Leider sieht man diese Getter-"Lösung" sehr häufig. Ich vermute, das wird durch folgende Herangehensweise verursacht:
- Problem: Ich brauche in Funktion Foo den Member X von Klasse A.
- Member X ist private -> public Getter für X in A erzeugt.
- Nächstes Problem: Ich brauche in Foo ein A, sonst bekomme ich kein X.
Das führt dann zu dem häufigen Fehler, dass einfach in Foo ein neues A-Objekt erstellt wird, und dessen X geholt wird.
Womöglich ist das passende A-Objekt Member einer anderen Klasse, also wird noch ein public Getter in der enthaltenen Klasse erstellt. Und so weiter.
Wenn man statt dessen den benötigten Member einfach an Foo übergibt, statt ihn dort mühselig zu holen, ergibt das IMHO ein viel besseres Design, nicht zuletzt deswegen, weil es ohne zusätzliche Getter auskommt, die das Klasseninterface verschandeln und letztendlich das Interface von der Implementierung abhängig machen. Ein weitere Vorteil: Foo könnte theoretisch auch mit anderen X-Objekten arbeiten, die anderswo liegen. Foo ist nicht an X gebunden, und X auch nicht an seinen Member A.
Um es kurz zu machen: Ich finde den Ansatz von Alex747 viel besser, als die leider so verbreiteten Getter und Setter für jeden Member. Ich habe schon Entwickler gesehen, für die das Anlegen dieser Methoden fast schon ein Reflex geworden ist: wann immer sie einen private Member anlegen, kommen diese Methoden gleich dazu.
Daraus kann ich nur schließen, dass derjenige sich vorher nicht genügend Gedanken über das Interface der Klasse gemacht hat, denn das soll ja eigentlich den internen Aufbau abstrahieren, nicht wiedergeben.