Tervezési minták - a gyakorlatban, mintakód

Sziasztok!

Jobb kategóriát nem találtam, mert igazából C++/Java nyelven érdekelne a következő.

1-2 éve megvásároltam a "Gamma" könyvet, akkor el is olvastam, azonban sokat nem hasznosítottam a belőle szerzett "tudásból". A vizsgaidőszakban ismét elővettem, mivel a diplomamunkámban "felfedeztem" hasonlóságokat bizonyos mintákkal... :D

Minden szép és jó, csak olyasmi érdekelne engem, hogy neten fellelhető-e a mintákat bemutató _működő_ egyszerű példaalkalmazások gyűjteménye, akár Java, akár C++ nyelven?

Amik a könyvben vannak Maze, Lexi, stb. azok valahogy nem az igaziak számomra...

Illetve, flame és egyéb offtopic megjegyzésektől mentesen, írhatnátok arról, hogy saját munkátokban mennyire "jön elő" az ilyen minták alkalmazása, mennyire követelik meg a használatukat/ismeretüket, mind a tervezés mind a megvalósítás fázisaiban, illetve mely mintákat "alkalmazzátok a leggyakrabban".

Köszönöm szépen!

Hozzászólások

java / C# - ehhez könyvben lévőt tudok mondani, és ezek tényleg jók:

Martin Fowler: Patterns Of Enterprise Application Architecture

Ez alapján elkezdtem írni egy portálszerűséget, végül nem egészen az lett belőle, viszont ki tudtam próbálni a mintákat, itt-ott át is írtam, mert úgy tűnt, nem mindig az az ideális megoldás, ami abban a könyvben van (bár csak pár sor az eltérés).

úgy tűnt, nem mindig az az ideális megoldás, ami abban a könyvben van (bár csak pár sor az eltérés)

ez nem véletlen :)) sőt, rengetegszer sokkal egyszerűbb nem használni design pattern-t, mert egyszerűen egy forciklus sokkal triviálisabb mint iterálni. a túlerőltetés nagyon hamar bloated kódot eredményez.

Sajnos Java-s vagy C++-os oldalt nem, de C#-os siteot tudok ajánlani.

A minták meg per definitionem se valamiféle ultimate megoldások az élet minden gondjára. Inkább "best practice"-ek, iránymutatók, hogy bizonyos gyakran felmerülő problémákat hogy lehet érdemes megoldani. Ha a management dönt titkos szavazáson, hogy milyen patternt kell betűhíven használnod, akkor onnan menekülj! :) Akkor használod őket jól, ha magadtól is valami hasonló megoldást találnál ki. Ilyenkor persze nagy segítség, ha meg tudod nézni, hogy mások hogy csinálnák-csinálják, hogy felhívják a figyelmedet az esetleges buktatókra, korlátokra, stb.
Ezen kívül a fejleszők közti kommunikációt is nagyon megkönnyíti, ha nem kell mindig hosszasan körülírni, hogy miről is van szó, elég ha annyit mondasz: "ez csak egy proxy osztály", és máris mindenki tudja miről beszélsz.

Ezek elég gyakoriak: iterator, singleton, command, visitor, wrapper

Ha egy bizonyos patternhez keresel példát, akkor wikipedián megtalálod ('<pattern_neve> pattern' -re keresve).

Ja, singleton elég népszerű, mivel ez a globális változó modern változata. Nagyon hatékonyan lehet vele áttekinthetetlen kódot írni, amihez unit-teszteket se lehet készíteni.

Amúgy komlyabb tapasztalat nélkül szerintem nem érdemes ezeket a mintákat használni, mert olyan lesz, mintha pl. aranyórákat használna az ember nehezéknek. Azaz a gyakorlatlanabb programozók iszonyú elbonyolított osztályhalmazokat képesek létrehozni egy 8-soros for-ciklus helyett is.

gyakorlatlanabb programozóknak nincsen szükségük ilyen segítségere, hogy rossz kódot írjanak :) ellenben a jó kódhoz kaphatnak ötleteket.
singleton használatának totális mellőzésével tökéletesen elbonyolított osztályhalmazokat lehet létrehozni :P
egyszerűen mindennek tudni kell a helyét.

Egy csomó "Gammás" design pattern tökéletesen megérthető a Kerievsky-féle Refactoring to Patterns könyvből. Ezen kívül a Fowlerék által írt Refactoring könyv is jó, ez talán még érthetőbb első olvasásra.

Való életből vett példákat hoznak (uml + forráskód), amin bemutatják hogy alakul egy nem túl szép kód system of patterns-é.

A "Gammás" könyv remek referencia, de nem ajánlanám nyugodt szívvel a tervezési mintákkal ismerkedőknek -annak ellenére hogy mindenhol de facto standard-ként kezelik. A fenti két könyv után már szórakoztató olvasmány :)

Meg tudná valaki mondani, pontosan mi ez a "Gamma" könyv?

Pl egy egyszerű tervezési minta a c# using kulcsszava által definiált:
using(Closeable a=new CloseableImplementation())
{
doYourJobWith(a);
}
Javában így lehet megírni, de nincs garancia, hogy nem felejted el a finally blokkot:
Closeable a=new CloseableImplementation();
try
{
doYourJobWith(a);
}finally
{
a.close();
}
A using kulcsszót nagyon hiányolom Javában.
A c#-os using-hoz hasonló "kikényszerített" lezárást csináló mintát egyszer megcsináltam Javában(ott csak erős workaroundokkal lehet megoldani) és azóta sem tudom eldönteni, hogy ez már bloatware volt-e?

Az biztos, hogy semmiféle leak nem volt a programban :-).