240 likes | 366 Views
Chris Hance. Re-evolving Design Patterns. Where do patterns come from?. Canonical Answer Design Patterns: Elements of Reusable Object-Oriented Software, “Gang Of Four” Patterns of Enterprise Application Architecture (PoEAA), Martin Fowler Real Answer “Lots of people do it this way.”.
E N D
Chris Hance Re-evolving Design Patterns
Where do patterns come from? • Canonical Answer • Design Patterns: Elements of Reusable Object-Oriented Software, “Gang Of Four” • Patterns of Enterprise Application Architecture(PoEAA), Martin Fowler • Real Answer • “Lots of people do it this way.”
Lots of People are Wrong • Anti-pattern • Common practice that’s (usually) inefficient or incorrect. • Get used to “It Depends” • www.c2.com/cgi/wiki“Portland Pattern Repository's Wiki”
The Application • Record Student Arrivals / Departures • (Check In / Check Out) • Enforce rules on student custody, etc. • Integrate with a legacy VB6 system
Intent: Partial Rewrite • First stab at MVC/MVP/… • Isolate UI from Model • COM-compatible • Standardized Control behavior
Some (COM/VB6) Limitations • No constructor parameters • No overloading • Events "disappear" in interfaces
Attempt #1 UI UberDLL Controls "Controller" Form Model DAL DALStub How many DALs in one DLL?
Attempt #2 DAL DAL UI UberDLL Circular Dependency Controls "Controller" Form Model IDAL DALStub DALStub New Rule: Model doesn't talk to the DAL.
Attempt #3 UI Factory Model DAL(Stub) Controls "Controller" Form Factory Model IDAL DAL(Stub) Next: Add Interfaces.
Attempt #4: With Interfaces Interfaces UI Factory Model DAL(Stub) ModelInterface DTOInterface FactoryInterface DALInterface Controls "Controller" Form Factory Model DTO DAL(Stub)
Still Awake? Figure 17. Obligatory Useless Diagram
Low Coupling!What is it good for? • Reusable Code? • Manageable Code • Won't somebody think of the maintenance programmers?
Back to the Application Concepts • Check-In/Check-Out • Student • Contact • School • Teacher • User
Multiple Factories CheckInOutInterfaces CheckInOutModel CheckInOutFactory CheckInOutDAL ContactInterfaces ContactModel ContactFactory ContactDAL UI Controls "Controller" Form Separate the concepts for maintenance programmer sanity, and some reusability. Do I need School, Teacher, Student, etc?
Tour the Model That means open Visual Studio. Yes, now.
So About the UI • MVC • MVP (“retired” per Fowler) • Passive View • Supervising Controller • MVVM • Presentation Model
Supervising Controller Figure π¾. Supervising Controller Sequence Diagram http://martinfowler.com/eaaDev/SupervisingPresenter.html
View ViewStub ViewInterfaces Controller Form Control(s) FormStub ControlStub(s) IForm IControl(s) Controller How to test the Controller? Pick a View at Runtime Pick a View at Runtime
IControl(s)? • Yes, define ITextbox, ICheckbox, ad nauseam. • Need control wrappers that implement ITextbox, etc. = Adapter pattern. • Also useful for standardized control behavior. = Decorator pattern.
And a concession to VB6 • VB6 can’t define events in interfaces • Events only work withDim WithEvents txt As Textbox • They don’t fire forDim WithEvents itxt As ITextbox
Alternate Event System • WeakReference to objects • String event / method name • Marshal.IsComObject() • TypeLibInfo .InvokeSub() for COM objects • MemberInfo.Invoke() for CLR objects • Parameters are ugly.
Tour the UI Or what I have of it. (Work in Progress) We can always fall back to VB6 sample code.
View ViewInterfaces Controller Form Control(s) IForm IControl(s) Controller The Whole… Thing Well, the Event library is omitted. CheckInOutInterfaces CheckInOutModel CheckInOutFactory CheckInOutDAL ContactInterfaces ContactModel ContactFactory ContactDAL
TODO • Replace custom DAL with NHibernate or similar (in lieu of manual caching). • Templates or other codegen for UI repetitiveness. • ObservableCollection?