Kezdőoldal » Számítástechnika » Programozás » Az MVC az OOP-vel hogy jön össze?

Az MVC az OOP-vel hogy jön össze?

Figyelt kérdés

Az OOP egyik alapszabálya, hogy minden feladatot annak az osztálynak kell elvégeznie, amelyik rendelkezik az adatokkal, nem pedig ide-oda adogatni egy csomó adatot. Az MVC mintha ennek ellentmondana, miközben azt látom itt és máshol is, hogy ugyanazok az emberek mind a kettőt favorizálják, és triviális követelménynek tekintik.


Most írtam egy osztályt, amelyik megszerez és rendszerez egy csomó adatot. Mellesleg képes

a) az adatait HTML levélben elküldeni a megadott címre

b) adni egy űrlapot a saját adatainak a megjelenítésére és módosítására.

Az utolsó metódus biztosan nézet, az a) is nagyjából.


Ha külön akarnám választani a nézetet, akkor valahol máshol egy másik osztálynak kellene az űrlapot elkészítenie, de ahhoz kéne írni gettert egy tucatnyi adatra csak azért, hogy átpasszoljam. Ez elég sok felesleges munka, és sokkal bonyolultabb kód, több hibalehetőséggel. Tényleg ez a kánon?


Most akkor melyik az isten, az OOP vagy az MVC? (Szerintem egyik sem, csak a hívek véleményét kérdezem.)



2015. nov. 12. 09:14
 1/7 anonim ***** válasza:
100%

Egyik sem zarja ki a masikat.


Amit te csinaltal 1 db osztaly tul "nagy", szet kellett volna valasztani.

Az nem OOP, hogy mindent egybe bepakolok.


Nalad a liras alapjan azt, hogy HTML levelet kuld valami ki lehet szedni ugy, hogy kap egy templatet, meg parametereket es cimzett(ek)et, majd ebbol keszit egy levelet es kuldi.

Az urlapot megintcsak kulon osztaly tudja kezelni megfelelo parameterezessel.


MVC-ben is vannak neked kulon kontrollerek (amik szinten osztalyok), amik kulon-kulon feladatert felelos osztalyokat fognak ossze, vannak templatek es template kezelo osztaly.



Egy irdatlan primitiv pelda/"MVC framework"-re pl:

[link]


A Controller mappaban ott egy Base controller, amibol szarmaztathatoak a sajatok ez csak ad par helpert es alap parametereket.

Az src-be lehet pakolaszni a mukodeshez osztalyokat, a controllerek csak parametereket szurnek, csinalnak par ellenorzest, majd peldanyositjak es hivjak a megfelelo osztalyokat.

(Itt jelenleg csak 1 wrapper van az altorouterhez, amit a keresek feldolgozasaert es routeolasaert felel.)


A "belepesi pont" itt a public mappaban az index.php az peldanyosit egy routert (ez most a Router.php amiben az utvonalak vannak jelenleg), csinalja meg a matchelest es a megfelelo controllerek peldanyositasat es meghivasat.


A sajat kulon logika szinten mehet az src-be, kulon osztalyokba szepen, mert igy egyreszt sokkal atlathatobb, hogy mindennek megvan a helye, masreszt (ami fontosabb) tesztekkel jol lefedheto.

2015. nov. 12. 09:37
Hasznos számodra ez a válasz?
 2/7 A kérdező kommentje:
Nem igazán értem. Az osztályom jelenleg kommentekkel együtt bruttó 270 sor, teljes kiépítettségénél sem lesz 400. Bár van benne nézet is, de szorosan odatartozik, és az osztályon belül világosan elkülöníthető. Ha azt csinálnám, amit mondasz, a terjedelem, a bonyolultság és a fejlesztési idő is a sokszorosára nőne. Ebben mi a jó?
2015. nov. 12. 10:07
 3/7 anonim ***** válasza:

Mondjuk mert ugy tesztelhetoek a reszek fuggetlenul es jobban elkulonulnek a szerepkorok, valamint sokkal jobban bovitheto a dolog.

Kod ujrafelhasznalas?


Ennyi erovel minek egyaltalan OOP meg MVC?

Siman ossze lehet tolni mindent 1-2 fileba, max par fuggvennyel es kesz.

Pillanatok alatt megvan, csak utana soha az eletbe ne akarja hozzanyulni.

2015. nov. 12. 10:37
Hasznos számodra ez a válasz?
 4/7 anonim ***** válasza:

Nem olvastam el az eddigi válaszokat és magyarázatokat, így előfordulhat, hogy 2x mondom el ugyanazt.


OOP: [link]

MVC: [link]


