Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 16. leden 2009, 20:26:01 Předmět: Strategy In Strategy |
|
|
nevím jestli takový design pattern existuje, ten název mě napadl jen tak. kazdopadne mam nasledujici problem:
class Model
* hodnota Vertex[] poleVertexu
class StaticModel : Model
class DynamiModel : Model
class GraphicEngine
* metoda void VykresliVertex(int x, int y)
class OpenGL : GraphicEngine
class DirectX : GraphicEngine
je potřeba vykreslit List<Model> list modelu,
Statický model se vykresluje jinak nez dynamický model
(na tohle by se vyuzil klasicky strategy pattern s IDrawable metoda Draw(GraphicEngine g) a kazdy by mel jinou implementaci vykreslovani)
jenomze kazdy model se vykresluje i jinak v zavyslosti na pouzitem grafickem enginu, tzn dohromady existuji 4 ruzne "metody" ktere nejak vykresluji ruzne modely v ruznych enginech. vsechny ovsem berou hodnoty z poleVertexu (a nejak je transformuji na dva inty) a nejakym zpusobem je vykresluji prez VykresliVertex(x, y)
jde mi o to jestli se tohle da vyresit objektove (tzn bez nejaky IFu jako if this is staticmodel, nebo duplicity) kam dat jake metody, jak se maji jmenovat, jake maji mit parametry
(muj problem je veskutecnosti s jiným programem (takze mi prosim nerikejte at pouzivam jen directx ), ale se stejným problémem v architekture, proto me zajima jen jestli je takovyto design pattern v objektovem programovani vubec mozny (mam k dispozici C#)) |
|
Návrat nahoru |
|
|
Luke
Založen: 06. 08. 2007 Příspěvky: 20 Bydliště: Boleradice
|
Zaslal: 17. leden 2009, 09:58:30 Předmět: |
|
|
Pokud se nepletu a dobre jsem te pochopil, tak budes chtit asi neco takovyho:
Model bude mit virtualni metodu Draw(GraphicsEngine), kterou overridnes ve StaticModel a DynamicModel. Podobne GraphicsEngine bude mit virtualni metodu DrawElement (nebo cokoliv jineho), kterou zase overridnes v OpenGL a DirectX tridach.
Predpokladam ze ve StaticModel i DynamicModel budes volat DrawElement nezavisle na tom, jak moc se metody Draw navzajem lisi. A podle toho jaky graficky engine to prave je, tak podle toho se pouzije prave dana implementace metody DrawElement.
Pak kdyz budes vykreslovat list instanci tridy Model, tak se pouzije prave implementace StaticModel nebo DynamicModel podle toho, jak jsi ji vytvoril
kód: |
Model model = new DynamicModel();
Model model2 = new StaticModel();
model.Draw(g);
model2.Draw(g)
|
Je to objektove bez zadnych ifu, ale nevim jestli ti jde presne o toto. |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 17. leden 2009, 11:11:42 Předmět: |
|
|
Není na tohle náhodou určen vzor Most? _________________ Mám strach |
|
Návrat nahoru |
|
|
Luke
Založen: 06. 08. 2007 Příspěvky: 20 Bydliště: Boleradice
|
Zaslal: 17. leden 2009, 11:26:00 Předmět: |
|
|
Aha, je, sry, nejak jsem to prehlidl, kdyz jsem to tu podruhe cetl. Zapomel jsem na to. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 16:18:20 Předmět: |
|
|
jo ten bridge pattern je tomu asi nejbliz, diky
neco podobnyho me napadlo taky ale nechtel sem to tak delat kvuli te naprosto zbytecne radce v
StaticModel::Draw(Graphics graphics)
{
graphics.DrawStaticModel();
}
to stejny bude totiz v DynamicModel, a prakticky to jen "spojuje" ty tridy (proto mozna bridge ze )
nejlepsi by bylo kdyby slo neco jako
Model::Draw(Graphics graphics)
{
graphics.Draw(Model)
}
a tohle by se rozhodlo jestli zavola
Graphics::Draw(StaticModel model)
nebo
Graphics::Draw(DynamicModel model)
ale v C# nejak nefunguje polymorfismus metod (samozrejme vim ze to jde resit reflexi, ale to by nebylo tak viditelny co se vola)
a taky to ma tu nevýhodu ze je pak vykresleni vsech modelu nacpaný v jendé třídě, a v jednom souboru (i kdyz tohle jde taky resit prez partial classy ale to uz muze by trochu divny) |
|
Návrat nahoru |
|
|
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 17. leden 2009, 17:37:12 Předmět: |
|
|
Sosarian: Co presne myslis tim polymorfismem metod? Nejvic by mi pomohl nejspis nejaky priklad. Diky |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 17:49:24 Předmět: |
|
|
posila napsal: |
Sosarian: Co presne myslis tim polymorfismem metod? Nejvic by mi pomohl nejspis nejaky priklad. Diky |
no ze kdyz mam
kód: |
class GraphicEngine
{
void Draw(Model model); //tohle by bylo prazdny
void Draw(StaticModel staticModel);
void Draw(DynamicModel dynamicModel);
} |
a pak mam
kód: |
static void Main()
{
List<Model> models = new List<Model> { new StaticModel(), new DynamicModel() }
foreach (Model model in models)
{
graphicEngine.Draw(model);
}
}
|
tak ten radek graphicEngine.Draw(model); zavola vzdycky tu metodu ktera ma v podpisu argument typu Model, i prez to ze model.GetType() vraci uz tu specifickou implementaci modelu
u objektu to mas takhle
Object.ToString(Object this)
Int32.ToString(Int32 this)
a tam to funguje... (samozrejme by to chtelo nejaky dalsi klicovy slova treba virtual a override u parametru pri vic parametrech by bylo slozity jinak rozeznat co za metodu volat, rozhodne tomuhle patternu chyby nejaka konstrukce ktera by ho umoznila implementovat spravne)
Naposledy upravil Sosarian dne 17. leden 2009, 19:04:04, celkově upraveno 9 krát |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 17. leden 2009, 17:54:18 Předmět: |
|
|
Fuj, hnus. Tady ti nezbude nic jinýho, než použít přetypování.
Mimochodem, vykašli se na vzory, když netušíš, jak je použít, přitom všude po netu jsou hotové class diagramy, které to jasně ilustrují, jenom tam dosadit vlastní třídy. Samozřejmě je třeba nejdřív umět OOP, to samo poskytuje dostatečné prostředky pro rozumný objektový návrh a není potřeba vymýšlet blbosti jako polymorfismus metod. Pro OOP i vzory doporučuju přečíst knihu Design Patterns Explained, jsou 2 vydání - to první (z roku 1995 myslím) mi připadá systematičtější, to druhý (z roku 2004) je rozvláčnější, ale možná může být pro začátečníka stravitelnější. Dokud si tuto knihu (nebo ekvivalentní literaturu) nepřečteš, doporučil bych dát od vzorů ruce pryč, budou víc škodit než pomáhat (a jak vidím, už škodí). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 18:46:26 Předmět: |
|
|
2Eosie: nechapu co te vede k tomu ze bych snad neumel OOP nebo pouzivat navrhove vzory, nebo k tomu "Fuj, hnus." ale jestli mas lepsi navrh jak to napsat klidne me porad |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 17. leden 2009, 19:17:38 Předmět: |
|
|
Bridge nemá nic přemosťovat, ale jen oddělit od sebe abstrakci od implementace, díky čemuž se zabrání nekontrolovatelnému narustání počtu tříd a nabývání redundantního kódu. Nicméně každý ho dnes automaticky používá ve správných situacích bez toho, aniž by tušil, že se to tak jmenuje. Je to přirozené. Kdyby tento vzor nepoužil, znamenalo by to spíš, že neumí dobře OOP. Vzory beru spíš jako takovou pomůcku právě k výuce OOP a podle mě by neměly být použity způsobem "kterej vzor vyřeší můj problém jednou provždy?" V praxi si myslím, že už se ani moc neřeší, které vzory jsou v návrhu použity. Každej by si měl intuitivně bez vzorů zdůvodnit, proč je danej návrh zrovna vhodný pro ten a ten případ. Tolik k OOP a vzorům. Nevím, jak moc umíš OOP nebo co všechno si pod touto zkratkou představuješ, prostě mi to z těch příspěvku tak nějak vyplynulo.
Poradil bych ti, ale nechápu, o co se snažíš. Co je dynamický model? To je animovaný model? Všechny modely se přece v 3D API dají kreslit stejným způsobem. Pokud se u dynamického modelu mění vertexy, stačí před kreslením aktualizovat obsah vertex bufferu. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Ondras
Založen: 12. 09. 2007 Příspěvky: 66
|
Zaslal: 17. leden 2009, 19:24:03 Předmět: |
|
|
neni to takhle?
class StaticModel
{
draw();
}
class DynamicModel extends StaticModel
{
//prekryti
draw();
} |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 19:30:24 Předmět: |
|
|
rikal sem ze nejde o tenhle problem, ze je to jen priklad (jde mi skutecne jen o to jak to navrhnout)
ale jestli chces muzu napsat skutecnej problem
mam seznam msil opkodu (Nop, Call, Stdloc : OpCode), kazdej se do assembleru prepisuje jinak, a mam dve moznosti kterej asm vybrat (masm, nasm : Assembler)
tzn kdyz to prevedu na bridge pattern tak
Imlpementor - Assembler
Abstraction - OpCode
kdyz pak udelam neco jako
kód: |
class Nop : OpCode
void Assemble(Assembler asm)
{
asm.AssebmleNop();
}
class MASM : Assembler
void AssembleNop()
{
this.Write("nop"); //obsah teto metody se v MASM a NASM muze neuveritelne lišit
} |
je tu presne ten problem kterej sem psal nahore, v kazdym opkodu musim napsat podobnej radek
asm.AssembleJmenoInstrukce();
takze jak vidis problem se nezmenil, akorat sme to prenesli uplně mimo hry
(v soucastnosti to mam implementovany tak ze prevadim jen do MASM, takze na Nop : OpCode mam primo napsany asm.write("nop")) |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 17. leden 2009, 19:37:48 Předmět: |
|
|
Já tam žádnej problém nevidím. Tak se to prostě dělá. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 19:40:44 Předmět: |
|
|
Eosie napsal: |
Já tam žádnej problém nevidím. Tak se to prostě dělá. |
no ale jen kvuli tomuhle budu muset mit tridu pro kazdej opkod (zadny jiny metody nema) (i kdyz samozrejme muzu udelat nejakej delegat, ale to je zas moc zeslozitovani) |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 17. leden 2009, 19:54:21 Předmět: |
|
|
Hm... Asi bych to dělal bez objektů. Udělal bych si pole konstant, kde bych měl vždy ID instrukce očíslováno od nuly. Dále bych si udělal pole, kde indexem by bylo ID instrukce a v tom by byla funkce vyvolávající danou instrukci. Při interpretaci bych pak procházel seznam obsahující ID instrukcí a volal poleFunkci[idInstrukce](); (pseudokód)
Dále bych měl bokem funkce, co by mi toto pole vygenerovalo pro různý assemblery. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
|