Erstes OOP Projekt - Erschaffung einer Instanz namens Person - gelöst



  • ...



  • Mein Software Engineering Prof würde mich töten 🙂 Deklariere Attribute private und verwende Getter- und Setter-Methoden

    LG, freakC++



  • ...



  • Da fällt mir eine Frage ein, die ich schon immer mal stellen wollte:
    Sämtliche Member sind bei mir privat und werden über Getter/Setter erreichbar. Bei Werten, bei denen es keine spezielle Prüfung gibt, ist da eine inline-Funktion genauso schnell, wie als wenn die Member public wären? Ich denke mal schon, oder?



  • freakC++ schrieb:

    und verwende Getter- und Setter-Methoden

    Dafür würde dich der ein oder andere auch tötgen. 😃



  • Aber nur, wenn er keine Ahnung von Software Engineering hat.



  • Nathan: Eher nicht, der Compiler optimiert das schon.
    freakC++: Da würde ich mich nicht so weit aus dem Fenster lehnen.



  • freakC++ schrieb:

    Aber nur, wenn er keine Ahnung von Software Engineering hat.

    struct Number
    {
        int value;
    };
    

    vs.

    class Number
    {
        int value;
    
    public:
        int getValue() const
        {
            return value;
        }
    
        void setValue(int newValue)
        {
            value = newValue;
        }
    };
    


  • out schrieb:

    freakC++ schrieb:

    und verwende Getter- und Setter-Methoden

    Dafür würde dich der ein oder andere auch tötgen. 😃

    Der Trick ist, dass man nur Getter und Setter für die Member anbietet, auf die man von aussen auch Zugriff haben soll. Alles andere soll ja aber die "normalen" Methoden gehen. Der Nutzer soll ja auch keine Ahnung und auch kein Interesse an deiner Implementierung haben, wenn doch ist er schon falsch dran.

    (Regel: Programmiere gegen Interfaces und nicht gegen Implementierungen)



  • Ethon schrieb:

    freakC++ schrieb:

    Aber nur, wenn er keine Ahnung von Software Engineering hat.

    struct Number
    {
        int value;
    };
    

    vs.

    class Number
    {
        int value;
    
    public:
        int getValue() const
        {
            return value;
        }
    
        void setValue(int newValue)
        {
            value = newValue;
        }
    };
    

    Solange es in C++ keine Property-Schreibweise gibt, ziehe ich in der Regel (Ausnahme s.u.) letzteres aus mehreren Gründen trotz des Overheads vor:

    1. Man kann ohne den restlichen Code umschreiben zu müssen auch noch nachträglich Bereichsprüfungen oder andere nötige Logik durchführen.
    2. Man kann die Zugriffe regeln (z.B. auf Setter verzichten, oder diese nur für abgeleitete Objekte freigeben - auch hier ziehe ich wegen Punkt 1. diese Schreibweise vor), und für gegenseitig abhängige Werte auch ein Interface erzwingen in dem diese als Gesamtheit gesetzt werden (Dann halt nicht mehr unbedingt über einen "normalen" Setter mit einem Parameter).

    Bei Objekten die ausschließlich dem Datenaustausch dienen und keinerlei Logik aufweisen, verzichte ich aber auf Setter/Getter.



  • silent_max schrieb:

    class Person
    {
    public:
       //...
       double Alter;
       double Gewicht;
       double Größe;
       //...
    };
    

    Mehrere kleinere Anmerkungen:
    1. Bist du sicher das Alter ein double sein soll? Ich würde hier eher von einem Ganzzahltyp ausgehen (je nach Definition der Einheit gilt dies auch für Gewicht und Größe). Dir ist hoffentlich bewusst das du double-Werte nicht ohne ein delta sinnvoll vergleichen kannst. Wann möglich ziehe ich daher immer Integerwerte den Gleitkommawerten vor.

    2. Nur um mal etwas aus der Praxis zu reden: Wenn es um ein echtes Programm geht, würde man in der Regel das Alter als berechneten Wert ansetzen, und statt dessen sein Geburtsdatum hinterlegen (Heute mag Max Mustermann 36 sein, in ein paar Tagen aber vielleicht schon 37).



  • Ich lege dem Threadersteller nahe, sich zuerst mit den grundlegenden Dingen in C++ (Datentypen, Funktionen, Operatoren, etc.) auseinanderzusetzen und erst dann OOP lernen. Alles gleichzeitig machen bringt nichts. Damit kommst du nur durcheinander (wie jetzt) und sehr langsam voran.



  • [Rewind] schrieb:

    Ich lege dem Threadersteller nahe, sich zuerst mit den grundlegenden Dingen in C++ (Datentypen, Funktionen, Operatoren, etc.) auseinanderzusetzen und erst dann OOP lernen.

    OOP ist leider jetzt das aktuelle Thema in seinem Kurs. Max ist daher dazu gezwungen, sich jetzt damit auseinanderzusetzen,



  • daddy_felix schrieb:

    OOP ist leider jetzt das aktuelle Thema in seinem Kurs. Max ist daher dazu gezwungen, sich jetzt damit auseinanderzusetzen,

    Dann hat unser Max etwas falsch gemacht. Ich kann mir unmöglich vorstellen, dass der Prof in seinem Kurs irgendwelche OOP-Aufgaben aufgibt, ohne vorher void behandelt und erklärt zu haben.



  • Das problem ist ja auch, dass man zwar anfangs sicherlich was über z.B. Gleitkommaungenauigkeit liest, das aber noch nicht einordnen kann und es somit recht flott wieder vergisst. Erst wenn man darüber wieder mal stolpert, erinnert man sich vielleicht und schafft Abhilfe oder sucht nach Alternativen.

    Ich finde es eh immer verwerflich, wenn man als Programmieranfänger mit allen Sachen auf einmal zugebombt wird, man kann fast nichts richtig machen (in den Augen eingier hier im Forum).

    Lernt man Funktion, wird einem dazu geraten OOP zu nutzen, lernt man OOP kommt direkt Polymorphie, Inheritance und Design-Patterns. Nutzt man auch das wird man angeschnauzt warum man keine generischen Designs mit STL, TMP und Boost nutzt.

    Da sollten auch wir etwas Älteren/Erfahreneren mal dran denken...



  • Skym0sh0 schrieb:

    Ich finde es eh immer verwerflich, wenn man als Programmieranfänger mit allen Sachen auf einmal zugebombt wird, man kann fast nichts richtig machen (in den Augen eingier hier im Forum).

    Ist das eine alggemeine Aussage oder bezieht sich das auf Max? Beim Letzteren würde das nicht stimmen, da unser Bildungssystem noch nicht so schlecht ist, dass alles in der ersten Vorlesungssitzung/Unterrichtsstunde drankommt. Normalerweise hat man eine Woche Zeit um das Gelernte aufzunehmen, zu üben und zu wiederholen. Jemand, der das wirklich lernen will, schaut noch über den Tellerrand hinaus und nimmt sich die zwei Stunden Zeit zusätzlich, um mehr zu machen als in der Aufgabe verlangt ist. Das ist aber alles schon ein anderes Thema. Fakt ist für mich, dass der Threadersteller zuerst ein paar Sachen nachholen muss, wenn er das lernen will.



  • Nein, das bezieht sich nicht auf Max oder indirekt auf ihn, sondern auf generell Anfänger.

    Es geht mir eher um die Informationsflut, die hier im Forum auf Anfänger einprasselt und abverlangt wird.

    Als ich damals angefangen habe mit C++ (vorher kannte ich ein klein bisschen Java), waren Arrays auch nur das was ich heute als C-Arrays kenne. An Vector und Konsorten hab ich damals nichtmals mein Zunkunfts-Ich denken lassen. Aber wenn hier im Forum jemand eine Frage stellt wird er sofort (unabhängig von seinem Skill) an den vector verwiesen. Das Ganze gibt es natürlich auch mit Zeigern und Smart-Pointern und auch im Klassendesign Bereich.

    C++ ist eine Sprache, die viele Eigenarten hat (positive wie negative) anhand derer man sich ziemlich verrennen kann im Entwicklungs- und Lernzyklus.
    Ich denke, es muss nicht immer die perfekte C++-Lösung verlangt oder dann gepostet werden, sondern eventuell auch eine die etwas C-lastiger ist.

    Denn absprechen kann das keiner, Fehlermeldungen was Templates angeht sind alles andere als gut zu verstehen (jedenfalls anfangs).



  • Als ich damals angefangen habe mit C++ (vorher kannte ich ein klein bisschen Java), waren Arrays auch nur das was ich heute als C-Arrays kenne. An Vector und Konsorten hab ich damals nichtmals mein Zunkunfts-Ich denken lassen. Aber wenn hier im Forum jemand eine Frage stellt wird er sofort (unabhängig von seinem Skill) an den vector verwiesen. Das Ganze gibt es natürlich auch mit Zeigern und Smart-Pointern und auch im Klassendesign Bereich.

    C++ ist eine Sprache, die viele Eigenarten hat (positive wie negative) anhand derer man sich ziemlich verrennen kann im Entwicklungs- und Lernzyklus.
    Ich denke, es muss nicht immer die perfekte C++-Lösung verlangt oder dann gepostet werden, sondern eventuell auch eine die etwas C-lastiger ist.

    Naja, wenn wer Frage ohne Context stellt, gehen wir davon aus, das es sich um ein praktisches Problem handelt! Und in der Praxis kommst du um "Intelligente Container" nicht herum. Wenn wer z.B. in produktiven Einsatz ohne triftigen Grund nen c Style Array nem Vector vorzieht, gehoert er ..... und es gibt nicht viele wirklich triftige Gründe !
    Leider richtet sich die Form der Bestrafung auch nach der Verfügbarkeit und vor allem den Kosten geschulten Personals 😃

    Geht es um das lernen / theorethische Probleme, dann wird das meistens auch deutlich gemacht. Und trozdem ist der hinweis dann immer noch angebracht, denn trotz allen gelernten soll der Weg auch in die richtige Richtung gehen oder ?

    C-lastiger Code ist toll 🙂
    Mann will ihn nur nicht warten müssen ...
    Muss man trotzdem welchen schreiben in der Praxis, sollt man sich um Gotteswillen dessen bewusst sein (und es nur auf die notwendigen Teile berschränken).
    Das sollt eine unserer Kerntätigkeiten sein als Programmierer, abwägen zwischen Wartbarkeit und Performance!

    Wie man mit den Antworten hier umgeht ist jedem seine Sache. Nur sollt man sich auch klar machen, für was dieses Forum gut sein soll !?
    Ist dieses Forum zum disskutieren von praktischen Problemstellungen, oder eher nen interaktives Nachschlagewerk, wo man Anfängern das Selbsstudium der Theorie abnimmt ... err erleichtert.

    Ich selber sehe den praktischen Teil im Vordergrund, also sehe ich auch keinen Grund Verweisse auf die praktische Anwendungen zurueckzuhalten ....

    Genauso gehe ich zuerst davon aus, das der durchschnittliche Forenuser zumindest die Grundlagen beherrscht. Sonst müssten hier alle in nem ganz anderen Stil schreiben ....

    Das heisst nich, das Neulinge keine Fragen stellen dürfen/sollten, nur sind Verweisse auf Literatur und Grundlagen ausm Lehrbuch dann auch angebracht.

    Ciao ...



  • daddy_felix schrieb:

    OOP ist leider jetzt das aktuelle Thema in seinem Kurs. Max ist daher dazu gezwungen, sich jetzt damit auseinanderzusetzen,

    Also ich kann mich daddy_felix nur anschließen.

    Mein Dozent nimmt leider keine Rücksicht darauf, was die Schüler denken und schreitet immer und immer mehr voran mit dem Unterrichtsstoff. Zwar geht er auf ein oder zwei Fragen während des Unterrichts drauf ein, aber das war es auch schon.

    Und OOP ist nun mal nun groß Thema.

    Anbei ... bei mir hat es jetzt angefangen, dass neben der CPP Programmierung zusätzlich zwei Stunden in der Woche Netzwerktechnik dazu kommen.

    Weiß einer von euch ein gutes Forum, das sich mit Netzwerktechnik behandelt??

    Gruß Max



  • silent_max schrieb:

    Mein Dozent nimmt leider keine Rücksicht darauf, was die Schüler denken...

    Wenn ein Lehrer auf jeden und alles eingeht, so wird der Unterricht immer an den schlechtesten in der Klasse orientiert. Das andere Extrem ist zwar auch nicht gut, aber in der Regel wird ein Mittelweg eingeschlagen. Er muss eine Gewisse Stoffmenge in einer gewissen Zeit durchziehen, die Stoffmenge ist nicht frei von ihm vorgegeben.

    Wenn du aber den Begriff Dozent nennst, gehe ich schon von einer weiterführenden Schule oder einem Studium aus. In dem Fall wird von einem Erwartet, das er in der Lage ist sich Informationen auch anderweitig aneignen zu können. Zudem kann man Klassenkameraden durchaus fragen oder mit diesen lernen.

    silent_max schrieb:

    Weiß einer von euch ein gutes Forum, das sich mit Netzwerktechnik behandelt??

    Nein, aber die Bücher für Fachinformatiker sollen einen guten Überblick geben (Über die Qualität kann ich nicht viel sagen, aber schau dir mal das OpenBook von Galileo an, ob du da fündig wirst [Wird nach meinem Wissen von einigen Fachinformatier-Klassen verwendet]).


Anmelden zum Antworten