Saturday, April 21, 2007

hammet apie Domain Driven Design Castle

Užvakar hammet rašė įdomų straipsnį apie Domain Driven Design ir Castle.

Rekomenduoju paskaityti.
hammet ir Domain Driven Design

Wednesday, April 4, 2007

Kolekcijos su event'ais

Bandau implementuoti UndoHistoryRepository ir susidūriau su tokia problema, kad UndoHistoryRepository turi žinoti, kada nauji objektai yra sukuriami, ir kada pašalinami.

Microsofto System.Collections namespace'e jokių kolekcijų su eventais neradau, tad leidausi į kelionę ieškoti. Rezultatai tokie:

* PowerCollections - Wintellect kompanijos(?) gaminama biblioteka. Kiek tikrinau, visos nuorodos į biblioteką yra mirusios. Be to, biblioteka neduoda reikiamo dalyko.

* IESI.Collections - JasonSmith'o kolekcija. IESI pagrindins tikslas yra ISet (aibės) kolekcijos realizavimas. Vėlgi, eventai nerealizuoti, tačiau IESI.collections yra gana žinomas dalykas, paplitęs per NHibernate projektą


* OpenDocument4All - Lars Behrmann'o parašyta OpenDocument generavimo biblioteka. Nors tai nėra kolekcijų biblioteka, bet jos viduje yra naudojamos kolekcijos su event'ais. Kodas nėra gražus, standartizuotas, ir tuo labiau tinkamas naudoti kituose projektuose.

* C5 biblioteka - Niels Kokholm ir Peter Sestoft parašyta biblioteka, Kopenhagos universitetas. C5 is a library of generic collection classes for C# and other CLI languages and works with Microsoft .Net version 2.0 and Mono version 1.1.16 and later.

Taip pat ši biblioteka turi neblogą (258 puslapių) manual'ą, kurio 8.8 skyryje parašyta : "Events: observing changes to a collection".

Būtent to mums ir reikia.

Monday, April 2, 2007

Undo / Redo galimybės programoje

Šiuo metu kuriame paprastą biuro programą.

Reikia sukurti tokius langus: mokymo dalyko langą, ir mokymo pamokų langą.
Be visų duomenų įvedimo laukų, langas turi turėti mygtukus išsaugoti ir uždaryti. Jei paspaudžiamas mygtukas išsaugoti, tai visi esami pakeitimai išsaugomi. Jei paspaudžiamas uždaryti, tai neišsaugoti pakeitimai turi būti atmesti ir langas uždarytas. Išsaugoti pakeitimai turi likti nepakitę.

Registruojant arba redaguojant mokymo pamokas, visi pakeitimai paspaudus mygtuką "išsaugoti" turi būti išsaugoti tik atmintyje. Į duomenų bazę pakeitimai siunčiami tuomet, kai saugomas pats dalykas.


Taigi, klausimas (labai jau daug išsiplėčiau apie probleminę sritį):
Kaip galima kokybiškai realizuoti Undo mechanizmą?


Ieškojau porą dienų sprendimo. Kol kas atsakymas matau yra toks: Memento design pattern'as.

Gerą pavyzdį radau čia:
Generic undo redo

Autorius siūlo tokį sprendimį: "an object that is capable of restoring a target object to one of its previous states".

Pavyzdys su c# būtų toks:

interface IMemento
{
///
/// Restores target to the state memorized by this memento.
///

///
/// A memento of the state before restoring
///

IMemento Restore(T target);
}



Sprendimas su Memento būtų turėti kiekvienam veiksmui atstatymo veiksmą. Atstatymo sprendimai gali būti dviejų rūšių -
1 - Atsatyti objektą darant jo deep-copy, ir vėliau originalą pakeičiant kopija
2 - Kiekvienam objekto keitimo veiksmui generuoti anti-veiksmą, t.y. veiksmą, atsatantį objektą į buvusią būseną. Tokių veiksmų būtų dvi rūšys - properčių atstatymas, ir ryšių atstatymas (objekto kūrimo ir šalinimo atveju).

Aš labiau linkstu prie antrojo varianto. Daryti objekto deep-copy gali sukelti daug problemų dėl ryšių. Atsatant objektus naudojant anti-veiksmus, viskas vyktų atvirkštine tvarka, negu tuomet, kai objektas buvo keičiamas.

Šiandieną bandysim implementuoti tokį sprendimą, žiūrėsim, kas gausis