Monday, May 2, 2011

a delegate recipe - utility static class to call an instance method on any object

Say you have a (shared) _static_utility_ class freely usable from any client class, but this utility class should not "know" about (see http://bigblog.tanbin.com/2012/10/a-service-having-know-how-another-eg-of.html) these client classes.  Suppose the utility class's main job is to asynchronously call some public WCF query service and provide a static callback method handles data received.


Now suppose some Student1 object (observer) is interested in the query result and would like to receive a callback. Here's a naïve solution - Student class ignores the utility class and directly invokes the WCF query and privately handles data received. Code duplication in 1) the utility class and 2) Student class.

The better solution is for the static utility class's callback method (observable) to invoke a (non-static) method on Student1. But then the utility class should NOT hold a reference to Student1, right? Utility class source code should be free of the Student class or any client class. If the util class is in namepace Util, then the util class should not import the Student class into its Util namespace. This way, the util class is reusable in another project without the Student class. If util class were to include "using The.Name.Space.Of.Student" then this class won't compile without the Student class. Such a util class would be tightly coupled with the Student class.

Solution - utility static class to expose a static event whose type is a dummy void-void delegate. You can also "upgrade" to the standard System.Action delegate, but to illustrate the simplicity of the technique i will use the void-void delegate, probably the simplest delegate in the world.

        public delegate void Dlg1();
        public static event Dlg1 SnapshotsReceived;
        private static void TheCallback()
        {
            SnapshotsReceived(); // fire event
        }

Now our Student1 object can register interest in SnapshotReceived, by passing a Student1 reference (reference to itself) into the static util class ! Under the hood, static class has a hidden static invocation list, each holding a 2-pointer thingy. The Student1 reference is in the invocation list.

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