Wie auf eingebettestes Objekt zugreifen?



  • Hallo Leute,

    Ich habe eine Klasse, in dem ich Objekte eingebettet habe. Wie sollte man am besten darauf zugreifen? Sollte ich die Objekte public machen oder doch lieber extra Schnittstellen definieren?

    Hier mal ein Beispiel:

    class MyClassA
    {
    
    public:
    	MyClassA();
    	~MyClassA();
    
    	MyClassB m_object1;
    	MyClassB m_object2;
    };
    

    Zugriff:

    MyClassA meinObjekt;
    meinObjekt.m_objekt1.machEtwas();
    

    Eigentlich mag ich es nicht Membervariablen public zu machen. Allerdings w├Ąre es wahrscheinlich genauso unsinnig alle Schnittstellen der eingebetteten Objekte in der MyClassA "durchzuschleifen". ­čśĽ
    Wie geht ihr bei sowas vor?

    viele Gr├╝├če,
    SBond



  • die Frage ist: Warum muss das Objekt eingebettet sein

    oft wird OOP als "Methoden-mit-m├Âglichst-wenig-Parametern" missverstanden

    1. wieso muss MyClassA ├╝berhaupt m_object1 verwalten?
    2. warum muss man dann trotzdem von au├čen drauf zugreifen?

    irgendwas ist an dem Design unsch├Ân



  • Gast3 schrieb:

    die Frage ist: Warum muss das Objekt eingebettet sein

    oft wird OOP als "Methoden-mit-m├Âglichst-wenig-Parametern" missverstanden

    1. wieso muss MyClassA ├╝berhaupt m_object1 verwalten?
    2. warum muss man dann trotzdem von au├čen drauf zugreifen?

    Die Objekte sind einfache Container f├╝r Daten die quasi nur getter und setter beinhalten. In meinem Fall beinhalten diese verschiedene Information zu einem Netzwerkteilnehmer. Ein Objekt w├Ąre z.B. f├╝r den Client und der andere f├╝r den Server. Soweit zumindest der Anwendungsfall.

    Aber wie w├╝rde ein besseres Design aussehen?
    Die Objekte private machen und einen Pointer zur├╝ckgeben w├Ąre wahrscheinlich die schlechteste Wahl. Vererbung w├╝rde hier wohl auch nicht greifen, da ich den Datensatz 2 mal brauche. Ich k├Ânnte auch eine Schnittstelle in MyClassA definieren wie: 'setObjekt1(MyClassB const &object)', dass dann die Inhalte pr├╝ft und kopiert. ...das w├Ąre jetzt f├╝r mich wohl die sinnvollste Variante.

    ...oder es gibt noch etwas besseres, was ich nicht kenne



  • Vielleicht sollte der Besitzer von meinObjekt (MyClassA) m_object1 und 2 direkt besitzen/benutzen.

    // Edit

    Ist nat├╝rlich auch ein wenig schwierig, ohne das konkrete Problem zu kennen.



  • sorry, dass ich dieses Thema noch mal anspreche, aber irgendwie bin ich noch nicht sicherer geworden.

    An der Frage hat sich so gesehen nichts ver├Ąndert. Ich verwende bei mir in einigen Klassen eingebettete Objekte. Diese Objekte sind meist einfache Datencontainer.

    Nochmal ein Beispiel:

    class Client
    {
    public:
    	Client();
    	~Client();
    
    	Package getReceivedPackage() const;
    	void setReceivedPackage(Package const &package);
    
    	Package m_transmittedData;
    
    private:
    	Package m_receivedData;	
    };
    
    void main()
    {
        Client clientSession;
    
    	// Variante 1: Zugriff auf m_receivedData (Wert lesen und schreiben):
    	Package rData = clientSession.getReceivedPackage()
    	int rWert = rData.getIrgeneinWert();
    	rData.setIrgeneinWert(123);
    	clientSession.setReceivedPackage(rData);
    
    	// Variante 2: Zugriff auf m_transmittedData (Wert lesen und schreiben):
    	int tWert = clientSession.m_transmittedData.getIrgeneinWert();
    	clientSession.m_transmittedData.setIrgeneinWert(123);
    }
    

    Hier habe ich 2 Varianten um auf die eingebetteten Objekte zuzugreifen: Einmal das Objekt extrahieren und einmal der Direktzugriff.

    Variante 1 kommt mir zu umst├Ąndlich vor. Au├čerdem w├╝rde ich bei den gettern und settern jedes mal unn├Âtig viele Daten kopieren. Es sei denn, man macht es irgenswie mit Referenzen. Ich Wei├č aber nicht ob das so gut ist. Variante 2 geht leichter von der Hand und da das eingebettete Objekt ├Âffentliche Schnittstellen liefert, werden auch ung├╝ltige Werte abgefangen. Aber eventuell ist es ein schlechter Programmiestil es so zu l├Âsen.

    Welche Variante bevorzugt ihr? Oder macht ihr es ganz anders? Ist es schlecht Objekte in Klassen einzubetten? ­čśĽ

    viele Gr├╝├če,
    SBond



  • getter/setter f├╝r alles sind schlechter Programmierstil (der sich so mit JavaBeans etabliert hat)



  • also ist in diesem Falle der Direktzugriff durchaus sinnvoll? ­čÖé



  • an und f├╝r sich solltest du in client getter und setter haben, die dir die entsprechenden daten liefern und dazu auf die getter und setter der packages zugreifen, sprich von au├čen solltest du gar keinen zugriff auf innere objekte haben.

    also z.b.

    class Intern
    {
    int data;
    
    public:
    int GetData()
    {
    return data;
    }
    }
    
    class Extern
    {
    Intern intern;
    
    public:
    
    int GetInternData()
    {
    return intern.GetData();
    }
    }
    

    ansonsten ist diese ganze kapselung ziemlich nutzlos.



  • manni66 schrieb:

    getter/setter f├╝r alles sind schlechter Programmierstil (der sich so mit JavaBeans etabliert hat)

    Hmm, aber man hat doch ├Âfter, gerade im Webbereich, Daten die logisch zusammen geh├Âren aber auch nicht mehr sind als eben Daten.
    So typische DTOs halt, oder sowas wie ein UserModel etc.

    Kann ja nicht alles immer eine Logik haben, vor allem im Webberreich ist halt vieles eher Datenaustausch.



  • HansKlaus schrieb:

    an und f├╝r sich solltest du in client getter und setter haben, die dir die entsprechenden daten liefern und dazu auf die getter und setter der packages zugreifen, sprich von au├čen solltest du gar keinen zugriff auf innere objekte haben.

    also z.b.

    class Intern
    {
    int data;
    
    public:
    int GetData()
    {
    return data;
    }
    }
    
    class Extern
    {
    Intern intern;
    
    public:
    
    int GetInternData()
    {
    return intern.GetData();
    }
    }
    

    ansonsten ist diese ganze kapselung ziemlich nutzlos.

    Das ist genau so ein Punkt, der mir auch Kopfzerbrechen bereitet. Das 'durchreichen' von Variablen/Methoden. Ich wei├č nicht ob das so praktikabel ist, da ich sowas schon hinter mir habe. Wenn ich eine ├änderung der Schnittstellen in der Klasse 'Intern' durchf├╝hre, dann m├╝sste ich sehr viele Anpassungen vornehmen. Zudem k├Ânnte die Klasse 'Extern' zu un├╝bersichtlich werden, wenn es zu viele setter/getter sind. Insbesondere, wenn mehrere Objekte eingebettet sind oder -noch extremer- Objekt in Objekt in Klasse (also 3 Ebenen).

    So sehr komplexe Objekte hatte ich noch nicht unbedingt gehabt, aber wenn es mal dazu kommt, ist es schon gut zu wissen wie man die Daten verwaltet. Einige von euch haben bestimmt auch schon einige Erfahrungen mit sowas, oder? Wie geht ihr denn sowas grunds├Ątzlich an?



  • also wenn du es objektorientiert machen willst, wirst du um das durchreichen nicht herumkommen. ist ja nicht so, dass es nicht anders gehen w├╝rde, hat dann aber, zumindest laut irgendwelcher bef├╝rworter der oop, eine h├Âhere fehleranf├Ąlligkeit zur folge.



  • Hmmmm schrieb:

    manni66 schrieb:

    getter/setter f├╝r alles sind schlechter Programmierstil (der sich so mit JavaBeans etabliert hat)

    Hmm, aber man hat doch ├Âfter, gerade im Webbereich, Daten die logisch zusammen geh├Âren aber auch nicht mehr sind als eben Daten.
    So typische DTOs halt, oder sowas wie ein UserModel etc.

    Kann ja nicht alles immer eine Logik haben, vor allem im Webberreich ist halt vieles eher Datenaustausch.

    Ja, und?



  • manni66 schrieb:

    Hmmmm schrieb:

    manni66 schrieb:

    getter/setter f├╝r alles sind schlechter Programmierstil (der sich so mit JavaBeans etabliert hat)

    Hmm, aber man hat doch ├Âfter, gerade im Webbereich, Daten die logisch zusammen geh├Âren aber auch nicht mehr sind als eben Daten.
    So typische DTOs halt, oder sowas wie ein UserModel etc.

    Kann ja nicht alles immer eine Logik haben, vor allem im Webberreich ist halt vieles eher Datenaustausch.

    Ja, und?

    Und da sind nun mal Beans ├╝brig und es ist sinnvoll, wenn alles getter und setter hat, oder nicht?



  • Oder war der Punkt, dass dann gleich alles Public sein soll?



  • Hmmmm schrieb:

    Oder war der Punkt, dass dann gleich alles Public sein soll?

    Ja



  • Gibt es eigentlich B├╝cher zu guten Programmdesign oder ist das alles jahrelange Praxiserfahrrung?

    Bzw. wie lernt man am besten gutes Programmdesign ohne zwei Jahrzehnte zu programmieren? Man k├Ânnte dazu vielleicht man einen Thread in Die Artikel erstellen.



  • ja das w├╝rde mich auch sehr interessieren ­čśâ

    (seit wann gibt es das denn: :schland: lol ­čśâ )



  • win8789 schrieb:

    Gibt es eigentlich B├╝cher zu guten Programmdesign oder ist das alles jahrelange Praxiserfahrrung?

    Bzw. wie lernt man am besten gutes Programmdesign ohne zwei Jahrzehnte zu programmieren?

    Wie lernt man perfekt Gitarre spielen, ohne zwei Jahrzehnte Gitarre zu spielen?



  • manni66 schrieb:

    Wie lernt man perfekt Gitarre spielen, ohne zwei Jahrzehnte Gitarre zu spielen?

    Auch wer lange Gitarre spielt, muss es nicht unbedingt gut k├Ânnen ­čśë
    Nat├╝rlich braucht es ├ťbung und Erfahrung bei der Programmierung, aber gerade wenn man noch gr├╝n hinter den Ohren ist, kann man viel falsch machen.

    Gitarre spiele ich auch schon recht lange (ca. 15 Jahre) und auch hier war es unglaublich schwer falsche Angewohnheiten in richtige umzulernen. Besonders wenn man sich das Spielen selber beibringt.

    Ich denke beim Programmieren ist es ├Ąhnlich. Als Elektrotechnik-Student wurden mir nur die absoluten (minimalen) Grundlagen in C beigebracht. Das Interesse ist gewachsen und nun programmiere ich seit ├╝ber einem Jahr an meiner Masterarbeit mit C++. Dank euch konnte ich gute fortschritte machen. Dennoch sto├če ich immer wieder auf ein Problem, bei dem es mehrere Wege gibt und ich mangels Erfahrung nicht wei├č, welcher der beste ist (so wie in diesem Thread, bei dem es viele M├Âglichkeiten gibt auf eingebettete Objekte zuzugreifen). Bis jetzt bin ich allerdings noch auf keiner Lekt├╝re gesto├čen, das iregendwie perfekt f├╝r mich ist.

    Wie ist es eigentlich bei euch gewesen? Habt ihr euch das programmieren strukturiert beigebracht oder kam es im Laufe der Zeit durch Erfahrungen?

    viele Gr├╝├če,
    Sbond



  • manni66 schrieb:

    Wie lernt man perfekt Gitarre spielen, ohne zwei Jahrzehnte Gitarre zu spielen?

    kommt aber auch sehr darauf an wie viel man in den zwei Jahrzehnten spielt.
    1 Stunde die Woche?
    1.5 Stunden t├Ąglich (ungef├Ąhr meine zeit am Klavier t├Ąglich)?
    6 Stunden t├Ąglich?

    und ob man einen Lehrer hat oder nicht, oder?

    Nat├╝rlich braucht man viel Zeit, um etwas zu meistern. Es ist aber auch wichtig was man in der Zeit macht.
    Zwei Jahrzehnte die Gitarre falsch zu halten ist keine gute Idee ­čśë


Log in to reply