Keresés

Új hozzászólás Aktív témák

  • dobragab

    addikt

    válasz cadtamas #4190 üzenetére

    Most, hogy mar erted is, hadd szidjam kicsit a feladatot.

    A legnagyobb problema a Rectangle-ben, hogy redundans adattagok vannak benne. Alapvetoen ez egy olyan teglalapot tarol, aminek az oldalai parhuzamosak a tengelyekkel, tehat kb. ennyi adattagra lenne szukseg:

    Point topLeft;
    int width;
    int height;

    vagy

    Point topLeft;
    Point bottomRight;

    Hiszen ebbol a kettobol ki lehet szamolni az osszes tobbi adatot, egyetlen osszeadassal / kivonassal. Amugy a getter ertelme pont ez, hogy ha valami nem kozvetlenul all rendelkezesre, akkor is ki tudja szamolni / ossze tudja rakni. Ha ennel tobb adatod van, akkor sziszifuszi harc ezt konzisztensen tartani (ertsd: ne legyenek benne egymasnak ellentmondo adatok), ezert 3-5 soros egy setter. Igy kene mondjuk:

    Point getLowerLeft() const
    {
    return Point(topLeft.getX(), bottomRight.getY());
    }

    A masodik baj, hogy tobb setter, pl. a setTopLeft fuggveny szemantikailag ertelmetlen. Egy teglalap bal felso sarkat hogy allitod? Tolod az egesz teglalapot, hogy a merete maradjon meg, vagy megnyujtod, es 2 pontot mozgatsz vele, hogy a jobb also pont maradjon a helyen? Mivel nem egyertelmu, hogy mit csinal, nem szabadna ilyen nevu fuggvenynek lennie. At lehetne nevezni mondjulk pushTopLeft-re vagy dragTopLeft-re, ugy mar egyertelmu, hogy a teglalapot nyujtja, mint PowerPointban a kep atmeretezese.

    Altalaban veve pedig a setter rossz omen, azt sugja (haladobbaknak: code smell, tehat nem feltetlenul rossz, csak nagyon nagy valoszinuseggel), hogy valami nem oke a koddal. (haladobbaknak: Single Responsibility Principle-t sert, konkretan ugy, hogy nincs is responsibility.) Itt pl. az, hogy semmit nem csinal az osztalyod, semmivel sem jobb, mint

    struct Point { int x; int y; };

    A harmadik problema, hogy a Pont-nak kene konstruktor setter helyett.

    struct Point
    {
    int x;
    int y;
    Point()
    {
    x = 0;
    y = 0;
    }
    Point(int x, int y)
    {
    this->x = x;
    this->y = y;
    }
    };

    Es igy nem kell bele setter sem, mert felul tudod irni az = operatorral, pl.

    topLeft = Point(topLeft.x, topLeft.y + 10);

    Destruktort megmutatni semmi ertelme, amig nincs eroforraskezeles (tipikusan: dinamikusan foglalt memoria), es a Rectangle osztalyban amugy sem szabad ilyennek lennie (egy teglalap ne kezeljen mar dinamikus adatot, haladobbaknak: ez megint SRP-t sert). De ezt irtak elottem is.

    Negyedik: hibas a Point ket settere (ami amugy nem is kene, lasd fent). Igy lenne helyes:

    void setX(int x) { itsX = x; }
    void setY(int y) { itsY = y; }

    Igy hirtelen ennyi, ami bokte a csorom. Azert irtam le, mert az OOP-nek (objektumorientalt programozas) jo lenne, ha nem csak a szintaktikai elemeit tanitanak meg, hanem az elveket, ami menten epiteni es alkalmazni illik. Anelkul semmi ertelme az egesznek.

    OFF: amugy sajnos nem talaltam olyan konyvet, ahol le vannak ezek irva rendesen, es nem 500+ oldalban. Ha valaki tud ilyet, ne tartsa magaban.

  • mgoogyi

    senior tag

    válasz cadtamas #4190 üzenetére

    //Ez elvileg az implementáció, amit nem taglal a könyv, hogy miért kell és később miért nem használjuk semmire.
    -> Az implementáció írja le a dolgok működését, a .h-ban meg azt látod, hogy mit tudsz csinálni majd ezen az osztályon

    //ide kellene gondolom a destruktor, ami azért jó, mert memóriát szabadít fel?
    -> vagy egyéb resource-öket enged el, de az osztályodban nincs ilyen. Akkor fogsz látni destruktort, ha az osztályodban lesz olyan, hogy "new"

    setupperleft:
    //módosítja a JobbFelső pont Y értékét, de miért???
    -> azért, mert ez egy téglalap, ha a bal felső sarkát feljebb húzod, a jobb felsőnek is követnie kell

    //a test felső vonalát határozza meg, de nem ez a dolga!!!
    -> dehogynem, az itstop értékét, azaz mi a legnagyobb Y értéke a téglalapnak, módosítani kell, amikor valamelyik sarkát arrébb teszed

    setTop(int top):
    //beállítja a test felső vonalát. Ugyanazt mint a setUpperLeft() függvény. MIÉRT???
    -> azért, mert ez a függvény a téglalap felső oldalát teszi arrébb, amivel együtt mozognak a felső sarkai

Új hozzászólás Aktív témák