Programozás - általánosba akartam volna, de nem találtam.
Tegnap este eszembe jutott két Design Patternes wiki bejegyzés közt egy Cairngorm (Flex) framework olvasgatása közben, hogy hogy is van ez?
Én anno úgy tanultam (Pascal, C, C++), hogy globális változókat nem használunk, mindent paraméteren, visszatérési értéken keresztül érünk el. Én kevésbé lustább időszakaimban próbálok is ennek megfelelni ActionScriptben is, de ahogy elnézem, manapság már nem ez a trend.
Leginkább azon kaptam fel a fejem, hogy a Cairngormban nagyban építenek a globális, singleton DataObjectre, vagy mi a neve pontosan. Tehát, ha jól értettem, az összes olyan adatot, amire szükség van, egy darab singleton tartalmaz és azt meghívva lehet elérni a számunkra fontos információkat. Tény, hogy ez moduláris, eseményvezérelt rendszerben baromi kényelmes, de teljesen szembe megy azzal, amit anno próbáltak a fejembe verni.
Szintúgy nem értem a Value Objecteket se (csak változót tartalmaz, függvényt egy darabot se, talán csak a konstruktort). Tök kényelmes, igen, de OOP-ben szintén azt sulykolták, hogy tagváltozót csak getter/setter függvényen kereszül szabad, a változó maga sosem lehet publikus, mert akkor nem kívánt adat is bekerülhet, illetve az ellenőrzés is kikerül az osztály fennhatósága alól, sérül az Encapsulation.
Van még egy csomó ilyen dolog, értem is hogy miért vannak, meg amúgyis, Rómában, mint a rómaiak, de mégiscsak furcsának tartom. Érdemes erőltetni a dolgot és megpróbálni szép OOP kódot írni, vagy hagyjam a fenébe és alkalmazkodjak az adott platform szokásaihoz?
- 8026 megtekintés
Hozzászólások
A patterneket es dogmakat teljesen felesleges eroltetni. Aki azzal jon hogy globalis valtozo vagy goto az evil, arrol azonnal lehet tudni hogy az orranal sem lat tovabb es csak a bemagolt dolgokat szajkozza vissza. Szerintem egyetlen dologra figyelj: a jozan paraszti eszedre, azzal sokkal tobbre mesz, mint 300 kotet pattern konyvvel.
- A hozzászóláshoz be kell jelentkezni
:)
Ezzel mondjuk vitatkoznek, annak ellenere, hogy nem ismerek igazan sok nagykonyves patternt.
Par honapja mintegy harom hetet toltottem azzal, hogy static globalis valtozokat irtottam egy legacy C kodbol. Szoval nem art olvasgatni, jot tesz az.
- A hozzászóláshoz be kell jelentkezni
Ahogy mondod: nem árt olvasgatni... hogy amikor szembemész a dogmákkal, akkor tudd, hogy szembemész, és tudd, hogy okkal, vagy oktalanul teszed - ez ui. már egy rendezőelv.
- A hozzászóláshoz be kell jelentkezni
Igaz, felesleges a pattern-eket erőltetni, de a 'teljesen figyelmen kívül hagyni őket' hozzáállás sem jó.
A józan paraszti ésszel csak egy baj van: mindenki azt hiszi, az övé a józan, a másiké meg a paraszti...
A pattern-ek adhatnak egyfajta keretet, de nem mindenre jók. Ha pl. valaki egyfolytában 'zilált'(pl.: 40-50 publikus változó egyetlen osztályon belül, olyanokkal, mint x0; illetve egy-egy metódusnak van 14-16 paramétere) kódot ír, akkor annak a csapongásait jól lehet kontrollálni pattern-ekkel(sajnos a példa valós).
Van egy leírás, amit érdemes megnézni singleton-okkal kapcsolatban:
http://www.ibm.com/developerworks/webservices/library/co-single/index.h…
[ne zavarjon, hogy java, nem a nyelv az érdekes, hanem az elv]
- A hozzászóláshoz be kell jelentkezni
Jok a regi tanok, mert ugy lehet karbantarthato kodot irni.
DE:
A getter/setter method jellemzoen olyan nyelvekben van (mint pl. Java, Javascript), ahol nem lehet field accessorokat definialni (pl. C#ban, Pythonban lehet).
A Value Object ugy hangzik, mint ami egy vanilla C-s struct akar lenni, csak nincs ilyen a nyelvben.
Multiparadigm nyelvben ne akarj mindenaron OOP-s kodot irni. Tudd, hogy melyik eszkozt mikor erdemes hasznalni. Olyan programot kell irni, ami elegge altalanos, hogy bovitheto legyen; de elegge konkret ahhoz, hogy konnyen megoldja a feladatot.
- A hozzászóláshoz be kell jelentkezni
"Multiparadigm nyelvben ne akarj mindenaron OOP-s kodot irni."
Ez itt a nagy igazság. Minden nyelvnek van eszköztára, és már rég megmondták, hogy nincs olyan megoldás, ami minden problémára illeszkedik. Az OOP sem csodaszer. Akkor kell használni, ha van értelme, és ha nincs, akkor meg nem, mármint ha a nyelv engedi hogy kilépj belőle.
A globális változók sem az ördög művei, egy ilyen singleton objektumba összegyűjtve pontosan azt éred el, hogy a használatuk rendszerezett lesz, és könnyen követhető. Azzal egyetértek, hogy a legacy C-s kódokban gyakran túl sok a globális változó, szívtam már én is ilyennel. De van, amikor ésszerű a használatuk. Ezt már egy másik szálban kitárgyaltuk egyébként.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Igy van. Önmagában nem egy adat mindenhonnan történő elérhetőségével van a gond, hanem azzal, AHOGYAN el lehet érni.
Az osztályokba global változót pakolunk tipikusan egy ilyen megoldás, hiszen nem egységes módon éred el ezeket az adatokat, hanem minden egyes adat máshol van. De mi ezt
nem akarjuk.
Egy nem kódolásos példa nagyjából az SQL szerver. Ott is van globális adat, ez az adatbázis, sok helyről el tudod érni, mégis, az interfész, amin keresztül eléred,
az egységes.
- A hozzászóláshoz be kell jelentkezni
Soha ne kelljen felskalaznod egy rendszert tobb adatbazisosra, ha ez neked nem baj...
- A hozzászóláshoz be kell jelentkezni
Ha az adott helyzetben jó eséllyel tudja, hogy nem kell, akkor ésszerű egyszerűsítés. A túlzott általánosítás épp olyan rossz, mint a túl specifikus megoldások. Mégis csak az általánosítást tanítják iskolában, azt nem, hogy hogy találd el a megfelelő mértéket.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
+1, bár nem erről írtam :D
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Felhasználóként akarod tudni, hol van az adott adat, melyik szerveren? Logikusan nem. Be akarok jelentkezni egy cluster-be, aztán
kiadni a parancsot, a rendszer meg találja ki. Nem úgy akarok cluster-t csinálni, hogy akkor ez az adat a db1-ben van, akkor oda
jelentkezek be, a másik meg a másikban, akkor meg oda.
Vagy elbeszélünk egymás mellett :D
- A hozzászóláshoz be kell jelentkezni
A gyakorlatban az elso skalazasi lepesben tipikusan a suru olvasasokat szetvalasztod az irastol egy csak olvashato slave-re. Ha a rendszerben nem tudod modulonkent injektalni, hogy melyik kapcsolatot hasznalja, hanem csak egy singletonod van, ami elkeri A kapcsolatot, akkor kicsit sok idobe fog telni amire ezt kirefaktorolod.
Vannak dolgok, amiket relativ hamar kapsz a nyakadba, egy ilyen szetvalasztas rendszerindulas utan 2-3 evvel hajlamos jelentkezni.
Nyilvan mindenre felkeszulni nem kell, meg van amit ugy hagyok benne hogy "ket nap refactoringgal megoldhato ez is", csak ha sok rendszert lattal mar es ez mindegyiknek baja volt akkor felkeszulsz.
- A hozzászóláshoz be kell jelentkezni
Oké, most már értem, mit akartál írni, egyet is értek vele, csak másról beszélünk.
Amiről én beszéltem, az arról szólt, hogy logikailag nem jó a globális változó, mert ami a célunk, az az, hogy adott adatokat elérjük rendszerszinten, több különálló
helyről. Ez a logikai szintű probléma. Erre egy megoldás a globális változó. A globális változóval viszont az a gond, hogy behoz rendszerelemek közötti függőséget,
és egy nagy spagetti kódot eredményez.
Ez ellen véd a singleton megoldás, amitől valamilyen módon elkérheted ezeket a globális adatokat. Igy minden egyes modul csak egy elemtől függ.
Ez logikailag!!! megegyezik mondjuk a registry-vel, vagy akár az adatbázis kezelővel, hiszen akkor is több program használ egy közös erőforrást, egységes interface-szel.
- A hozzászóláshoz be kell jelentkezni
Halk megjegyzes: javascriptben lehet property-ket definialni, ma mar nyelvbol is, nem csak libbol:
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special…
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special…
- A hozzászóláshoz be kell jelentkezni
Oh, ezt nem is tudtam, koszi.
Mar csak azt kell megvarni, hogy az Internet Explorer 6, 7 es 8 elenyeszo reszesedessel rendelkezzen (ezek ugyanis nem tamogatjak).
- A hozzászóláshoz be kell jelentkezni
Erdekes kerdes. A valasz az, hogy nincs valasz, azaz nincs altalanos szabaly.
- a programozok is divatoznak. Evente valtozik, hogy mi a Szent Gral (XML, dependency injection, Rails-like frameworkok, J2EE, funkcionalis nyelvek, actor modellek, platformfuggetlenseg -- nehany pelda arra, amivel az adott idoben tele volt az internet, es tobben allitottak, hogy mindenre hasznalhato).
- a konvencioknak van ertelme, megpedig az, hogy egyszerubben megertik a kodod. Peldaul C++-ban irtozatosan feszes, kifejezo kodot lehet irni, ha aladucoltad a megfelelo infrastrukturaval (a template rendszerrel lenyegeben ugy csavarod a nyelvet, ahogy nem szegyelled). Viszont egy template-magiat egyszeruen lehetetlen normalis ido alatt visszafejteni (aki olvasott mar Alexandrescu-konyvet, az tudja, hogy nehany oldalnyi kodon orakat lehet merengeni, ami egyreszt elvezetes, masreszt uzleti kornyezetben eleg ritkan indokolt, hogy pl. valaki forditasi idoben rendezzen tipuslistakat). Ezert ha el akarsz terni a konvencioktol, akkor arra hozz igen jo indokokat (az, hogy neked jobban tetszik, az keves).
- a patternek vak alkalmazasanak az a vege, hogy marha jo interjukerdeseket fogsz tudni feltenni, ellenben sose leszel kesz :). Pl. ha epp visitor patternre lesz szukseged, akkor megcsinalhatod 'butan' (klasszikus visitor pattern) vagy 'szepen' (aciklikus visitor). Ha az utobbit nem tudod fejbol, viszont total biztos vagy benne, hogy csak harom kulonbozo vizitalando tipusod van es lesz, akkor felesleges azert egy orat uldogelni az objectmentor.com elott, hogy ne legyen cirkularis referencia a kododban (amit egyebkent ot perc alatt megirsz).
- elvaras, hogy egy programozo ismerje a patterneket es a technologiakat, de valojaban senki nem ismeri jol az osszeset (meg a fontosakat sem). Ezert minel jobban ragaszkodsz az alapveto dolgokhoz (elsosorban a nyelv alap frameworkjehez), annal egyszerubben atadhatod valakinek a kodod.
- Ne felj a sajat megoldasoktol, akkor sem, ha mar valaki ezt megcsinalta. Ugyebar van olyan antipattern, hogy 'not invented here', ami epp arra hivja fel a figyelmet, hogy elvezetbol/arroganciabol ne talald fel allandoan a kereket, ne irj ujra valamit, amit mar nalad okosabbak ezerszer megcsinaltak. Peldaul ne irj quicksortot Javaban, mert ugysem lesz jobb, mint a beepitett algoritmusok. Ez maximalisan igy van, azonban ha joval tobb ido lenne megtanulni a 3rd party megoldas hasznalatat, mint irni egy ujat, akkor esetleg celszeru csinalni egyet. Pelda: adatsorokat szeretnel rajzolni .Netben a kepernyore. Erre van ezer es egy 3rd party library, viszont nagyreszuk bonyolult, nehezkes, agyonkonfiguralhato es bugos. Ha te pontosan tudod, hogy mi az az use case, amit le szeretnel fedni, raadasul ebbol maga a vonalrajzolas egy minimalis feladat, es a problema nagyobbik resze az adatok megfelelo rendezese, szurese, satobbi (ami altalaban jellemzo pl. a realtime vizualizaciora), akkor siman lehet, hogy megeri irnod egy sajat grafikon-osztalyt, aminek az interfesze kenyelmesen illeszkedik ahhoz az adatforrashoz, ami neked rendelkezesre all.
- utolsokent: a vilag nem tokeletes, es nem programozok alkottak. Ergo siman lehet, hogy egy szingleton pontosan kifejezi azt, amit te le szeretnel programozni, mert a mogotte allo uzleti logika pontosan ennek felel meg. Persze az X konyv tiltja, ezert te inkabb nem hasznalod, szigoruan ragaszkodsz az OOP megkozeliteshez -- ennek az lesz a vege, hogy ugyanugy csinalsz egy szingletont, csak epp elrejted egy rakas OOP-katyvasz moge, es ha valaki leul a kod ele, akkor nem lesz trivialis, hogy egy szingletonrol van szo. Pl. javaban miert kell a main() fuggvenyt egy osztalyon belulre irni? Semmi valodi ertelme nincs.
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
Köszönöm a válaszokat, már kezdek tisztábban látni!
Ellenben újabb "problémával" szembesültem.
Adobe Air-re fejlesztek Flexben. Eléggé SQLite-ra támaszkodik a program, de szeretném viszonylag érthetőre/karbantarthatóra/egyszerűre venni a fejlesztői userlandet (alapvetően én fogom farigcsálni a kódot, de nem árt, ha áttekinthető). Namármost az, hogy közvetlenül hivogatok SQL-eket, ha kell valami, az nagyon nem frankó, úgyhogy csináltam egy-egy DAO-t, hogy azok kezeljék az adatbázissal kapcsolatos dolgokat. Mivel az nem járja, hogy összetett objektumokat dobogatok össze egy olyan layerben, aminek alapvetően csak az SQL elérés a feladata, ezért csináltam egy-egy DAL-t (Data Access Layer), hogy a DAO által visszaadott nyers adatokból összerakja nekem az összetett objektumot, így majd ezt hívogathatom a következő layeren, ami már majdnem a View-t szolgálja ki. Szóval én alapvetően a DAL-ban hívogatok meg különböző függvényeket, amiket az továbbít a DAO-nak, ami lefordítja selectekre, insertekre, stb.
Kérdés: tényleg kell ennyi layer? Értem és látom, hogy hogy egyszerűsödik maga az elérés (és a kód tisztasága) felsőbb szinteken ezáltal, de picit zavar, hogy 2-4 szinten is át és vissza kell jutnia az adatnak, mire megjeleníthető.
- A hozzászóláshoz be kell jelentkezni
Ez attól függ, mekkora a project, mennyire sűrűn változik a kód, akarod-e más adatbáziskezelőkkel használni stb. A jól rétegezett struktúra a későbbi változtatásokat könnyíti meg, de azért nem kell feltétlenül szentírásnak vennni. Te húzod meg a határt, hogy hány réteget készítesz, szerintem az MVC az alap, de hogy ezen belül, még DAO-t tovább bontod, modulalizálod, hogy pl. különféle adatbáziskezelőkkel is rugalmassan együtt tudj működni, az már a te döntésed. Ne a mának fejlessz, hanem goldolj előre, de csak 1-2 lépéssel, mert egyébként, túlbonyított lesz a kódod. Egy több 100 ezer vagy milliós kódbázist azért szokták rétegekre, és modulokra bontani, hogy kezelhető mértet kapjanak, rugalmas legyen, könnyen módosítható, és hogy tiszta legyen, ki mikor mit miért csinál. De azért az alapelvek ugyanazok, a nagy hiba szerintem a Patternekkel, hogy csak azt tanulják meg belőle az emberek, hogy hogyan kell implementálni, pedig a lényeg az hogy miért jött létre az a pattern, mik az előnyei, és hátrányai. Ugyanaz a a pattern lehet az egyik szituációban jó a másikban rossz.
Egyébként ajánlom figyelmedbe:
http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/013…
- A hozzászóláshoz be kell jelentkezni
A retegezett kod nagy hibaja hogy ahany reteg, annyi alakja ugyannanak, igen.
A szabaly az, hogy depend on interfaces, not on implementations.
Szoval ha van egy Person tipusu interfeszed, tokmindegy, hol pakolodik meg adattal pontosan, egeszen addig, amig a Person egy interfesz, annyit definial, hogy egy ilyen nevu dolognak ezek az adatai.
A nagy kerdes az az, hogy a rendszered mukodni is fog-e valaha is SQLite nelkul, pl. online eleressel. Ha igen, akkor jobb ha a bal kez nem tudja, mit csinal a jobb, o kapott egy ilyen person nevu valamit, es kesz.
Nyilvan nem az a huszoniksz pattern van a vilagon, csak probalj meg elovlasni egy PLOP-ot (egy kotet 3x olyan vastag mint a DP), de a Decorator pattern nagy baratod lehet az ilyenek kezeleseben, sot, ES3-ban es ES5-ben is van objektumiterator, ergo valszeg AS3-ban is lesz (mivel az ES4 alapu):
for (var propname in object){
if (propname in otherobject){
otherobject[propname] = object[propname]
}
}
Ja, es legyen egy jo napod, lass ilyet is: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
(Sajna a konyv mar beszerezhetetlen, de a felso 5 konyvreszlet eleg jo)
Ezen kivul erdemes a Refactoring-ot meg az Implementation Patterns-t is olvasgatni (a Domain-driven Design-t mar csak felve emlitem, abban UML-ek vannak, kod egy szal se, hat ez ma... :)
- A hozzászóláshoz be kell jelentkezni
Latom itt sokan beleestek az OOP vs SP kerdeskorbe.
Amit fontos tudni, hogy a jelenleg hasznalt OOP, szemben az idealisztikus Alan Kay-fele OOP-tol nem utodja a strukturalt programozasnak, hanem resze.
Igy fordulhat elo az, hogy igenis vannak olyan interfeszeink, amik tisztan adattagokbol, masok tisztan muveleti tagokbol allnak.
Azt gondolom, A Dahl-Dijskta-Hoare fele Strukturalt Programozas c. konyv (ami egyfelol a vallasi haboruk alapjait kepezte evtizedeken keresztul, masfelol a harmadik resz masodik feleben bevezeti az osztaly fogalmat, tulajdonkeppen a ma ismert es hasznalt formaban) eleg jol lefedi ezt.
Nem mendemondakat kell ismerni, meg mendemondakat ismero forumtarsakat kerdezni, hanem elolvasni azokat a forrasokat, amik miatt az egesz kiepul, aztan gondolkozni.
Pl. patternekrol leginkabb Christopher Alexander-t, Peter Gabriel-t es Jim Coplien-t kene olvasni, nem korbekerdezgetni...
A vilag kodjainak tulnyomo tobbsege valamilyen szempontbol hibas, tokeletes kod nincs, nyilvan lehet tulpatternezni, meg lehet alultervezni (az esetek 95%-aban az utobbi jellemzo). Ez van.
A kedves forumtarsak pedig ha nem mendemondakbol ismernek a patterneket meg az OOP-t, lehet hogy tobbet hasznalnak...
- A hozzászóláshoz be kell jelentkezni
Nem mintha ezen konyvek elolvasasatol automatikusan jo programozova valna barki is (bar forumozaskor mindig jol jon, ha sok ilyet ismer az ember); ellenben akadalyozhatjak egy csapat mukodeset azzal, hogy a konyvi elemeket probaljak erolteni egy olyan szituacioban, amikor a konkret uzleti problemat meg nem sikerult megerteniuk. :)
> A vilag kodjainak tulnyomo tobbsege valamilyen szempontbol hibas
Az a hibas kod, ami nem eredmenyezi az elvart eredmenyt (az eredmenyben a karbantarthatosag, stb. is belefoglaltatik termeszetesen).
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
Ez egy hibas gondolat hogy azok akik sokat tudnak azok ugyis csak eroltetik a tudasukat a valosagra, ezert erdemes muveletlennek maradni, mert azzal leszel jo programozo.
Ezzel a gondolkodassal lehet hogy el se ered az olvasottak szintjet nagysagrendekkel lemaradva, , es ami rosszabb, fel se fogod fogni, hogy a nyomaba nem ersz, mivel a teljes ismeretalapok hianyoznak ahhoz hogy megiteld.
Nyilvan en is lattam mar olyat aki elolvasott 3 konyvet a Spring-rol, megirta a Spring 4 PHP-t, es ugy gondolja ez jo (nem az, de nyilvan az altalanosabb konyvekbol kellene kiindulni).
Egy rendes konyv ervel. Minden konyvnek vannak toposzai, de az, hogy ez az erv all-e a te helyzetedben, neked kell tudnod megitelni.
Az XY technologia konyvei nem ervelnek, hanem bemutatjak, milyen cool is az XY technologia. Hasonloan a blogpostokra.
Ezert kell altalanos konyveket olvasni, mert azok egy fokkal fuggetlenebbek. Nyilvan mindenkinek megvan a vesszoparipaja, na de nem csak annak van meg, aki olvas, hanem annak is, aki nem...
A domain modellt pedig meg kell erteni, na de honnan tudod, mire kell figyelni a domain modell megerteseben?
- A hozzászóláshoz be kell jelentkezni
> Ez egy hibas gondolat hogy azok akik sokat tudnak azok ugyis csak eroltetik a tudasukat a valosagra, ezert erdemes muveletlennek maradni, mert azzal leszel jo programozo.
Persze hogy hibas, szerencsere ebben egyetertunk. :)
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
Ezt mar szeretem! Igazi parttalan vita alapertekekrol! Subscribe. :)))
- A hozzászóláshoz be kell jelentkezni
sub
- A hozzászóláshoz be kell jelentkezni
Globális változóra tényleg érdemes figyelni és szerintem kerülni is - az ördög sose alszik.
Nem nagy dolog, de épp ez miatt szívtam majd' egy órát, lua nyelven - awesome ablakkezelő, az egyik widget állandóan rossz értéket jelenítette meg, nem értettem, miért.
Nagy nehezen leesett számomra, hogy épp egy "globális változó"-szerű probléma okozta ezt, ui. mint akkor megértettem, lua esetében minden függvényben a nem local-lal bevezetett/elért változó mindig globális. Pl. az alábbi kód lefuttatása után talán meglepő módon, de 10 fog megjelenni (én legalábbis meglepődtem, mikor erre nagy nehezen rájöttem).
function test()
x=10
end
function test2()
x=12
test()
return x
end
print(test2())
A local szavakat az értékadások elé (az x elé) beírva a "várt" 12 fog az arcunkba ugrani.
Ebből persze egy másik tanulság: nem árt, ha tisztában van az ember a nyelv apróságaival is :)
- A hozzászóláshoz be kell jelentkezni