Egy url-en belül több különböző értéket szeretnék átadni több különböző php-nak.
Mi a teendő, ha egy url-en belül különböző értékeket szeretnék átadni GET-tel különböző fájloknak,amik egymásba vannak includeolva?
Szóval van egy index.php-m, ebbe van include-olva egy hirek.php. A menuid=4-et saját magának adja át az index.php,ettől függ, hogy melyik php-t include-olja. Az oldal=13-at pedig az include-olt hirek.php-nak szeretném átadni oldalszámként az oldal alján található lapozó linknek. A kérdés leginkább arra irányulna,hogy hogy "iktassam ki" a hirek.php lapozó linkjéből a menuid-t.
Ugye a menuid nem fix, ezért konkrét értéket nem adhatok hozzá.
Ezt próbáltam:Így ezt kapom,ha rákattintok a második,majd a harmadik oldalra: index.php?m_id=6&oldal=2&oldal=3
■ Szóval van egy index.php-m, ebbe van include-olva egy hirek.php. A menuid=4-et saját magának adja át az index.php,ettől függ, hogy melyik php-t include-olja. Az oldal=13-at pedig az include-olt hirek.php-nak szeretném átadni oldalszámként az oldal alján található lapozó linknek. A kérdés leginkább arra irányulna,hogy hogy "iktassam ki" a hirek.php lapozó linkjéből a menuid-t.
Ugye a menuid nem fix, ezért konkrét értéket nem adhatok hozzá.
Ezt próbáltam:
$oldal = (isset($_GET['oldal'])) ? $_GET['oldal'] : 1;
$lapozo = "<p>";
$lapozo.= ($oldal <= 1) ? "Első | " : "<a href=\"{$_SERVER['REQUEST_URI']}&oldal=1\">Első</a> | ";
$lapozo.= ($oldal <= 1) ? "Előző | " : "<a href=\"{$_SERVER['REQUEST_URI']}&oldal=".($oldal-1)."\">Előző</a> | ";
for ($i=1; $i<=$oldalak; $i++) {
$lapozo.= ($oldal == $i) ? "{$i} | " : "<a href=\"{$_SERVER['REQUEST_URI']}&oldal={$i}\">{$i}</a> | ";
}
$lapozo.= ($oldal >= $oldalak) ? "Következő | " : "<a href=\"{$_SERVER['REQUEST_URI']}&oldal=".($oldal+1)."\">Következő</a> | ";
$lapozo.= ($oldal >= $oldalak) ? "Utolsó" : "<a href=\"{$_SERVER['REQUEST_URI']}&oldal={$oldalak}\">Utolsó</a>";
$lapozo.= "</p>\n";
return $kimenet.$lapozo;
Kód újrahasznosításához
Nagyon csúnya kérdés: hogyan
Van erre valami példa? Könyv? Cikk? Bármi?
A legegyszerűbb formájában
Ha valamelyik része nem tiszta, akkor kérdezz nyugodtan.
Az a legnagyobb
Függvény = function
Egyébként a függvényt tartalmazó PHP-t célszerű külön megírni, mármint ha elég hosszú, és a fájlt inkludálni a "fő" programba. Kellemes használni, de kezdőként lesz vele gondod, ugyanis a függvényen belül nem éred el a függvényen kívül létrehozott változókat. Ugynevezett paraméterként adhatod át amire feltétlen szükséged van. Ha ez nem elég nézz utána a "global" kulcsszónak: változók globális elérése
Ez egy csodás leírás,
Nézzük akkor meg. Három
1. Függvényeket írunk
2. ?
3. Profit!
A Facebook, a Google és Amazon mind a fenti stratégiával készült.
A következőkben tehát egyrészt azt próbálom megmutatni, hogyan szervezd a kódot kisebb, újrahasznosítható egységekbe, másrészt hogyan kezeld megfelelően a bemenő adatokat, mert most bárki pillanatok alatt hozzáférést szerezhet bármelyik felhasználód fiókjához.
Kezdjük egy függvénnyel, amivel hozzáférünk a paraméterekhez anélkül, hogy mindig ki kellene írnunk az ellenőrzést:
Jöjjön az emlegetett függvény az URL összeállításához:
Az esetleges elírásokért nem vállalok felelősséget, évek óta nem fejlesztek PHP-ban, így ezt a kódot sem futtattam.
Ami a „soha nem lesz belőlem programozó” részt illeti, pár napja kaptál egy levelet, de válasz nem érkezett :)
Ha ez nagyjából megvan,akkor
Mit tartalmaz az átadott string és tömb?
Egyszerűbben
$_SERVER['REQUEST_URI']
-t próbálod továbbfűzni. Jelen esetben egyszerűbb, ha ehelyett felépíted az URL-t.Természetesen, ha ennél bonyolultabb URL-lel van dolgod, akkor elemezheted is, pl.
explode()
-dal felbontod a kérdőjel mentén, majd a második felét ugyanígy, csak az &-jelek mentén. Illetve a későbbiekhez érdemes ránézned ahttp_build_query()
függvényre is, ami a paraméterek alapján összeállítja Neked az URL kérdőjel utáni részét, megfelelően kódolva.Illetve a későbbiekhez
Ó. Bámulatos, hol tart már a tudomány :)
Az egyetlen hibája az ilyen
Lehetne csavarni
$_GET['m_id']
elé(int)
-et írni,htmlspecialchars()
-ozni,urlencode()
-olni, vagy bármi hasonlót, de ez egy lapozó lesz, és itt az érvénytelen menüazonosító már jóval korábban elvérzik, minthogy a lapozónak lehetősége lenne megjelenni.A #12-esben tényleg elég alaposan körüljártad a kérdést, én viszont igyekeztem egy gyors és működő megoldást mutatni, amitől fennmarad a lelkesedés, és lehet egyre izgalmasabb dolgokkal folytatni. Természetesen, mivel nem ismerem a kérdezőt, lehet, hogy olyan típus, akinek a mélyebb szakmai dolgok csak jobban megmozgatják a fantáziáját, és mostanra már a SOLID utolsó betűjénél jár :) Mindenesetre a tapasztalataim alapján egy újonccal könnyebb megszerettetni a szakmát gyors és működő megoldásokkal, mert egy komplex leírástól könnyen az az érzése támadhat, hogy "ha egy egyszerű lapozóhoz ennyi minden kell, akkor mi lesz velem, ha valami bonyolultabbat szeretnék?" Talán a leggyakrabb elriasztó felállás az, amikor egyetlen sornyi kimenetért függvények serege felelős – a való életben lehet ilyen példa, de egy kezdőt megijeszthet. Sokkal szélesebb a mosoly (és akár egy kicsit gyermeki is, de ezzel nincs semmi baj), amikor meglátja, hogy egy 3 soros FOR-ciklussal megtöltheti a képernyőt. Ne azt érezze, hogy ő van a rendszernek alárendelve, hanem azt, hogy egy különleges eszköz van a kezében, amivel bámulatos dolgokat lehet véghezvinni.
Hát legalább az egyikünk
Ahhoz, hogy ebből egy jól
1.) Az egyik, és legfontosabb dolog, hogy a bemenetből soha semmit nem dolgozhatsz fel ellenőrizetlenül.
A függvények kód újrahasznosításra valóak, körülbelül így néz ki a fenti kód függvényekkel megadva:
A $_SERVER['REQUEST_URI']-vel ugyanez a helyzet, azt is ellenőriznöd kell, mert a felhasználótól kapod. Annak a php fájlt választó részét a webszerver ellenőrzi helyetted, szóval azzal nem kell foglalkoznod. Elég csak leválasztanod a queryString-et róla, aztán a $_GET-ből a paraméterek ellenőrzése után újra felépíteni. Ehhez van a php-nek egy beépített url parsoló függvény, amit felhasználhatsz ellenőrzésre:
Nézzük meg így a kódod újra:
2.) Egy másik koncepció, amit meg kell értened, azt úgy hívják, hogy dependency injection. Ez körülbelül arról szól, hogyha újrahasznosítható kódot akarsz, akkor a kód függőségeit mindig be kell injektálnod, és nem helyben létrehoznod. Jelen esetben ennek egy lebutított változatáról van szó, ha azt akarod, hogy csak egyszer kelljen kell megírni a lapozo függvényedet, és ne kelljen mondjuk copy-paste-elni, akkor úgy kell megcsinálnod, hogy paraméterezhető legyen. Miért nem jó copy-paste-elni? Azért, mert ha később módosítani akarod, a lapozód kinézetét, vagy bármi mást, akkor minden egyes helyet meg kell keresned, ahova odamásoltad a lapozót, és egyesével mindegyiket módosítanod. Ha viszont egyetlen helyen van a lapozo függvényed, akkor ha belenyúlsz, az az összes olyan oldalon módosítani fogja a lapozó kinézetét, ahol használod.
Egy kicsit csaltam ezzel a szabállyal kapcsolatban az ellenőrző függvények egy részénél. Ha megnézed egy az egyben $_GET-et és $_SERVER-t, illetve string konstansokat, mint 'REQUEST_URI', 'oldal', 'm_id' használok, amiknek függvény paramétereknek kellene lenniük. Ennek az az oka, hogy nem akartam egy teljesen általános ellenőrző keretrendszert írni, sem objektum orientált kódot adni...
Térjünk vissza a lapozo függvényedhez. Jelen esetben milyen további függvény paraméterek lehetnek?
Nyilván azok, amiket ellenőrzünk az elején ($utvonal, $menuId, $oldal), mert azok mind a felhasználói bemenetből jönnek. A $kimenet és $oldalak, amik meg már alapból ott vannak paraméternek a lapozóhoz. Más nem igazán van. Szóval az ellenőrző kódrészeket ki kell helyezned a függvényen kívülre, és paraméterként megadnod őket.
3.) További koncepció, hogyha látsz egy ismétlődő mintát a kódodban, akkor azt újra tudod hasznosítani úgy, hogy kiemeled egy változóba vagy egy függvénybe. Például az ellenőrzéseknél és most az $urlTorzs átadásánál is volt egy ilyen kód újrahasznosító mellékhatása a módosításainknak.
Nézzük meg a mostani kódot. Az alábbi minta nagyon sokszor ismétlődik benne:
a.)
c.1.)
Itt látszik, hogy az $elvalaszto hozzáfűzése nem feltétlen kell, hogy a lapozoLink gyártás része legyen, sokkal inkább a lapozo-hoz tartozik ez a feladat, így átemelhetjük a lapozóba. Ezt úgy is hívják, hogy magasabb absztrakciós szintre emelés, amikor egy függvényből az őt hívó másik függvénybe emelünk át kódot azért, mert inkább oda tartozik logikailag.
4.) A további koncepció, amit fontos betartani az a single responsibility principle. Ez körülbelül a te esetedben annyit tesz, hogy egy kód részletnek egy adott feladatra kell szakosodnia, nem keverhetünk logikailag dolgokat. Ezt már érintettük az előző magasabb absztrakciós szintre emeléssel, amikor azt mondtuk, hogy az $elvalaszto hozzáfűzése a lapozóhoz nem a lapozoLink hatásköre, hanem a lapozo építő függvényünké.
Nézzük meg a mostani kódot, hogy találunk e hasonló mintát benne?
A kódod az összes refaktorálás után tehát így néz ki:
Ja és ha komolyan programozni akarsz, akkor tanulj meg angolul, ha meg php-ban akarsz létrehozni, akkor használd a php manual-t, mert abban is rengeteg hasznos függvény van, amit használhatsz. Nem kell feltalálni a spanyol viaszt...
Teendő hiba esetén ?
Mégis ... ne vedd zokon, ezzel a szemlélettel, a feltétel nélküli hibatűréssel nekem már sok gondom volt. Hogy is fogalmazzak ...
Van egy komplex függvény készlet ami ellenőriz/feldolgoz egy elfogadható vagy véletlenül/szándékosan elrontott adathalmazt. Elvileg jó, viszont ebben a formában pont a szűrendő hibákra érzékeny (a hatás kiszámíthatatlan). Nem kívánt adat esetén a függvények belső hibáit fogjuk elsősorban nyomozni, mert az "error" a forrástól nagy távolságban bukkan majd fel. Gondolom, nem szándékosan ilyen, csak sajnos automatikusan erre az eredményre jutunk amennyiben a hibakezelés fel sem merül.
Mi történik ha nincs érvényes paraméter? Konkrétan - megletEllenorzes() - bízzuk magunkat a PHP-ra majd csak generál egy üres sztringet, mivel return az éppen nincs. Valószínűleg nem akadunk ki, egyszerű az eset is, hamar rájövünk mit tettünk. Túl sok infóra azért nem számíthatunk.
Úgy gondolom, sok időt takarítunk meg, ha némi paranoiával szemléljük becses függvényeinket. Lehetséges hibaforrások azok is. Gyorsan megírva erre mérget vehetsz.
Ha már kezdőnek adunk tanácsot, szerintem jobban jár primitívebb megoldással, de beépített hibaüzenettel. Ezt fontosabbnak tartom mint ez elegáns megjelenést. (az URL építést szándékosan kihagytam):
Mi történik ha nincs érvényes
A megletEllenorzes() jelen esetben opcionális paraméterekre van kiélezve, mert kötelező paraméter nem volt a kódrészletben. Ha van kötelező paraméter, akkor ki kell egészíteni az ahhoz kapcsolódó kóddal valahogy így:
Hibakezelés szempontjából a kód ismétlések megakadályozása az általad "elegáns megjelenésnek" titulált módszerekkel sokkal fontosabb, mint a "debug mode", és nem "teszt környezet" írása, amit te javasolsz. A debug elősegítése a te módszereiddel overengineering-nek számít és kerülendő, hibás elképzelés. A stack trace használata és a hibák visszakeresése viszonylag jól működő dolog, de összességében bárhonnan is futunk neki a debuggolásnak, az eredmény mindig hibáktól hemzsegő kód lesz. Az utólagos tesztelés helyett a kódokat előre kell tesztelni még a megírásuk előtt...
Jelen esetben a teszteket előre kellett volna megírnom valamilyen teszt keretrendszer, pl phpunit használatával, és csak utána módosítanom a kódot, mert a tesztek nélküli refaktorálás könnyen hibákhoz vezethet. Nálam is vezetett, utólag észrevettem, kijavítottam... A bevezetést a phpunit használatába túlzásnak tartottam, ezért nem írtam bele, így is túl hosszúra sikeredett a hozzászólás... Lehet, hogy a későbbiekben írok bevezetés a programozásba jellegű könyvet, vagy cikkeket, majd még meglátom mennyire lesz kedvem hozzá...
Nem gondoltam bonyolult
Miért tekinted gondnak ebben a speciális esetben, ha figyelmeztetünk egy lehetséges hibás hívásra? Az üres oldal informatívabb? Vagy még jobb, egy távoli függvény hibát dob, mert problémája akadt aminek okát pár szinttel feljebb kell majd keresgélni. Persze előre tudjuk milyen intervallumot várunk, de van egy általánosított és utólag kiokosított függvényünk ami csak saját magával foglalkozik. És ez jó, mert nincs túltervezve. Teszteléshez pedig mindenképp használjunk (x)debug-ot.
"Stack trace", azt hiszem tudom miről beszélsz, bár ez a szleng ismeretlen. A javasolt függvényeidre hogyan kapcsolod be? Vagy ez is if-else blokkban játszik mint az ajnározott throw-exception? Remélem tanulhatok valamit ez ügyben.
"Stack trace", azt hiszem
Az előzményeket tartalmazza, hogy hogyan került meghívásra a hibát kiváltó függvény. Ha jól tudom (bár ennek nem néztem utána) a php-ben az exception-nél automatikusan kiírja az error esetében viszont a set_error_handler és a debug_backtrace kombinációjával vagy xdebug használatával lehet megtudni. Én általában mindenre kivételt dobok, úgyhogy nem nagyon futok bele olyan helyzetbe, hogy ne lenne alapból kint. A kivételkezelés-nek kellene utánanézned, azzal sokkal jobban lehet hibákat kezelni php-ben, mint bárhogy máshogy.
A kódot akkor írjuk meg, amikor szükség van rá, nem akkor, amikor azt feltételezzük, hogy talán egyszer szükség lehet rá, ezért overengineering. Ha azt akarod, hogy kevesebb hiba legyen a kódodban, akkor írj hozzá teszteket ahelyett, hogy a hibákat próbálod lenyomozni...
A másik, ami miatt hibás az elképzelés, hogy sérti a single responsibility principle-t, a függvényednek nem lehet két feladata. Vagy tesztel, vagy végrehajt valamit, a kettő együtt nem megy.
overengineering és egyebek
Szerintem akkor van kevesebb hiba a kódban, ha egyszerűsített feltételek között működik.
A külső inputra nem ugyanaz vonatkozik mint a "védett" adatra. Alapértelmezésben megbízható helyről származik (nem biztos), tartalmilag jó (jobbára), a küldőnek megfelelt (nekünk esetleg). A bizonytalanság miatt ellenőrizni lehet/kell az inputokat. Azt nem tudom megvizsgálni hányféleképpen lehet elrontani, arról van elképzelésem miféle adattal működik helyesen egy konkrét függvény. Valahogy így szoktam eljárni:
A "kivétel dobás" megsérti az elveket amikre hivatkozol. Egyértelműen túltervezés. Nem csináltál előzetes vizsgálatot, emiatt a hibák szabadon terjednek a rendszerben. Mutációként jelentkeznek a kölcsönhatások miatt. Csak a legvégső ponton fogod meg. Ott viszont annyiszor ahány részre sikerült szétszedni a feladatot. Külön bónusz, sikeresen létrehoztál egy "aspektus orientált" feladatot.
Egyik függvényednek sem feladata a hibakezelés, mégis belekerült. Hány feladatuk van ténylegesen?
Alighanem a neveltetésem miatt nem megyek bele ilyen megoldásokba. Inkább ellenőrzök munka előtt, azután lesz ami lesz. A tesztelés gondja kideríteni mi maradt ki.
Ui.
Az tetszik a programozási elvekben, főleg az OOP elvekben, hogy paradoxonokban gondolkodik. Talán így van ez jól. TED video
Például: A többalakúság a rugalmasság feltétele, sajnos örökléssel jutunk hozzá ami rugalmatlanná teszi a kódot. Az objektum összetétel, a láncolás (DI), hatékonyabb az öröklésnél, és teljesen rugalmas. Azonnal mellékelik hozzá "Demetert" ami kimondja, a láncolás rugalmatlan és a hossza módfelett aggályos.
A kivételt bármikor
A többalakúságot el lehet érni objektum összetétellel, aminek semmi köze a láncoláshoz. A láncolás is csak bizonyos esetekben tiltott a Demeter trv által, ha sérti az adatrejtést, pl a fluent interface megengedett. Olvashatóság szempontjából is csak akkor rossz, ha nincs rengesen eltördelve a pontok mentén, és rossz a behúzása.
Összességében ahogy nézem mindent keversz mindennel.
"Bármikor"
Egy biztos, józan ész szerint akkor írható kivételes kiugrálás ha annak semmi, abszolút semmi káros következménye nincs.
Igen, keverek sok mindent. A konkurens mémek (módszerek stb.), véletlen sem alkotnak egységes rendszert. Egyszer szeretnék látni valami kimutatást, melyek szimbióták, melyek dolgoznak egymás ellen. Végül is a területszerzés egy másik ideológia rovására folyik. Most csak úgy érzésre válogatok.
Ahol van, az a legrondább
Hát ezen jót röhögtem :D Az egész függvénytörzs, amiről beszélünk 4 soros...
De ha ennyire számít, hogy a függvény elején legyen a bemenet ellenőrzése, akkor parancsolj.
Majd egyszer elmagyarázod mit
Viszlát
A kódot akkor írjuk meg,
A jelenlegi legnagyobb munkámban tanultam meg, hogy az egyszerűségre való törekvés a legkifizetődőbb. Lecserélhetem a modulokat, de mi van, ha nem lesz erre szükség? Mi van akkor, ha közben elfogy a pénz, és becsődöl az egész? Miért legyen a kód ennyire absztrakt?
Olvasgatok a különböző programozási paradigmákról, és úgy látom, hogy mindegyik mellett párhuzamosan új problémák jelennek meg, amik tovább bonyolítják a helyzetet:
- Dolgozzunk OOP-ben! Hát ez így nem elégséges, be kell vezetni az OOP mintákat, mert anélkül nem lesz hatékony.
- Írjunk teszteket! De ez így nem elég, írjuk meg őket előbb, aztán csak magát a kódot. Ha később a program változik, a teszteket is akár írhatom újra. Nem mindegy, hogyan írom meg a teszteket, az egyes modulok közti összefüggéseket csökkenteni kell. Node a végső kódban a modulok egymással dolgoznak!
- És így tovább.
Valóban szükség van ilyen szintű bonyolításra?
A tudásnak nincs határa
Új megoldások
- Design patterns: Erről már
- TDD: Hogy néz ki egy fejlesztés? Valaki definiálja a feladatot, tehát tudod az alkalmazás melyik részeitől milyen viselkedést vársz el. Erre írod meg a tesztet, majd a teszttel validálod az implementációt és iterálsz mindaddig, amíg nem az elvárt viselkedést hozza. Nem értem ezzel mi a bajod. Ezt csinálod MINDIG. Akkor is, ha nincs teszted előre. Csak akkor "szemmel", ergo könnyebben viszel be bugokat. És elfelejted, kiesel a kontextből, nem tudsz pár szempillantás alatt levalidálni nagy halom kódot, ergo sokkal később fogod látni, hogy valami nem jó... Miért az a túlbonyolítás, ahol ezek a feltételek már az implementáció megkezdésekor adottak?
Félreérthető voltam, most nem
Továbbá felmerülhet az emberben, hogy mennyire lehet progresszív: amikor kijön egy új paradigma, érdemes-e mindjárt kipróbálni, vagy inkább várjak pár évet, mire kiforrja magát?
Szerintem ezen nem érdemes
Én amellett vagyok, hogy ki
Bármekkoránál, ha úgy látod,
Jó, akkor pontosítok rajta, most éppen release early, release often szerint próbálok fejleszteni. Szóval kitűztem egy nagyon rövid távú célt, viszont eleve erre a rendszerre építkezem már ennél a rövidtávú célnál is, mert látom, hogy még rengeteg más modul is bele fog kerülni a rendszerbe a többi release-nél, és nincs kedvem a későbbiekben tök fölöslegesen refaktorálni az egészet az alapoktól. Ilyen kontextusban gondoltam. Ha tudod, hogy csak egy kis weboldal lesz, amihez nem kell a későbbiekben hozzányúlni, akkor nyilván nem szórakozol egy ilyen rendszer felépítésével, mert minek...
Egyébként szerintem még a kisebb projekteknél is van értelme mindent modulokra bontani, és modul szintű teszteket írni, mert sokkal könnyebben megy úgy a fejlesztés, mintha az egészet akarnád egyben megírni. Nekem pl sokkal kényelmesebb így, hogy nem kell foglalkoznom az sql-el a projekt elején, elég csak kimockolnom az ehhez tartozó modult, és szevasz. Szóval nekem szükségem van egy ilyen rendszerre, mert segít koncentrálni a lényegesebb dolgokra. Nem véletlenül írtam, vagy csak passzióból, mert megtehetem. Lehet, hogy neked mások az igényeid, de ez már nem az én dolgom...
Nem tudom mi absztrakt neked ebben. Nekem nagyon is kézzelfogható. Vannak modulok meghatározott céllal, pl adattárolás, amik ehhez a célhoz kapcsolódó objektumokat szolgáltatnak a többi modulnak. Fontos elválasztani a feladatköröket, különben egy rohadt nagy káoszt kapsz a végén, amit képtelen leszel karbantartani, és a projekt emiatt fog összeomlani a végén, nem a pénzhiány miatt.
Nem értem ez hogyan kapcsolódik a témához. Ennyi erővel akkor nem is fektessünk energiát egy projektbe se, mert mi van, ha elfogy a pénz.
Nem tudom, hogy van e értelme
A design patterns az oo best practice-ek gyűjteménye. Egy olyan eszközkészlet, amit ha megtanul használni az ember, akkor könnyebbé teszi az oo fejlesztést.
Az automatizált tesztekre szükség van, mert különben honnan tudnád, hogy eltörsz e valamit a programban, ha hozzányúlsz? Sehonnan.
A fejlesztés menete a következő, először kérsz user story-t, az alapján use case-eket hozol létre, a use case-ek alapján teszteket írsz, a tesztek alapján pedig megírod a kódod. Ha nem írsz teszteket, akkor honnan tudod, hogy azt írod e meg, amit az ügyfél kért? Sehonnan, maximum a memóriádra támaszkodhatsz, ami általában kihagy. Persze lehet fejlesztgetni bele a vak világba, ha van időd...
Ebből látszik, hogy nem szoktál teszteket írni, mert ha utólag írnád meg, akkor is ugyanígy írhatnád újra kód változtatásnál.
A laza csatolás fontos, az egyik legalapvetőbb dolog oo programozásban, és ugyanúgy érvényes kell, hogy legyen a modulokra is. Ha a modulok nem lazán csatoltak egymáshoz, akkor nem lesznek karbantarthatóak.
Igen, valóban szükség van.