Ich habe eine Klasse mit einem Member vom Typ std::vector
. An einigen Stellen brauche ich die Größe dieses Vektors in einer anderen Klasse. Da das Mitglied privat ist, habe ich einen Getter erstellt, um es zurückzugeben. Bei der Überprüfung des Codes kam mir eine Frage in den Sinn: Ist es besser, den Getter aufzurufen, dann ist es size()
oder ist es gut, stattdessen einen "Size Getter" zu erstellen?
Hier ist meine Klasse:
%Vor%In einem anderen Teil des Codes tue ich:
%Vor%Ist es eine gute Übung, dies zu tun, oder werde ich stattdessen den "Size Getter" erstellen und aufrufen?
Ich brauche sowohl den Vektor (in anderen Teilen des Codes nenne ich den Getter) und seine Größe; Es hat also keinen Sinn, nur einen der Getter zu behalten.
Eine weitere Tatsache ist, dass ich C ++ 11 benutze, so dass es nicht nötig ist, eine const-Referenz zurückzugeben.
Basiert auf C ++ 11: Ist es so schlau, den Vektor nicht zurückzugeben, sondern seine Größe, wenn ich myClsObj.getMyVec().size()
anrufe?
Sie können sich auf das Tell-Do not-Ask -Prinzip beziehen. Es mag hier etwas verwirrend sein, da beide Versionen technisch nach etwas "fragen". Es geht jedoch nicht darum, Getter zu verwenden, um Implementierungsdetails einer Klasse abzurufen und dann einige Operationen auszuführen, sondern um der Klasse zu sagen, dass sie die erforderliche Arbeit ausführt, in diesem Fall die Größe abruft .
Dies bezieht sich auch auf das Gesetz von Demeter . Der Ansatz mit der Rückkehr des gesamten Vektors wird in diesem Link in einer großartigen Weise mit der folgenden Geschichte visualisiert:
[...] "Das sind $ 1,95." An diesem Punkt zog ich natürlich meine Hose aus und der Typ fing an, mich wegen der Polizei und der unanständigen Entblößung zu beschimpfen. Verwirrt sagte ich: "Schau, ich versuche nur dich zu bezahlen - Ich gebe dir meine Hose und du gehst in meinen Taschen herum, bis du meine Brieftasche findest, die du herausholst und nach Geld suchst .
Die "Size Getter" -Methode bezieht sich auf eine natürlichere Art und Weise, Ihre Brieftasche selbst aus der Hose zu holen und zu bezahlen: -)
Es kommt auch direkt von einem der grundlegendsten Konzepte in OOP - Encapsulation . Kurz gesagt, es geht darum, ( kapseln ) so viele Details der Klassenimplementierung von der Außenwelt zu verbergen. Weniger Kopplung gibt Ihnen mehr Flexibilität in der Zukunft. Mach dir keine Sorgen, wenn das zu abstrakt oder verschwommen klingt. Jeder Programmierer (d. H. Fast jeder Programmierer, den ich getroffen habe, einschließlich mir) kam irgendwann zu einem Punkt, an dem jede vermeintlich einfache Änderung von einer Lawine von Fixes in entfernten Teilen des Codes gefolgt werden musste. Wenn du die Rache der Kopplung unter deinen Fingern fällst, erinnerst du dich an diese Regel und erinnerst dich für immer daran;)
Und schließlich erstellen Sie normalerweise keine Klassen, die einen eingepackten Vektor oder etwas Ähnliches darstellen. vector ist nur eine technische Eigenschaft. Normalerweise stellt eine solche Klasse eine Sammlung bestimmter Elemente dar, die auf der Ebene Ihrer Domain -Logik benannt sind. Meistens ist es nicht .getTheSizeOfMyInnerVector
, sondern .getRecordCount
oder .getNumberOfStudents
usw. Clients dieser Klassen müssen nicht einmal wissen, dass% std::vector
drin ist. Es spielt keine Rolle, solange die Klasse ihre Aufgabe zur Pflege einer Sammlung von etwas erledigt. Die oben genannte Flexibilität kann beispielsweise bedeuten, dass Sie in diesem Fall zu einem anderen Container wechseln können, ohne sich um die Clients Ihrer Klasse kümmern zu müssen. Und ohne durch tausende von Stellen zu blättern, wo diese Klasse in Ihrem Code verwendet wird.
Machen Sie einen "Size Getter" und geben Sie den Wert von m_myVec.size()
zurück, es sei denn, Sie benötigen tatsächlich vollständigen Zugriff auf den Vektor. Der Größen-Getter würde weniger Code für die Außenwelt freigeben. Wenn Sie nur eine Methode zur Verfügung stellen, um den Vektor zu erhalten, ist es im Grunde überhaupt nicht privat.
Nun, zuallererst, wie Kommentatoren darauf hingewiesen haben, wenn Sie einen Getter für den Vektor verwenden, sollten Sie dafür sorgen, dass anstelle einer Kopie eine Konstante zurückgegeben wird.
Um Ihre Frage zu beantworten: Es hängt davon ab, welche Ebene der Datenkapselung Sie wollen. Wenn der Vektor selbst ein Implementierungsdetail der Klasse ist und Sie nicht möchten, dass Benutzer der Klasse ihren Inhalt ändern können (oder nur durch genau definierte Operationen im Klassenvertrag), sollten Sie keinen Getter für (a Bezug auf) den Vektor.