Sunday, November 25, 2012

GUI (wpf/swing..) design is more OO

Background: "non-GUI" can mean anything -- including but not limited to web, database-centric, MOM, workflow, number-crunching, data transfer/transformation gateway, market-data-driven ... To avoid over-generalization and to provide some concrete focus, I'd say let's look at telecom/business systems. This blog post is about my general observation that GUI systems are "more inherently" object-oriented.

But why bother? Well, if anyone is learning any OO design pattern, the best example is often found in GUI space. GUI architects use more OO design principles than in non-GUI. A serious GUI OO design should. If you want to improve on an OO design for a GUI app, or if you start from scratch, use OO design patterns liberally.

Here are my observations as to why GUI design is more inherently object-oriented --

#1) main characters -- there are relatively few objects as Models, ViewModels, Views, timers, singleton collections... Mostly stateful, singleton domain entities. OO design pattern is most useful in such a context.
** transient objects ---- In most non-GUI systems most objects are transient (as revealed by a profiler). In GUI, quite a few objects -- not just the jcomponents, listeners and events -- have well-defined life cycles from creation to destruction. Can you say the same about non-GUI apps? In non-GUI, there are rather few long-living domain objects.
** Domain objects ---- (More than in non-GUI apps) majority of classes in a GUI system including the main characters and numerous non-visual objects map nicely into domain objects. This is a boon to OO designers, with profound consequences. OO analysis is more worthwhile, more natural and more justified.
** ownership - in GUI an object is often "owned" by another in a strict sense. Given the "main characters", ownership is often well-defined.
** complex interaction - there's more inter-object cooperation and interaction in GUI systems. In some methods, you easily identify some of the "main characters".

- necessity ---- In many non-GUI projects, sometimes you can make do without OO. OO is more necessary (and natural) to GUI projects. I think GUI developers often grow into serious OO designers.
- state -- visual components (often singletons) are first-class objects in the purest sense. Each visual object needs a supporting cast of other objects such as the Model or ViewModel objects. They all have a large number of well-defined states (properties).
- modular ---- OO is at its best if you need to divide up a big project into modules each for a different developer. Large GUI projects often have natural demarcations and well-defined modular interfaces. Non-GUI large OO projects have a few clear demarcations + many more unclear demarcations.
- Reusable component ---- GUI system can use/create many reusable components. Plug-n-play.
** EJB were hyped as shrink-wrapped commercial components but I don't think they are. GUI components are the best example of commercial reusable OO components.

- actors ---- are more prevalent in GUI Entity-Relation design. GUI OO design includes a real "actor", and long-living domain objects associated with the actors. Other OO designs seldom have one. Web site is a different story -- the domain objects related to a "session" are often short-lived.
- asynchronous, message driven ---- such systems are more amicable to OO modelling, partly because each sender/receive maintains its own state.
- Sequence diagram ---- useful to event-driven GUI.
- STA ---- A fundamental reason why GUI systems use "Single-Threaded Apartments" is the long-living domain objects. Need to protect their "consistency"
- Encapsulation ---- (and Object State) Most important GUI objects have well-defined, often with standardized stateful fields. Not so in non-GUI.
- abstract interfaces ---- many classes must support the same "interface". We often need to treat the a bunch of Types the same way. This calls for interfaces.
- Inheritance
- Design patterns ---- map nicely to GUI OO, more nicely than non-GUI OO. See http://bigblog.tanbin.com/2011/01/swing-1-primary-design-pattern.html for a list of design patterns in Swing

No comments:

Total Pageviews

my favorite topics (labels)

_fuxi (302) _misLabel (13) _orig? (3) _rm (2) _vague (2) clarified (58) cpp (39) cpp_const (22) cpp_real (76) cpp/java/c# (101) cppBig4 (54) cppSmartPtr (35) cppSTL (33) cppSTL_itr (27) cppSTL_real (26) cppTemplate (28) creditMkt (14) db (65) db_sybase (43) deepUnder (31) dotnet (20) ECN (27) econ/bank` (36) fin/sys_misc (43) finGreek (34) finReal (45) finRisk (30) finTechDesign (46) finTechMisc (32) finVol (66) FixedIncom (28) fMath (7) fMathOption (33) fMathStoch (67) forex (39) gr8IV_Q (46) GTD_skill (15) GUI_event (30) inMemDB (42) intuit_math (41) intuitFinance (57) javaMisc (68) javaServerSide (13) lambda/delegate (22) marketData (28) math (10) mathStat (55) memIssue (8) memMgmt (66) metaProgram` (6) OO_Design (84) original_content (749) polymorphic/vptr (40) productive (21) ptr/ref (48) py (28) reflect (8) script`/unix (82) socket/stream (39) subquery/join (30) subvert (13) swing/wpf (9) sysProgram` (16) thread (164) thread_CAS (15) thread_cpp (28) Thread* (22) timeSaver (80) transactional (23) tune (24) tuneDB (40) tuneLatency (30) z_ajax (9) z_algoDataStruct (41) z_arch (26) z_arch_job (27) z_automateTest (17) z_autoTrad` (19) z_bestPractice (39) z_bold (83) z_bondMath (35) z_book (18) z_boost (19) z_byRef^Val (32) z_c#GUI (43) z_c#misc (80) z_cast/convert (28) z_container (67) z_cStr/arr (39) z_Favorite* (8) z_FIX (15) z_forex (48) z_fwd_Deal (18) z_gz=job (33) z_gzBig20 (13) z_gzMgr (13) z_gzPain (20) z_gzThreat (19) z_hib (19) z_IDE (52) z_ikm (5) z_IR_misc (36) z_IRS (26) z_javaWeb (28) z_jdbc (10) z_jobFinTech (46) z_jobHunt (20) z_jobRealXp (10) z_jobStrength (15) z_jobUS^asia (27) z_letter (42) z_linq (10) z_memberHid` (11) z_MOM (54) z_nestedClass (5) z_oq (24) z_PCP (12) z_pearl (1) z_php (20) z_prodSupport (7) z_py (31) z_quant (14) z_regex (8) z_rv (38) z_skillist (48) z_slic`Problem (6) z_SOA (14) z_spring (25) z_src_code (8) z_swingMisc (50) z_swingTable (26) z_unpublish (2) z_VBA/Excel (8) z_windoz (17) z_wpfCommand (9)

About Me

New York (Time Square), NY, United States
http://www.linkedin.com/in/tanbin