Was macht man mit solch einer Fehlermeldung?



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Point2D p0, p_;

    Machen dann nicht vielleicht auch Point2D topleft, bottomright; oder Point2d bottomleft, topright mehr Sinn als p0 und p?



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Deine Schnittstelle ist allgemein konfus.

    Ich habe hier noch keinen Code gesehen, der ohne spitze Bemerkungen durchgekommen ist. Wenn er nicht zu meinem Projekt passt, werde ich es schon selbst erfahren. Mit "konfus" kann ich jedenfalls herzlich wenig anfangen, weshalb ich mir darum jetzt auch keinen Kopf machen werde.


  • Mod

    @wob sagte in Was macht man mit solch einer Fehlermeldung?:

    @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Point2D p0, p_;

    Machen dann nicht vielleicht auch Point2D topleft, bottomright; oder Point2d bottomleft, topright mehr Sinn als p0 und p?

    Vielleicht. Ich war mir nicht so sicher, was die Absicht hinter der Klasse sein soll (was halt genau das Problem ist, dass sich ein Leser nicht sicher ist). Geht es um schnöde Speicherung von zwei Punkten? Oder geht es um die Verbindung zwischen den internen Daten und der semantischen Interpretation als Rechteck mit den Konzepten von ausgerichteten Seiten und Ecken?



  • Es geht MIR darum, ein sicheres Konstrukt aus vier Werten zu haben, ohne unsicher zu sein, wie x0, y0 etc zu deuten ist.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Ich habe hier noch keinen Code gesehen, der ohne spitze Bemerkungen durchgekommen ist. Wenn er nicht zu meinem Projekt passt, werde ich es schon selbst erfahren. Mit "konfus" kann ich jedenfalls herzlich wenig anfangen, weshalb ich mir darum jetzt auch keinen Kopf machen werde.

    Konfus: Selbstwiedersprüchlich. Du hast const-Member, bietest aber ausdrücklich Funktionen zu deren Veränderung an. Was nicht funktionieren wird. Deshalb wird es auch nicht lange dauern, bis du mit deinem unbesorgten Kopf gegen die Wand rennst.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Du hast const-Member,

    const-Member? Du meinst die fehlerhafte Zeile const Point2D<val_t>& p0_;?


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Es geht MIR darum, ein sicheres Konstrukt aus vier Werten zu haben, ohne unsicher zu sein, wie x0, y0 etc zu deuten ist.

    Dann lass doch die Schnittstelle zu x0, y0, etc. weg und biete nur die high-Level Interpretation mit "links", "rechts", etc an! Wie das Rechteck intern repräsentiert ist, sollte kein Teil der öffentlichen Schnittstelle sein. Wenn es nämlich Teil der öffentlichen Schnittstelle ist, dann kannst du die interne Repräsentation in Zukunft nicht mehr ändern, weil du dann allen abhängigen Code kaputt machen würdest.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Du hast const-Member,

    const-Member? Du meinst die fehlerhafte Zeile const Point2D<val_t>& p0_;?

    Welche Eigenschaften deiner Klasse nun falsch sind und welche richtig, kannst nur du wissen. Ich als Leser kann nur sagen, dass die gezeigten Eigenschaften widersprüchlich sind und daher mindestens eine davon falsch sein muss.



  • Ich würde die Klasse aber gerne auch mit vier Werten füllen. Ich habe sie zu meiner eigenen Erleichterung geschrieben, weil mir die vier Werte auf Dauer zu undurchsichtig wurden.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Welche Eigenschaften deiner Klasse nun falsch sind und welche richtig, kannst nur du wissen. Ich als Leser kann nur sagen,

    Jesus! Das war der Fehler, keine Absicht! Ehrlich, machmal frickelt man lieber eine Woche an einem Problem herum, als sich hier zu melden.


  • Mod

    Du hast offenbar nicht verstanden, was ich dir sagen möchte, was an deinem Design nicht stimmt. Vermutlich aus irgendeinem falsch verstandenem Ehrgefühl, dass das Aufzeigen einer Schwäche in deinem Code irgendwie als persönlichen Angriff wahr nimmt, anstatt inhaltlich über die Kritik nachzudenken.



  • Nein, das hat nichts mit Ehre zu tun, sondern, das die Kritik ziellos ist. Du sagst, konfus, weil ich einen const-Member habe. Ich sage, das war der Fehler. Was war denn noch, was ich jetzt an Verbesserungsvorschlägen überlesen habe?



  • Ihr müsst bedenken, Ihr arbeitet professionell, mache vielleicht sogar als Profs. Ihr könnt Eure Kenntnisse nicht vorrausetzen bei Leuten, die das nebensächlich aus Interesse betreiben.



  • @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    	val_t& left() { return p0_.x(); }
    	val_t& bottom() { return p0_.y(); }
    	val_t& right() { return p_.x(); }
    	val_t& top() { return p_.y(); }
    

    Ich finde das hier recht ungewöhnlich. Generell ist es sehr unüblich (nicht-const-)Referenzen auf private Member rauszugeben, wohingegen const-Referenzen absolut state-of-the-art sind.

    Wenn du private Member ändern willst, solltest du eine Setter dafür anlegen, oder eben irgendeine Funktion die Daten verarbeitet und anhand der Daten indirekte diese privaten Member verändert. Abhängig davon was genau die Aufgabe deiner Klasse ist.
    Wenn die Klasse nur ein Container ist, dann reicht ein Setter, wenn die Klasse aber komplexere Aufgaben übernimmt ( ein Parser z.B. ) dann ist beispielsweise "handleMyData( const MyBigData & )"-Funktion, die dann indirekt zur Veränderung deiner privaten Member führt auch sinnvoll.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Nein, das hat nichts mit Ehre zu tun, sondern, das die Kritik ziellos ist. Du sagst, konfus, weil ich einen const-Member habe. Ich sage, das war der Fehler. Was war denn noch, was ich jetzt an Verbesserungsvorschlägen überlesen habe?

    Der ursprüngliche Fehler war nicht, dass dein Member const ist, sondern eine Referenz. Da du gesagt hast, dass du den Fehler behoben hast, aber nicht wie, ist nicht klar, ob er noch const ist oder nicht. Wenn du jetzt sagst, es war ein Fehler, dass es auch falsch ist, dass er const ist, dann habe ich doch Recht gehabt, dass es entweder falsch ist, dass er const ist, oder an anderer Stelle beschrieben wird.

    Die andere Kritik ist, dass deine Klasse zwei Aufgaben erfüllt: Einerseits bietet sie ein low-level Interface zum Speichern von zwei Punkten an (p, p0), andererseits die High-Level Interpretation als Rechteck mit Ecken und Kanten (left, top, etc.). Die High-Level Abstraktion sollte nicht das Implementierungsdetails nach außen geben, dass das Rechteck intern als zwei Punkte gespeichert ist. Sonst bist du für alle Zeiten an dieses spezielle interne Detail gebunden.
    Vorschlag: Eine Klasse zur Speicherung und Manipulation von zwei Punkten, und eine andere Klasse für reine Rechtecklogik, die die Zweipunktklasse (oder halt auch etwas anderes!) intern benutzt. Wobei die Zweipunktklasse wahrscheinlich keine "richtige" selbstgeschriebene Klasse sein braucht, weil ein typedef auf ein Zwei-Punkte-Array die Funktionalität quasi perfekt abbildet



  • @It0101 sagte in Was macht man mit solch einer Fehlermeldung?

    Ich finde das hier recht ungewöhnlich. Generell ist es sehr unüblich (nicht-const-)Referenzen auf private Member rauszugeben, wohingegen const-Referenzen absolut state-of-the-art sind.

    Ja ok, das sehe ich ein. Ich habe das vielleicht zu sehr verallgemeinert. Aber es gibt doch zB auch den operator() als Referenz. Das ist doch hier nichts anderes.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Wobei die Zweipunktklasse wahrscheinlich keine "richtige" selbstgeschriebene Klasse sein braucht, weil ein typedef auf ein >Zwei-Punkte-Array die Funktionalität quasi perfekt abbildet

    Der Point2D-Typ wird mit Matrizen multipliziert, weshalb das so nicht geht. Glaube ich.



  • Ich persönlich tue mich bei so reinen einfachen Datenobjekten immer schwer damit, den Vorteil einer "Full-Grown"-Klasse zu sehen gegenüber

    template<typename T>
    struct Rect {
        T top, left, right, bottom;
    };
    

    Manchmal ist simpler besser. Aber das ist ja eine ganz andere Diskussion.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    @It0101 sagte in Was macht man mit solch einer Fehlermeldung?

    Ich finde das hier recht ungewöhnlich. Generell ist es sehr unüblich (nicht-const-)Referenzen auf private Member rauszugeben, wohingegen const-Referenzen absolut state-of-the-art sind.

    Ja ok, das sehe ich ein. Ich habe das vielleicht zu sehr verallgemeinert. Aber es gibt doch zB auch den operator() als Referenz. Das ist doch hier nichts anderes.

    Ich weiß nicht ganz, worauf du dich hier mit dem operator() beziehen möchtest. Was gemeint ist, dass man normalerweise keine privaten Member durch Referenzen nach außen offenbart. Denn dann sind sie nicht wirklich privat. Angenommen du fügst eine Funktion hinzu, die die Fläche zurück gibst. Angenommen, du stellst fest, dass die Rechnung dazu zu lange dauert, und fügst einen weiteren privaten Member area hinzu, der sich das Ergebnis merkt, und die Fläche wird nur dann neu berechnet, wenn sich die Eckpunkte verändern. Wenn jetzt deine Klasse aber freies Beschreiben der privaten Eckpunkte von außen erlaubt, dann hat sie die Kontrolle über die interne Invariante verloren, dass in area die Fläche zu den momentanen Eckpunkten gesetzt ist. Das Verändern der Eckpunkte sollte nur über speziell dafür vorgesehene Funktionen geschehen dürfen (die dann area neu berechnen können), nicht über unkontrollierbare Referenzen.



  • @wob Ich werde natürlich versuchen, die Klasse ein wenig einzudampfen, wenn das soviel Anstoss erregt. Aber nur soweit, wie es mir nützt. Wenn es mir nichts bringt, mache ich es nicht.


Anmelden zum Antworten