Hledám návrhový vzor pro inteligentní registraci convertorů rubrika: Programování: Jiné

3 SebastianBusek
položil/-a 8.1.2015

Dobrý den,

mám generický interface IConvertable (s metodami Encode/Decode), vývojář tento interface implementuje a dostane konvertor pro daný typ TClass.
Teďka chci nějak inteligentně vyřešit to, aby vývojář nemusel přidávat svou implementaci do nějakého globálního Dictionary> (název typu + jeho konvertor), které by sdružovalo všechny konvertory.
Jde mi o to, že se nechci za půl roku dostat do situace, kdy 10minut budu psát konvertor a dalších 30 hledat, kde jej mám zaregistrovat...
Jsem si na 99% procent jistý, že na tohle existuje nějaký návrhový vzor, ale za boha si nemůžu vzpomenout/uvědomit, který to je.
Poradíte?

Díky a hezký den.

odkaz
9 Honza Břešťan
odpověděl/-a 8.1.2015

Tohle vypada na nejakou formu Convention over Configuration.

Reseni muze byt napr. kdyz se sklada dohromady objektovy strom, tak pomoci reflexe najit vsechny implementace IConvertable (ta podminka muze byt libovolna, muze jit treba i o format nazvu apod.) a zaregistrovat je automaticky. Vetsinou to predpoklada jeste moznost automaticky vytvaret instance - k tomu je potreba dalsi konvence, napr. ze vsechny implementace musi mit konkretni konstruktor, nebo statickou factory metodu nebo tak. Ty se pak daji testovat pomoci testu konvenci.

O tohle se umi docela dobre postarat i ruzne IoC kontejnery. Z nazvoslovi v otazce to vypada na C#, tam se mi osvedcil Castle Windsor. Na slozitejsi rucni registrace je strasne ukecany, ale na registrace podle konvenci ma out of the box peknou podporu.

Trochu problematicke pak muze byt, ze konkretni typy nejsou primo v kodu referencovane a muze se stat, ze kompletne chybi reference na knihovnu, kde ten IConvertable ma byt. Takovy projekt projde unit testy i buildem, ale bude mu chybet cast registraci. Vyssi uroven testu by ale mela tenhle pripad odchytit.

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.