°´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ£¬°´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ£¬°´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿£¡
¡ª¡ª¡ª¡ªÎ´ÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡which¡¡in¡¡turn¡¡returns¡¡the¡¡lambda¡¡expression¡¡that¡¡represents¡¡the¡¡new¡¡value¡¡stored¡¡in¡¡the¡¡cell£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Module¡¡CellFactories¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Function¡¡DoAdd£¨ByVal¡¡cell1¡¡As¡¡Func£¨Of¡¡Object£©£»¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByVal¡¡cell2¡¡As¡¡Func£¨Of¡¡Object£©£©¡¡As¡¡Func£¨Of¡¡Object£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡Function£¨£©¡¡CType£¨cell1£¨£©£»¡¡Double£©¡¡£«¡¡CType£¨cell2£¨£©£»¡¡Double£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Function¡¡DoMultiply£¨ByVal¡¡cell1¡¡As¡¡Func£¨Of¡¡Object£©£»¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByVal¡¡cell2¡¡As¡¡Func£¨Of¡¡Object£©£©¡¡As¡¡Func£¨Of¡¡Object£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡Function£¨£©¡¡CType£¨cell1£¨£©£»¡¡Double£©¡¡*¡¡CType£¨cell2£¨£©£»¡¡Double£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Function¡¡FixedValue£¨ByVal¡¡value¡¡As¡¡Object£©¡¡As¡¡Func£¨Of¡¡Object£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡Function£¨£©¡¡value¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Module¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡lambda¡¡expressions¡¡can¡¡be¡¡used¡¡to¡¡add¡¡two¡¡cells¡¡together£»¡¡multiply¡¡two¡¡cells¡¡together£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡or¡¡store¡¡a¡¡fixed¡¡value¡£¡¡With¡¡the¡¡lambda¡¡expressions¡¡and¡¡the¡¡spreadsheet£»¡¡you¡¡have¡¡two¡¡pieces¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡of¡¡source¡¡code¡¡that£»¡¡when¡¡bined£»¡¡have¡¡the¡¡ability¡¡to¡¡solve¡¡plicated¡¡problems¡£¡¡The¡¡key¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡idea¡¡that¡¡you¡¡need¡¡to¡¡take¡¡away¡¡is¡¡that¡¡the¡¡Spreadsheet¡¡class¡¡and¡¡the¡¡lambda¡¡expressions¡¡defined¡¡in¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CellFactories¡¡do¡¡not¡¡know¡¡about¡¡each¡¡other¡£¡¡The¡¡lambda¡¡expressions¡¡could¡¡be¡¡used¡¡in¡¡a¡¡context¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡other¡¡than¡¡a¡¡spreadsheet¡£¡¡The¡¡only¡¡requirement¡¡is¡¡that¡¡the¡¡function¡¡types¡¡and¡¡signatures¡¡match¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡sample¡¡spreadsheet¡¡that¡¡would¡¡be¡¡used¡¡to¡¡add¡¡and¡¡multiply¡¡some¡¡cells¡¡together¡¡would¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡be¡¡as¡¡follows£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡spreadsheet¡¡As¡¡Spreadsheet¡¡=¡¡New¡¡Spreadsheet£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡spreadsheet¡£Cells£¨1£»¡¡0£©¡¡=¡¡CellFactories¡£FixedValue£¨10¡£0£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡spreadsheet¡£Cells£¨0£»¡¡1£©¡¡=¡¡CellFactories¡£FixedValue£¨10¡£0£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡313¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡1¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡IN¡¡G¡¡¡¡¡¡AB¡¡O¡¡U¡¡T¡¡¡¡¡¡¡£¡¡N¡¡E¡¡T¡¡¡¡G¡¡E¡¡N¡¡E¡¡R¡¡I¡¡CS¡¡291¡¡
spreadsheet¡£Cells£¨1£»¡¡2£©¡¡=¡¡¡¡_¡¡
¡¡¡¡¡¡¡¡CellFactories¡£DoAdd£¨spreadsheet¡£Cells£¨1£»¡¡0£©£»¡¡spreadsheet¡£Cells£¨0£»¡¡1£©£©¡¡
spreadsheet¡£Cells£¨2£»¡¡2£©¡¡=¡¡CellFactories¡£DoMultiply£¨spreadsheet¡£Cells£¨1£»¡¡2£©£»¡¡_¡¡
¡¡¡¡¡¡¡¡CellFactories¡£FixedValue£¨2¡£0£©£©¡¡
spreadsheet¡£Execute£¨£©¡¡
Console¡£WriteLine£¨¡¨Contents¡¡of¡¡£¨1£»¡¡2£©£º¡¡¡¨¡¡&¡¡spreadsheet¡£State£¨1£»¡¡2£©¡£ToString£¨£©£©¡¡
Console¡£WriteLine£¨¡¨Contents¡¡of¡¡£¨2£»¡¡2£©£º¡¡¡¨¡¡&¡¡spreadsheet¡£State£¨2£»¡¡2£©¡£ToString£¨£©£©¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡sample¡¡code¡¡illustrates¡¡a¡¡rudimentary¡¡example¡¡of¡¡a¡¡spreadsheet¡¡and¡¡how¡¡lambda¡¡¡¡
expressions¡¡can¡¡be¡¡used¡£¡¡In¡¡this¡¡chapter£»¡¡the¡¡focus¡¡will¡¡be¡¡on¡¡how¡¡to¡¡create¡¡a¡¡spreadsheet¡¡¡¡
implementation¡¡that¡¡is¡¡effective£»¡¡mostly¡¡object¡oriented£»¡¡and¡¡maintainable¡£¡¡
Architecting¡¡a¡¡Server¡Side¡¡Spreadsheet¡¡¡¡
To¡¡architect¡¡a¡¡server¡¡spreadsheet£»¡¡the¡¡following¡¡requirements¡¡must¡¡be¡¡met£º¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Performance£º¡¡Wherever¡¡possible£»¡¡the¡¡design¡¡should¡¡not¡¡sacrifice¡¡performance¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Usability£º¡¡The¡¡server¡side¡¡spreadsheet¡¡must¡¡be¡¡easy¡¡to¡¡program¡¡from¡¡a¡¡Visual¡¡Basic¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡perspective¡£¡¡If¡¡the¡¡server¡side¡¡spreadsheet¡¡is¡¡too¡¡plex¡¡or¡¡difficult¡¡to¡¡understand£»¡¡it¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡will¡¡not¡¡be¡¡used¡¡properly£»¡¡potentially¡¡incurring¡¡errors¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Maintainability£º¡¡The¡¡server¡side¡¡spreadsheet¡¡implementation¡¡should¡¡be¡¡somewhat¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡maintainable¡£¡¡Otherwise£»¡¡bugs¡¡could¡¡creep¡¡into¡¡the¡¡code£»¡¡impeding¡¡the¡¡spreadsheet¡¯s¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡effective¡¡use¡£¡¡
¡¡¡¡¡¡¡¡¡¡Not¡¡listed¡¡is¡¡the¡¡requirement¡¡for¡¡extensibility¡£¡¡A¡¡spreadsheet¡¡by¡¡itself¡¡is¡¡not¡¡extensible¡¡¡¡
because¡¡it¡¡implements¡¡a¡¡certain¡¡paradigm£»¡¡which¡¡is¡¡a¡¡two¡dimensional¡¡document¡¡of¡¡numbers¡¡¡¡
and¡¡calculations¡£¡¡
¡¡¡¡¡¡¡¡¡¡And¡¡if¡¡you¡¡are¡¡wondering¡¡where¡¡the¡¡spreadsheet¡¡code¡¡es¡¡from£»¡¡it¡¡is¡¡a¡¡subset¡¡of¡¡the¡¡¡¡
actual¡¡code¡¡that¡¡I¡¡use¡¡in¡¡my¡¡own¡¡security¡¡trading¡¡system¡£¡¡
¡öNote¡¡¡¡To¡¡code¡¡the¡¡spreadsheet¡¡to¡¡do¡¡more¡¡than¡¡it¡¡is¡¡originally¡¡designed¡¡for¡¡might¡¡be¡¡an¡¡interesting¡¡goal£»¡¡¡¡
but¡¡not¡¡one¡¡that¡¡is¡¡worth¡¡pursuing¡£¡¡Sometimes¡¡it¡¡is¡¡best¡¡to¡¡solve¡¡a¡¡problem£»¡¡and¡¡leave¡¡paradigm¡¡thinking¡¡for¡¡¡¡
another¡¡time¡£¡¡I¡¡have¡¡seen¡¡developers¡¡think¡¡about¡¡paradigms£»¡¡not¡¡finish¡¡their¡¡code£»¡¡and¡¡then¡¡have¡¡the¡¡code¡¡¡¡
made¡¡obsolete¡¡by¡¡a¡¡paradigm¡¡that¡¡they¡¡did¡¡not¡¡consider¡£¡¡
¡¡¡¡¡¡¡¡¡¡Three¡¡projects¡¡are¡¡defined¡¡for¡¡this¡¡example£º¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Devspace¡£Trader¡£mon£º¡¡A¡¡class¡¡library¡¡that¡¡is¡¡a¡¡distilled¡¡form¡¡of¡¡my¡¡trading¡¡library¡£¡¡I¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡decided¡¡to¡¡include¡¡such¡¡a¡¡library¡¡to¡¡give¡¡you¡¡a¡¡taste¡¡of¡¡how¡¡a¡¡production¡¡class¡¡library¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡looks¡¡and¡¡feels¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡ServerSideSpreadsheet£º¡¡A¡¡class¡¡library¡¡that¡¡represents¡¡the¡¡implementation¡¡of¡¡a¡¡server
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡side¡¡spreadsheet¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡TestServerSideSpreadsheet£º¡¡A¡¡console¡¡application¡¡that¡¡tests¡¡the¡¡ServerSideSpreadsheet¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡project¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡314¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
292¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡1¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡¡£¡¡N¡¡E¡¡T¡¡¡¡G¡¡E¡¡N¡¡E¡¡R¡¡I¡¡CS¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Designing¡¡the¡¡Architecture¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡original¡¡implementation¡¡of¡¡the¡¡spreadsheet¡¡code¡¡provides¡¡a¡¡great¡¡starting¡¡point¡£¡¡Using¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡lambda¡¡expressions¡¡to¡¡calculate¡¡the¡¡state¡¡of¡¡a¡¡cell¡¡makes¡¡it¡¡easy¡¡to¡¡create¡¡a¡¡worksheet¡¡of¡¡numbers¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡What¡¡is¡¡not¡¡so¡¡great¡¡is¡¡the¡¡fact¡¡that¡¡the¡¡class¡¡SpreadSheet¡¡is¡¡a¡¡single¡¡worksheet¡£¡¡Most¡¡spreadsheets¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡applications¡¡£¨like¡¡Microsoft¡¡Excel£©¡¡offer¡¡the¡¡ability¡¡to¡¡create¡¡multiple¡¡worksheets¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡server¡side¡¡spreadsheet¡¡that¡¡we¡¡will¡¡create¡¡will¡¡consist¡¡of¡¡two¡¡concepts£º¡¡workbook¡¡and¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡worksheet£»¡¡as¡¡illustrated¡¡in¡¡Figure¡¡11¡1¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Figure¡¡11¡1¡£¡¡Spreadsheet¡¡design¡¡based¡¡on¡¡workbook¡¡and¡¡worksheet¡¡types¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡workbook¡¡is¡¡a¡¡type¡¡that¡¡acts¡¡like¡¡a¡¡collection¡¡class¡¡of¡¡the¡¡worksheet¡¡type¡£¡¡The¡¡work
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡sheet¡¡type¡¡is¡¡an¡¡individual¡¡spreadsheet¡¡of¡¡fixed¡¡dimension¡¡that¡¡is¡¡responsible¡¡for¡¡storing¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡state£»¡¡and¡¡the¡¡cell¡¡calculations¡¡reference¡¡the¡¡individual¡¡lambda¡¡expressions¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡workbook¡¡and¡¡worksheet¡¡could¡¡be¡¡defined¡¡as¡¡interfaces¡¡or¡¡as¡¡classes¡£¡¡Which¡¡would¡¡be¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡better£¿¡¡Let¡