|
[ virtualVoid @ 26.08.2010. 15:44 ] @
| Povod ovom pitanju su natjecaji u kojima veoma cesto stoji da prilikom aplikacije posaljete i svoj kod da bi oni vidjeli:
- stil kodiranja
- n-tier arhitekturu
- OOP i korištenje design patterna
Za ovo im je dovoljan mali programcic, par klasa.
Kako code treba izgledati da bi bio valjan prema ovim kriterijima? Ima li neko vremena da malo ovo pojasni ili da me uputi na neki dobar clanak koji ovo pojasnjava. U googleu sam vec trazio clanke tipa good ili better programming, better coding, i slicno, ali nisu mi bas odgovorili na moje pitanje.
Da jos napomenem da se ovi zahtjevi najcesce javljaju u natjecajima za web programere (asp.net, mvc,...) |
[ Dejan Carić @ 26.08.2010. 20:23 ] @
Stil kodiranja:
- http://www.dotnetspider.com/tutorials/bestpractices.aspx
- Upotreba nekih alata tipa Resharper
- Neka knjiga za refaktorisanje tipa - Refactoring: Improving the Design of Existing Code
N-tier arhitektura
- Pogledati neko od Apress-ovih izdanja tipa Pro ASP.NET MVC 2 Framework
- Neka knjiga za Domain Driven Design
- Što više knjiga, to bolje...
OOP i korišćenje design pattern-a:
- Za početak Gang Of Four Design Patterns
Prati blogove:
http://haacked.com/
http://weblogs.asp.net/scottgu/
http://codebetter.com/blogs/
...
[ mmix @ 26.08.2010. 20:50 ] @
MVC nije n-tier arhitektura
[ Dejan Carić @ 26.08.2010. 21:08 ] @
@mmix
Možda ti da predložiš neku knjigu za n-tier u kombinaciji sa MVC-om? :)
[ mmix @ 26.08.2010. 21:17 ] @
Pa nemoguce je jer su competing arhitekture, mozes da izvuces domain model u tiere ali na kraju ces uvek imati trougao izmedju delova MVC-a a to je u suprotnosti sa linearnoscu n-tier arhitekture.
[ Dejan Carić @ 26.08.2010. 22:03 ] @
Rizikovaću da ispadnem glup u društvu, ali ipak moram da pitam za pojašnjenje jer ne vidim taj trougao :)
Ako sve razdvojimo po slojevima kako si napisao, kako to onda View direktno komunicira sa tamo nekim data access layer-om ili kako taj DAL direktno komunicira sa View-om?
[ Shadowed @ 27.08.2010. 00:04 ] @
Citat: Though MVC comes in different flavors, control flow is generally as follows:
1. The user interacts with the user interface in some way (for example, presses a mouse button).
2. The controller handles the input event from the user interface, often via a registered handler or callback and converts the event into appropriate user action, understandable for the model.
3. The controller notifies the model of the user action, possibly resulting in a change in the model's state. (For example, the controller updates the user's shopping cart.)[6]
4. A view queries the model in order to generate an appropriate user interface (for example, the view lists the shopping cart's contents). The view gets its own data from the model. In some implementations, the controller may issue a general instruction to the view to render itself. In others, the view is automatically notified by the model of changes in state (Observer) which require a screen update.
5. The user interface waits for further user interactions, which restarts the cycle.
http://en.wikipedia.org/wiki/Model-view-controller
[ Dejan Carić @ 27.08.2010. 08:25 ] @
Citat: 4. A view queries the model in order to generate an appropriate user interface (for example, the view lists the shopping cart's contents)
Model nam je neki POCO/DTO, jel tako? Kada autor kaže, queries the model verovatno misli na foreach petlju kojom dohvata sve child objekte datog parent-a koji mu je prosleđen preko konstruktora ili nekog property-ja ( ViewData). Sam View ne instancira nove objekte tako što ih učitava iz nekog repozitorijuma ili pozivajući neki factory metod, niti čuva njihovo stanje u bazi.
Mene su učili da je n-layer arhitektura kada su neke celine logički odvojene, a n-tier kada su te celine fizički odvojene. Sada ispada da prezentacioni sloj ne sme da zna za POCO/DTO. Pa sa kakvim onda informacijama barata? Kako bi trebala da izgleda ta n-tier arhitektura desktop aplikacije?
Otvori se nova forma, korisnik kupi novi proizvod, zatvori se ta forma i prikaže nova koja predstavlja korpu svih kupljenih proizvoda na kojoj su dinamički učitani svi dugmići, tekstualna polja, itd.
Na osnovu čega se vrši dinamičko kreiranje forme?
[ Dejan Carić @ 27.08.2010. 08:49 ] @
Evo i jednog zanimljivog članka ali za php:
Citat:
General principle that we must consider if want to build N-tier application:
• Every layer must be independent physically. It doesn't mean every layer have to exist in separated computer. But, every layer can be distributed every where (separated computer or not).
• Each layer must transfer information only to/from previous/next layer.
• You can change technology used in every layer without change entire system. Example, - you want to change database layer- from mySql to PostgreSQL.
Following sample architecture design use 5-tier:
• Presentation GUI, do parse HTML, XHTML, WML.
• Presentation Logic do rendering process HTML, XHTML to send using HTTP to browser. It accepts data from business logic and tie to HTML. This process run at php at web server.
• Business Logic, manipulate and transform data. Simple, task of this layer is fetch data from data access tier and prepare before send to presentation logic. This process run at server that utilize XML.
• Data access tier have task to connect and retrieve data from database.
• Data tier is aplication database such as mySQL, PostGreSQL, and others.
U ASP.NET MVC:
1. Presentation GUI - isti
2. Presentation Logic - View
3. Business Logic - Controller, a dodatno može imati više slojeva
4. Data Access tier - repozitorijum
5. Data tier - MS SQL, mySQL, itd.
[ mmix @ 27.08.2010. 08:55 ] @
To su te dobro naucili oko tiera i layera ali to nema veze sa ovom pricom. Postoji konceptualna razlika, u nlayer/tier modelu nema preskakanja layer/tiera, ono sto ti zoves POCO objektom iz domain modela je BL (logical) objekat u n-tier modelu, data layer barata native data objektima (nrp sqlreader) i presentation layer nikad ni pod kojim uslovima ne komunicira direktno sa data layerom, cak i ako BL samo propusta podatke bez ikakve akcije nema preskakanja, taj proxy ti posle sluzi kao tacka u kojoj mozes dodati neku logiku kasnije. Ono sto se desilo je da su MVC fanovi spakovali i pojednostavili n-layer model u domain modeling i ucinili ga transparentnim za tebe, presentation layer razvukli u tri komponente. Ono sto ti vidis kao domain je u stvari nekadasnji interfejs iz business layera.
3. Business Logic - Controller, a dodatno može imati više slojev
klasicna greska. Controler NIJE zamena za business layer, izgleda primamljivo i ljudi trpaju gluposti tamo ali controller nije mesto gde se smesta ta logika.
[ Dejan Carić @ 27.08.2010. 09:39 ] @
Citat: mmix:
Postoji konceptualna razlika, u nlayer/tier modelu nema preskakanja layer/tiera
Izvini ali stvarno ne vidim gde je tu preskakanje layer-a.
Citat: mmix:
ono sto ti zoves POCO objektom iz domain modela je BL (logical) objekat u n-tier modelu
Aj da izbacimo POCO, neka koristimo samo DTO koji nema behavior, već samo state.
Da ga ne mešamo sa business logic layer-om.
Citat: mmix:
presentation layer nikad ni pod kojim uslovima ne komunicira direktno sa data layerom
Naravno da ne komunicira. Ne vidim nikakvu direktnu komunikaciju u onom primeru.
Citat: mmix:
3. Business Logic - Controller, a dodatno može imati više slojev
klasicna greska. Controler NIJE zamena za business layer, izgleda primamljivo i ljudi trpaju gluposti tamo ali controller nije mesto gde se smesta ta logika.
Naravno da Controller ne bi trebalo da bude mesto gde ćeš smestiti svu biznis logiku ( fat controller), ali takođe smatram da ne trebam da napišem čitavu knjigu da mi ne bi tražio dlaku u jajetu :)
Napravi se service layer (po DDD) iliti application layer (mislim da se tako zove po n-tieru), a onda taj Controller dođe više kao neki proxy.
Ukoliko neko pak odluči da kompletnu logiku stavi u Controller, taj Controller mu nije ništa drugo nego business logic layer i opet nema direktne komunikacije između presentation layer-a i data layer-a.
Ne znam, možda još uvek ne vidim nešto dobro, ali... ispunjena su tri uslova:
1) slojevi su logički odvojeni
2) mogu i fizički da se odvoje
3) komunikacija se vrši samo između susednih slojeva
Po meni, MVC može super da se uklopi u tu n-tier priču.
[ mmix @ 27.08.2010. 09:58 ] @
E jbg, ne znam kako da ti dalje pojednostavim, imas sendvic sa sunkom i kad stavis sunku izmedju dva parceta hleba hlebovi se ne dodiruju, jedan cak ni ne zna da drugi postoji. Model, View i Controller svi znaju jedan za drugi, da je View takav da nikad ne poziva model direktno vec da koristi model KROZ controller onda bi bio layered/tiered (ali onda bi ceo MVC bio bezvredan i observer patern bio bio prakticno nemoguc). To je sve sto je vazno za ovu pricu, ne znam sta te toliko zbunjuje? Kao sto sam rekao ti mozes model da razvuces u tiere/layere ali sam MVC NIJE layered/tiered arhitektura.
Valjda povlacis neke paralele koja ne stoje?
Citat: 3) komunikacija se vrši samo između susednih slojeva
Bice da te mozda ovo zbunjuje. To je potreban ali ne i dovoljan uslov, pored ovoga potrebno je da dva layera koja komuniciraju kroz treci (ili lanac trecih) NEMAJU direktnu komunikaciju. Potpuna i kompletna separacija.
[ Dejan Carić @ 27.08.2010. 10:29 ] @
Citat: mmix:
E jbg, ne znam kako da ti dalje pojednostavim, imas sendvic sa sunkom i kad stavis sunku izmedju dva parceta hleba hlebovi se ne dodiruju, jedan cak ni ne zna da drugi postoji. Model, View i Controller svi znaju jedan za drugi, da je View takav da nikad ne poziva model direktno vec da koristi model KROZ controller onda bi bio layered/tiered
Pa u onoj knjizi, model ne zna ni za šunku, a kamoli za drugo parče hleba :)
I da, sva komunikacija ide KROZ Controller i to je layered / tiered što tvrdim svo vreme.
Citat: mmix:
(ali onda bi ceo MVC bio bezvredan i observer patern bio bio prakticno nemoguc).
Kakav observer pattern? HTML je stateless. Čim se renderuje View, model više nije u memoriji.
Citat: mmix:
MVC NIJE layered/tiered arhitektura.
MVC je samo jedan od bezbroj pattern-a, a ti aplikaciju možeš da raslojiš/projektuješ kako hoćeš.
Citat: mmix:
Bice da te mozda ovo zbunjuje. To je potreban ali ne i dovoljan uslov, pored ovoga potrebno je da dva layera koja komuniciraju kroz treci (ili lanac trecih) NEMAJU direktnu komunikaciju. Potpuna i kompletna separacija.
Pa to i jeste problem. Ako je meni model poseban assembly, koji nema nikakvu predstavu o View-u (referencu, interfejs, bilo šta...), kako on može direktno da komunicira sa View-om? Nikako. Samo preko kontrolera. Šta više, model kao takav mogu da koristim bilo u desktop, bilo u web aplikacijama.
[ mmix @ 27.08.2010. 10:38 ] @
E, ok, u pravu si. Previse sam zauzet za prazne price, veruj sta zelis, ja sam rekao sta sam imao da kazem.
[ Valerij Zajcev @ 27.08.2010. 12:34 ] @
Citat:
Pa to i jeste problem. Ako je meni model poseban assembly, koji nema nikakvu predstavu o View-u (referencu, interfejs, bilo šta...), kako on može direktno da komunicira sa View-om? Nikako. Samo preko kontrolera. Šta više, model kao takav mogu da koristim bilo u desktop, bilo u web aplikacijama.
N-tier - aplikacija je razdeljena u slojeve, komunikacija medju slojevima ide top-down-bottom-up.
1) View zove BL
2) BL zove DAL
3) DAL vraca nesto BL-u
4) BL vraca nesto VIEW-u
MVC pristup je drugaciji
1) VIEW zavisi od MODEL-a ili od CONTROLLER-a
2) Ako se neki podatak promeni u modelu to ce da se odrazi na VIEW
3) Vise VIEW-a moze da bude vezano za jedan MODEL
...
Dakle ova dva nacina se dosta razlikuju.
Radio sam na projekatu gde je bila n-tier aplikacija apli je je GUI odradjen kao MVC. Sto je krivicno delo silovanja programera koji to mroa da cita :)
[ Sapphire @ 27.08.2010. 13:08 ] @
Bez namjere da direktno nekoga razuvjeravam na ovoj temi, samo ću reći da ljudi konstantno shvataju MVC kao nešto drugo osim presenter pattern-a. To što je u pitanju neka jednostavna aplikacija, pa izgleda logično da je model u isto vrijeme i domain projekta i DAL (preko najčešće Active Record pattern-a).
Citat: Valerij Zajcev:
Radio sam na projekatu gde je bila n-tier aplikacija apli je je GUI odradjen kao MVC. Sto je krivicno delo silovanja programera koji to mroa da cita :)
Ako je time postignut anti-pattern, tako što u aplikaciji nije bilo potrebe za tim - onda je to pogreška arhitekte; ali u mome mišljenju bilo šta srednje i više komplikovano ima ogromne benificije ako se uradi kao neka MVC varijacija (zavisno od tehnologije u upotrebi). Čak i za najjednostavnije stvari meni je logično da pravim Mediator i Strategy objekte, te generičke forme sa form generatorima.
Što se MVC-a tiče, ne vidim zašto bi to bilo teško za čitanje - osim nekome ko ne shvata ni svrhu pattern-a?
[ Valerij Zajcev @ 27.08.2010. 16:19 ] @
Citat:
Citat:
Valerij Zajcev:
Radio sam na projekatu gde je bila n-tier aplikacija apli je je GUI odradjen kao MVC. Sto je krivicno delo silovanja programera koji to mroa da cita :)
Ako je time postignut anti-pattern, tako što u aplikaciji nije bilo potrebe za tim - onda je to pogreška arhitekte; ali u mome mišljenju bilo šta srednje i više komplikovano ima ogromne benificije ako se uradi kao neka MVC varijacija (zavisno od tehnologije u upotrebi). Čak i za najjednostavnije stvari meni je logično da pravim Mediator i Strategy objekte, te generičke forme sa form generatorima.
Što se MVC-a tiče, ne vidim zašto bi to bilo teško za čitanje - osim nekome ko ne shvata ni svrhu pattern-a?
Situacija je bila takva da je to samo dodatno zakomplikovalo projekat. Nije bilo potrebe da se GUI deo radi na takav nacin. Plus se nije znalo ko gde cuva stanje aplikacije... ukratko cela postavka je bila lose organizovana s obzirom koliko je mala bila.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|