Úgy képzeld el mint egy gyárat. Vannak összeszerelő üzemek, alkatrész gyártók és a többi...

Ugye egy alkatrész gyártáshoz, más tudás, más eszköz kell. Így azt ott csinálják. Meg van az alkatrész, akkor azt lehet továbbítani, kiadni.


Hogy az alkatrész hova kerüljön (pl. egy csavar) azt egy külön szerv dönti el, hol van rá szükség. [Controller példának kedvéért]


Majd az adott alkatrész (csavart) felhasználják az összeszerelőben.

Létrejött egy termék.


Hasonló módon pepitában a MVC is.

- Controller egy olyan objektumok halmaza, ami vezérli az egész rendszert. Azt, hogy az szoftveres ülteti logikát hova építed, az már más kérdés.

- Model nem más mint az adatbázis adatainak képe. Azaz itt tárolják, amit adatbázisból kiolvastak ill. írni akarnak.

- View nem más mint a megjelenítés.


Pl.: Webfejlesztésben

http kérés jön valamilyen paraméterekkel. Ezt a Controller feldolgozza, majd a megfelelő üzleti logika függvényeit hívja. Ha kell az adatbázist írni/olvasni, akkor a Model-hez fordul segítségért.

Ha már minden output előállt, akkor az átadja a View-nak, hogy generáljon belőle HTML kimenetet.

És ez az amit látsz.


De C++/Java/stb nyelveknél nem úgy működik, hogy elejétől a végéig lefut a kód, és utána látod, mint PHP esetén, hanem M, V és C relatív párhuzamosan fut, attól függően, hova nyúlkálsz.

2015. nov. 12. 22:19
Hasznos számodra ez a válasz?
 5/7 A kérdező kommentje:

Köszönöm a válaszokat, de nem pont azt kérdeztem, amit az utolsó írt.


Első: nagyjából értem, amit mondasz, és értem, hogy az MVC-t is objektumorientáltan valósítják meg, de még mindig ott tartok, mint az elején: ez a kiszervezősdi, paraméteresdi voltaképpen gyengíti azt az OOP-s alapelvet, hogy minden feladatot abban az osztályban kell megoldani, ahol az adatok rendelkezésre állnak. OK? hogy hasznos, de akkor is elvesz valamit a tiszta OOP-ből.

2015. nov. 13. 07:17
 6/7 anonim ***** válasza:

Következő classokat csinálnék:

a) Levél küldéssel foglalkozik (üzleti logika)

b) Űrlap adatot dolgoz fel ír/olvas, megjelenítésre meg odaadja a View-nak amiket kell (Üzleti logika)

c) Űrlapot jelenít meg (View eleme)

d) Adatot tárol (Model elem)


Itt az adatok nem sérülnek, mert az attribútumok PRIVATE-ak. Más szóval, kívülről nem férhetők hozzá, csak az adott osztály képes. Getter/setter meg ép arra jó, hogy ha írni akarnád, akkor letudod ellenőrizni, hogy tényleg valid (helyes) azaz input, amivel felül akarod írni az attribútumot.


Teszem azt, egy attr. csak páros számot tárol, setter meg kap egy páratlant. Akkor a setter metódusban leellenőrzöd, hogy tényleg páros-e, ha nem akkor vagy nem írja felül, vagy teszem azt: egy visszatérési értéket generálsz, hogy false ha nem írta felül, és true ha igen.


Itt adatok nem sérülnek, és azaz sincs semmi baj, ha adatot adogatsz egyik helyről a másikra. Meg egyébként is: API-k erről szólnak.

Adsz valami inputot, csinál valamit, és vissza ad valamit amivel te bajlódsz tovább.


[link]

Ezt olvasd el. A "A COM+" és a ".NET" témák már nem kellenek.

2015. nov. 13. 09:44
Hasznos számodra ez a válasz?
 7/7 anonim ***** válasza:

"gyengíti azt az OOP-s alapelvet, hogy minden feladatot abban az osztályban kell megoldani, ahol az adatok rendelkezésre állnak"


De ez nem igy van, ilyen esetben 1 db osztaly eleg lenne mindenre, mert abban ugyebar minden adat ott van.


Az, hogy kivulrol nem piszkalod az osztaly belso allapotat, az tiszta sor, a masik valaszolo megadta a kulcsot hozza, az adattatgok private-ra vannak rakva es csak gettereken/settereken keresztul fersz hozzarjuk (vagy ugy sem).

Igy maris minden osztaly, magaban foglalja majd az o reszfeladatahoz szukseges dolgokat, ugyanakkor minden osztaly csak 1-1 kisebb, specifikus feladatert fog felelni.

2015. nov. 13. 11:55
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!