Absztrakt
Sziasztok!
Egy projekt kapcsán merült fel bennem a kérdés, hogy hogyan lehetne a globális adatteret nem beszennyezni mindenféle változóval úgy, hogy a függvények ilyenfajta, globális adattérből történő változólekérdezése pontosan legyen definiálva. Ráakasztanék egy bemeneti, és esetleg egy kimeneti 'felületet'.
Első gondolatra az Objektumorientált programozás vetődött fel, akkor viszont át kellene rendezni az egészet.
Ti mit gondoltok erről?
■ Egy projekt kapcsán merült fel bennem a kérdés, hogy hogyan lehetne a globális adatteret nem beszennyezni mindenféle változóval úgy, hogy a függvények ilyenfajta, globális adattérből történő változólekérdezése pontosan legyen definiálva. Ráakasztanék egy bemeneti, és esetleg egy kimeneti 'felületet'.
Első gondolatra az Objektumorientált programozás vetődött fel, akkor viszont át kellene rendezni az egészet.
Ti mit gondoltok erről?
Globális
Egyszer eljut az ember erre a
Eltarthat egy ideig, mire ráállsz, kitartás. Ezen sokan átestünk.
Természetes, hogy át kell
Általában ha globálisból rántasz be paramétereket az annak a jele, hogy hosszú hívási láncon kellene átadnod őket. Ez tipikusan igaz a konfigurációs paraméterekre, amiket a DI container szépen be tud injektálni alsó szintekre is anélkül, hogy hívási láncon kellene átküldenie őket.
Ha jobban megnézed a struktúrált
a(p) --> b(p) --> c(p) --> d(p)
hívási láncot átalakítjuknew A(new B(new C(new D(p))))
kifejezéssé. Ezt az objektum gráf készítést meg szétosztjuk a container metódusai között, így szép átlátható kódot kapunk. Ha nem konfigurációs paraméterről van szó, akkor érdemes megvizsgálni, hogy tényleg a megfelelő helyen adsz e értéket neki. Elképzelhető, hogy a hívási láncon lejjebb lehet tenni, és akkor már nem kell annyiszor átadni. Lehet még realtime hívási láncot készíteni ugyanígy objektum gráf összeállítással, pl stream-ek pipe-olásánál, de ez nem jellemző megoldás a problémára. Nagyjából ezek a lehetőségek.struktúrált, szorosan
Procedurális kód esetén mindig interface-re programozunk, azaz ha van egy modulunk
modul_fuggveny1()
ésmodul_fuggveny2()
függvényekkel, akkor ez a felülete. PHP-ban például elég a függvényeket tartalmazó fájlt lecserélni, és meg is van oldva pl. a tesztelés:Szerintem félreértetted,
Magyarul procedurális kód
Az OOP önmagában nem véd meg
Jó és rossz programot bármilyen paradigmával lehet írni, te is pontosan tudod, hogy a linux kernele, alaprendszere és a legtöbb hozzá tartozó rutinkönyvtár C-ben íródott, procedurálisan, de ugyanígy a biztonságot hirdető OpenBSD is.
Mérnöki megoldások
Köszönöm a válaszokat, úgy
A probléma nem a globális változókkal van, hanem ott, hogyha valamit szeretnék hozzáadni egy dinamikusan létrehozott formhoz, több helyen változtatni kellene a kódokon. Tudom, meg lehetne oldani strukturált programozással is, de nekem az már gányolásnak tűnik. Jobbnak igazából az osztályok tűnnek, lehetne 'absztrakt' függvénnyel is, de nem erre találták ki.
Ha az alapokkal tisztában
Nos, a következőt tudtam most
(Inf3rno ABContainer()-es példája)
A bővítőosztályoknak nem kell állapotuk lenniük, és könnyen kiterjeszthetjük egy másik adatbáziskezelőre is:
Milyen jó anyag ez :D
Azért nem ilyen egyszerű ez,
Szerintem elsőnek olvasd el a PSR-eket (jobb oldalt), és használd ezeket a konvenciókat a kódoláshoz. Pl nagybetűs osztálynevek, stb.
Másodiknak próbáld megérteni a SOLID principles-t. Leginkább az SRP-vel és a DIP-el foglalkozz.
Jelen esetben a database osztály Connect metódusa egyszerre példányosít leszármazott osztályokat, és csatlakozik adatbáziokhoz. Ez így zavaros, ha valaki ránézésre meg akarja érteni, hogy miről van szó. Márpedig általában csapatban fogsz fejleszteni, úgyhogy jó, ha ránézésre értik mások, hogy mit csinál a kódod. A másik, ami fontos, hogy nem érdemes string-ből változó vagy osztályneveket összefűzni. Nincs rá automatikus kiegészítés, könnyen elgépeled, és az IDE-k sem tudnak mit kezdeni vele egy refactoring-nál. Valami ilyesmi jobb lenne:
Szerintem a próbálkozásaid mellett éredemes minél többet olvasni arról, hogy mások hogyan használják az oop-t, mert gyorsan sokat lehet tanulni belőle. Ha nem olvasol, hanem mindenre magadtól akarsz rájönni, akkor az sokszor annyi idő. Ugyanígy, ha keretrendszert sajátot írsz, ahelyett, hogy a meglévőket tanulnád meg használni, az is sokszor annyi idő, és így tovább... Szerintem próbáld ki a doctrine-t, aztán ha beletanultál, akkor máris van egy olyan tudásod, ami egy állásinterjún jó pontnak számít.