ÓÑÇéÌáʾ£ºÈç¹û±¾ÍøÒ³´ò¿ªÌ«Âý»òÏÔʾ²»ÍêÕû£¬Çë³¢ÊÔÊó±êÓÒ¼ü¡°Ë¢Ð¡±±¾ÍøÒ³£¡
VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ49²¿·Ö
¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿! Èç¹û±¾ÊéûÓÐÔĶÁÍ꣬ÏëÏ´μÌÐø½Ó×ÅÔĶÁ£¬¿ÉʹÓÃÉÏ·½ "Êղص½ÎÒµÄä¯ÀÀÆ÷" ¹¦ÄÜ ºÍ "¼ÓÈëÊéÇ©" ¹¦ÄÜ£¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡pieces¡¡in¡¡place£»¡¡and¡¡when¡¡called¡¡will¡¡seem¡¡like¡¡it¡¡functions¡£¡¡The¡¡echo¡¡part¡¡es¡¡in¡¡when¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡end¡¡piece¡¡of¡¡functionality¡¡is¡¡called¡¡and¡¡it¡¡returns¡¡the¡¡data¡¡that¡¡was¡¡sent¡¡to¡¡it¡£¡¡In¡¡essence£»¡¡the¡¡end¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡piece¡¡is¡¡acting¡¡like¡¡an¡¡echo¡£¡¡The¡¡cleverness¡¡behind¡¡the¡¡echo¡¡is¡¡that¡¡it¡¡requires¡¡no¡¡implementa
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡tion£»¡¡yet¡¡it¡¡demonstrates¡¡the¡¡plete¡¡flow¡¡of¡¡data¡¡and¡¡whether¡¡that¡¡data¡¡flow¡¡is¡¡workable¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡echo¡¡program¡¡is¡¡not¡¡a¡¡final¡¡program¡£¡¡The¡¡echo¡¡program¡¡is¡¡a¡¡temporary¡¡solution¡¡for¡¡an¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡intermediate¡¡goal¡£¡¡When¡¡building¡¡an¡¡application¡¡with¡¡intermediate¡¡goals£»¡¡you¡¡are¡¡using¡¡an¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡iterative¡¡development¡¡technique¡£¡¡The¡¡iterations¡¡are¡¡not¡¡visible¡¡to¡¡your¡¡other¡¡team¡¡members¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡and¡¡are¡¡pletely¡¡private¡£¡¡However£»¡¡the¡¡iterations¡¡will¡¡keep¡¡you¡¡focused¡¡on¡¡solving¡¡a¡¡problem£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡rather¡¡than¡¡trying¡¡to¡¡implement¡¡a¡¡large¡¡piece¡¡of¡¡code¡¡that¡¡you¡¡will¡¡not¡¡be¡¡able¡¡to¡¡fully¡¡test¡¡for¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡while¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Test¡driven¡¡development£»¡¡for¡¡the¡¡most¡¡part£»¡¡is¡¡a¡¡bottom¡up¡¡development¡¡approach¡£¡¡You¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡develop¡¡a¡¡core¡¡piece¡¡of¡¡functionality£»¡¡test¡¡it£»¡¡and¡¡then¡¡write¡¡code¡¡that¡¡uses¡¡the¡¡tested¡¡piece¡¡of¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡275¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡A¡¡PT¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡T¡¡E¡¡N¡¡CE¡¡253¡¡
functionality¡£¡¡But¡¡sometimes¡¡you¡¡need¡¡to¡¡develop¡¡in¡¡a¡¡top¡down¡¡fashion¡£¡¡I¡¡typically¡¡develop¡¡¡¡
code¡¡top¡down¡¡when¡¡I¡¡am¡¡trying¡¡to¡¡nail¡¡down¡¡an¡¡overall¡¡architecture¡£¡¡The¡¡problem¡¡with¡¡devel
oping¡¡top¡down¡¡is¡¡that¡¡you¡¡don¡¯t¡¡yet¡¡have¡¡the¡¡bottom¡¡code¡£¡¡In¡¡other¡¡words£»¡¡you¡¡are¡¡writing¡¡¡¡
code¡¡with¡¡no¡¡working¡¡code¡£¡¡So¡¡that¡¡your¡¡code¡¡does¡¡have¡¡some¡¡meaning£»¡¡you¡¡develop¡¡an¡¡echo¡£¡¡¡¡
The¡¡echo¡¡solves¡¡the¡¡problem¡¡of¡¡working¡¡code¡¡and¡¡allows¡¡you¡¡to¡¡focus¡¡on¡¡getting¡¡the¡¡individual¡¡¡¡
pieces¡¡to¡¡fit¡¡together¡£¡¡Once¡¡the¡¡pieces¡¡are¡¡working£»¡¡and¡¡the¡¡echo¡¡was¡¡successful£»¡¡you¡¡can¡¡start¡¡¡¡
filling¡¡in¡¡the¡¡implementations¡£¡¡Some¡¡developers¡¡call¡¡the¡¡echo¡¡a¡¡¡¡mock¡¡implementation¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡Here£»¡¡I¡¯ll¡¡explain¡¡developing¡¡the¡¡sample¡¡application¡¡by¡¡assembling¡¡individual¡¡pieces¡¡in¡¡a¡¡¡¡
top¡down¡¡manner£»¡¡focusing¡¡on¡¡getting¡¡a¡¡single¡¡echo¡¡implemented¡£¡¡Then¡¡once¡¡the¡¡overall¡¡flow¡¡¡¡
is¡¡plete£»¡¡the¡¡individual¡¡pieces¡¡will¡¡be¡¡implemented¡¡pletely¡£¡¡Figure¡¡10¡2¡¡illustrates¡¡¡¡
a¡¡plete¡¡architecture¡¡for¡¡the¡¡lottery¡prediction¡¡program£»¡¡including¡¡the¡¡pipeline¡¡for¡¡the¡¡¡¡
TextProcessor¡¡console¡¡application¡£¡¡
Figure¡¡10¡2¡£¡¡Architecture¡¡of¡¡a¡¡reader/writer¡¡application¡¡using¡¡a¡¡general¡¡assembly¡¡
Reading¡¡and¡¡Writing¡¡to¡¡a¡¡Stream¡¡
For¡¡developing¡¡the¡¡lottery¡prediction¡¡application£»¡¡we¡¯ll¡¡use¡¡a¡¡piece¡¡of¡¡bootstrap¡¡code¡¡to¡¡initiate¡¡¡¡
the¡¡reading¡¡and¡¡writing¡¡library£»¡¡which¡¡then¡¡calls¡¡the¡¡specific¡¡implementation¡£¡¡Bootstrap¡¡code¡¡is¡¡¡¡
code¡¡that¡¡does¡¡not¡¡actually¡¡perform¡¡the¡¡processing£»¡¡but¡¡is¡¡responsible¡¡for¡¡setting¡¡up¡¡and¡¡initi
ating¡¡another¡¡piece¡¡of¡¡source¡¡code¡¡that¡¡will¡¡do¡¡the¡¡processing¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡This¡¡is¡¡the¡¡same¡¡sort¡¡of¡¡architecture¡¡as¡¡we¡¡set¡¡up¡¡in¡¡Chapter¡¡8¡¯s¡¡example£»¡¡for¡¡the¡¡applica
tion¡¡to¡¡control¡¡the¡¡lights¡¡of¡¡a¡¡building¡£¡¡In¡¡that¡¡case£»¡¡the¡¡controller¡¡was¡¡a¡¡generic¡¡piece¡¡of¡¡software¡¡¡¡
that¡¡called¡¡an¡¡interface£»¡¡but¡¡did¡¡not¡¡know¡¡about¡¡the¡¡individual¡¡implementations¡£¡¡The¡¡focus¡¡¡¡
there¡¡was¡¡on¡¡developing¡¡the¡¡room¡¡implementations£»¡¡and¡¡the¡¡lighting¡¡controller¡¡was¡¡left¡¡as¡¡a¡¡¡¡
nebulous¡¡to¡do¡¡task¡£¡¡Here£»¡¡we¡¯ll¡¡go¡¡through¡¡the¡¡creation¡¡of¡¡a¡¡plete¡¡working¡¡application£»¡¡¡¡
including¡¡the¡¡controller¡¡and¡¡implementation¡£¡¡Note¡¡this¡¡chapter¡¡is¡¡light¡¡on¡¡testing¡¡routines£»¡¡¡¡
both¡¡for¡¡brevity¡¡and¡¡because¡¡one¡¡of¡¡the¡¡exercises¡¡at¡¡the¡¡end¡¡of¡¡the¡¡chapter¡¡is¡¡for¡¡you¡¡to¡¡e¡¡up¡¡¡¡
with¡¡a¡¡testing¡¡plan¡£¡¡
¡¡¡¡¡¡¡¡¡¡We¡¡want¡¡to¡¡be¡¡able¡¡to¡¡process¡¡the¡¡following¡¡mand¡¡line¡£¡¡¡¡
type¡¡lotto¡£txt¡¡£ü¡¡TextProcessor¡£exe¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡276¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
254¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡TE¡¡N¡¡CE¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡TextProcessor¡£exe¡¡cannot¡¡read¡¡the¡¡data¡¡from¡¡the¡¡pipe£»¡¡an¡¡exception¡¡will¡¡be¡¡thrown¡¡at¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡console¡¡level£»¡¡indicating¡¡that¡¡the¡¡piped¡¡data¡¡was¡¡not¡¡read¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡öNote¡¡¡¡For¡¡the¡¡application¡¡to¡¡work£»¡¡the¡¡lotto¡£txt¡¡and¡¡TextProcessor¡£exe¡¡files¡¡must¡¡be¡¡in¡¡the¡¡same¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡directory¡£¡¡By¡¡default£»¡¡TextProcessor¡£exe¡¡is¡¡in¡¡the¡¡¡¡£§Visual¡¡Studio¡¡project£§bindebug¡¡directory¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Copy¡¡TextProcessor¡£exe¡¡into¡¡the¡¡lotto¡£txt¡¡directory£»¡¡or¡¡vice¡¡versa£»¡¡or¡¡you¡¡could¡¡even¡¡copy¡¡them¡¡both¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡into¡¡another¡¡directory¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡architecture¡¡of¡¡TextProcessor£»¡¡the¡¡bootstrap¡¡code¡¡is¡¡in¡¡the¡¡ReaderWriter¡¡project¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡TextProcessor¡¡console¡¡application¡¡must¡¡call¡¡the¡¡bootstrap¡¡code¡¡and¡¡instantiate¡¡a¡¡local¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡type¡¡that¡¡has¡¡implemented¡¡the¡¡IProcessor¡¡interface¡£¡¡The¡¡Main£¨£©¡¡method¡¡of¡¡TextProcessor¡¡is¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡implemented¡¡as¡¡follows¡¡£¨this¡¡is¡¡the¡¡best¡¡time¡¡to¡¡add¡¡a¡¡reference¡¡to¡¡the¡¡ReaderWriter¡¡project¡¡by¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡right¡clicking¡¡TextProcessor¡¡and¡¡choosing¡¡Add¡¡Reference¡¡¡¡Projects¡¡¡¡ReaderWriter£©£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Imports¡¡ReaderWriter¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Module¡¡Module1¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Sub¡¡Main£¨ByVal¡¡args¡¡As¡¡String£¨£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Bootstrap¡£Start£¨args£»¡¡New¡¡LottoTicketProcessor£¨£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Module¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡TextProcessor¡£Main£¨£©¡¡passes¡¡all¡¡of¡¡the¡¡given¡¡arguments¡¡£¨contained¡¡in¡¡the¡¡¡¡args¡¡array£©¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡actual¡¡processing¡¡routine¡¡£¨Bootstrap¡£Start£¨£©£©¡£¡¡The¡¡¡¡LottoTicketProcessor¡¡class¡¡imple
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ments¡¡the¡¡IProcessor¡¡interface¡¡and¡¡will¡¡serve¡¡for¡¡the¡¡temporary¡¡purpose¡¡of¡¡echoing¡¡data¡£¡¡The¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡IProcessor¡¡interface¡¡is¡¡defined¡¡in¡¡the¡¡¡¡ReaderWriter¡¡project¡¡as¡¡follows£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Interface¡¡IProcessor¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Function¡¡Process£¨ByVal¡¡input¡¡As¡¡String£©¡¡As¡¡String¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Interface¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡IProcessor¡¡interface¡¡has¡¡a¡¡single¡¡method¡¡¡¡Process£¨£©£»¡¡which¡¡accepts¡¡a¡¡string¡¡to¡¡be¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡processed£»¡¡and¡¡the¡¡return¡¡value¡¡is¡¡the¡¡processed¡¡string¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡implementation¡¡of¡¡¡¡LottoLibrary¡£LottoTicketProcessor¡¡is¡¡as¡¡follows¡¡£¨remember¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡add¡¡a¡¡reference¡¡to¡¡ReaderWriter£©£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Imports¡¡ReaderWriter¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡'¡¡TODO£º¡¡Finish¡¡implementing¡¡the¡¡class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Class¡¡LottoTicketProcessor¡¡£º¡¡Implements¡¡IProcessor¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Function¡¡Process£¨ByVal¡¡input¡¡As¡¡String£©¡¡As¡¡String¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Implements¡¡IProcessor¡£Process¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡input¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡277¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡A¡¡PT¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡T¡¡E¡¡N¡¡CE¡¡255¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡implementation¡¡of¡¡the¡¡¡¡Process£¨£©¡¡method¡¡takes¡¡the¡¡input¡¡parameter¡¡and¡¡returns¡¡it¡¡as¡¡¡¡
the¡¡answer¡£¡¡There¡¡is¡¡no¡¡processing¡¡at¡¡the¡¡moment£»¡¡just¡¡a¡¡redirection¡¡of¡¡the¡¡data¡£¡¡
¡¡¡¡¡¡¡¡¡¡Now¡¡let¡¯s¡¡look¡¡at¡¡implementing¡¡the¡¡ReaderWriter¡¡project¡£¡¡For¡¡this¡¡first¡¡phase£»¡¡the¡¡reader/¡¡
writer¡¡will¡¡also¡¡be¡¡minimal£»¡¡so¡¡that¡¡we¡¡can¡¡see¡¡that¡¡all¡¡of¡¡the¡¡pieces¡¡are¡¡in¡¡place¡¡and¡¡working¡£¡¡¡¡
The¡¡first¡¡phase¡¡will¡¡assume¡¡that¡¡the¡¡data¡¡is¡¡received¡¡on¡¡the¡¡console¡¡and¡¡will¡¡be¡¡sent¡¡on¡¡the¡¡¡¡
console¡£¡¡Here¡¡is¡¡the¡¡implementation¡¡of¡¡ReaderWriter¡£Bootstrap¡¡module£º¡¡
Imports¡¡System¡£IO¡¡
¡¡¡¡¡¡¡¡Public¡¡Module¡¡Bootstrap¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡Start£¨ByVal¡¡args£¨£©¡¡As¡¡String£»¡¡ByVal¡¡processor¡¡As¡¡IProcessor£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡reader¡¡As¡¡TextReader¡¡=¡¡Console¡£In¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡writer¡¡As¡¡TextWriter¡¡=¡¡Console¡£Out¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡writer¡£Write£¨processor¡£Process£¨reader¡£ReadToEnd£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡End¡¡Module¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡implementation¡¡performs¡¡two¡¡main¡¡steps£º¡¡assign¡¡the¡¡streams¡¡and¡¡manipulate¡¡the¡¡¡¡
streams¡£¡¡In¡¡the¡¡puting¡¡world£»¡¡streams¡¡are¡¡wonderful¡¡things£»¡¡because¡¡they¡¡are¡¡a¡¡generic¡¡¡¡
concept¡¡like¡¡string¡¡buffers¡£¡¡A¡¡stream¡¡could¡¡be¡¡a¡¡text¡¡file£»¡¡console¡¡input£»¡¡or¡¡even¡¡a¡¡network¡¡¡¡
connection¡£¡¡A¡¡stream¡¡can¡¡be¡¡text¡based¡¡or¡¡binary¡based£»¡¡with¡¡or¡¡without¡¡a¡¡formatted¡¡protocol¡£¡¡¡¡
Thus£»¡¡when¡¡processing¡¡a¡¡stream£»¡¡you¡¡don¡¯t¡¡work¡¡specifically¡¡with¡¡the¡¡console¡¡or¡¡a¡¡file£»¡¡but¡¡use¡¡¡¡
interfaces¡¡like¡¡System¡£IO¡£TextReader¡¡and¡¡¡¡System¡£IO¡£TextWriter¡£¡¡
¡¡¡¡¡¡¡¡¡¡Assigning¡¡the¡¡console¡¡streams¡¡involves¡¡assigning¡¡the¡¡properties¡¡¡¡In¡¡and¡¡Out¡¡to¡¡TextReader¡¡¡¡
and¡¡TextWriter£»¡¡respectively¡£¡¡The¡¡code¡¡that¡¡calls¡¡the¡¡processor¡£Process£¨£©¡¡method¡¡sends¡¡a¡¡¡¡
stream¡¡to¡¡the¡¡processor¡¡and¡¡awaits¡¡a¡¡response¡¡that¡¡is¡¡sent¡¡as¡¡another¡¡stream¡£¡¡
¡¡¡¡¡¡¡¡¡¡Knowing¡¡that¡¡TextReader¡¡and¡¡TextWriter¡¡are¡¡general¡¡interfaces£»¡¡or¡¡technically¡¡abstract¡¡¡¡
base¡¡classes£»¡¡you¡¡could¡¡be¡¡tempted¡¡to¡¡redesign¡¡the¡¡IProcessor¡¡interface¡¡as¡¡follows£º¡¡
Public¡¡Interface¡¡IProcessor¡¡
¡¡¡¡¡¡¡¡Function¡¡Process£¨ByVal¡¡input¡¡As¡¡TextReader£»¡¡ByVal¡¡output¡¡As¡¡TextWriter£©¡¡
End¡¡Interface¡¡
¡¡¡¡¡¡¡¡¡¡There¡¡is¡¡nothing¡¡wrong¡¡with¡¡this¡¡declaration¡¡of¡¡IProcessor£»¡¡but¡¡I¡¡would¡¡not¡¡be¡¡tempted¡¡to¡¡¡¡
use¡¡it¡¡because¡¡it¡¡relies¡¡on¡¡the¡¡interfaces¡¡TextReader¡¡and¡¡TextWriter¡£¡¡In¡¡the¡¡case¡¡of¡¡our¡¡example£»¡¡¡¡
that¡¡is¡¡acceptable£»¡¡and¡¡you¡¡might¡¡find¡¡that¡¡it¡¡is¡¡good¡¡enough¡¡for¡¡your¡¡application¡£¡¡But¡¡I¡¡like¡¡to¡¡¡¡
keep¡¡things¡¡general¡¡and¡¡then¡¡be¡¡more¡¡specific¡¡when¡¡necessary¡£¡¡Later¡¡in¡¡this¡¡chapter£»¡¡when¡¡we¡¡¡¡
work¡¡with¡¡binary¡¡data¡¡streams£»¡¡we¡¡will¡¡need¡¡to¡¡be¡¡specific¡¡and¡¡will¡¡use¡¡an¡¡interface¡¡declaration¡¡¡¡
similar¡¡to¡¡the¡¡one¡¡shown¡¡here¡£¡¡¡¡
¡öNote¡¡¡¡As¡¡a¡¡general¡¡rule¡¡of¡¡thumb£»¡¡it¡¡is¡¡always¡¡easy¡¡to¡¡write¡¡specific¡¡code¡¡because¡¡you¡¡have¡¡easy¡¡access¡¡¡¡
to¡¡the¡¡methods¡¡and¡¡properties¡¡you¡¡need¡£¡¡It¡¡is¡¡harder¡¡from¡¡a¡¡design¡¡perspective¡¡to¡¡keep¡¡things¡¡general¡£¡¡The¡¡¡¡
advantage¡¡of¡¡keeping¡¡things¡¡general¡¡is¡¡your¡¡code¡¡is¡¡more¡¡flexible¡¡and¡¡can¡¡be¡¡used¡¡in¡¡multiple¡¡contexts¡£¡¡¡¡
However£»¡¡you¡¡shouldn¡¯t¡¡make¡¡it¡¡a¡¡hard¡¡rule¡¡that¡¡all¡¡code¡¡will¡¡be¡¡general¡£¡¡The¡¡rule¡¡of¡¡thumb¡¡is¡¡to¡¡try¡¡to¡¡stay¡¡as¡¡¡¡
general¡¡as¡¡possible¡¡using¡¡interfaces¡¡and¡¡have¡¡the¡¡implementation¡¡define¡¡the¡¡specifics¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡278¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
256¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡TE¡¡N¡¡CE¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Having¡¡implemented¡¡all¡¡of¡¡the¡¡pieces£»¡¡you¡¡could¡¡pile¡¡the¡¡source¡¡code¡¡and¡¡run¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡mand¡¡to¡¡read¡¡piped¡¡data¡£¡¡The¡¡only¡¡thing¡¡missing¡¡is¡¡the¡¡file¡¡that¡¡contains¡¡the¡¡data£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡lotto¡£txt¡£¡¡For¡¡the¡¡example£»¡¡create¡¡a¡¡file¡¡called¡¡lotto¡£txt¡¡and¡¡add¡¡text¡¡such¡¡as¡¡the¡¡following£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡where¡¡each¡¡line¡¡represents¡¡the¡¡date¡¡of¡¡the¡¡lottery¡¡draw£»¡¡then¡¡the¡¡six¡¡lottery¡¡numbers£»¡¡and¡¡then¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡bonus¡¡number¡¡£¨you¡¡could¡¡also¡¡use¡¡the¡¡lotto¡£txt¡¡file¡¡included¡¡with¡¡this¡¡book¡¯s¡¡download
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡able¡¡code£©¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡1970¡£01¡£10¡¡7¡¡8¡¡12¡¡17¡¡32¡¡40¡¡24¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡1970¡£01¡£17¡¡7¡¡12¡¡22¡¡24¡¡29¡¡40¡¡36¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡1970¡£01¡£24¡¡16¡¡22¡¡25¡¡27¡¡30¡¡35¡¡24¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡1970¡£01¡£31¡¡3¡¡11¡¡21¡¡22¡¡24¡¡39¡¡8¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡1970¡£02¡£07¡¡2¡¡5¡¡11¡¡16¡¡18¡¡38¡¡37¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Now¡¡run¡¡the¡¡following¡¡piping¡¡mand¡¡£¨open¡¡a¡¡mand¡¡prompt¡¡and¡¡navigate¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡TextProcessorTextProcessorbinRelease¡¡from¡¡the¡¡Visual¡¡Basic¡¡Express¡¡base¡¡directory£©£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡type¡¡lotto¡£txt¡¡£ü¡¡TextProcessor¡£exe¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡You¡¡should¡¡see¡¡the¡¡contents¡¡of¡¡¡¡lotto¡£txt¡£¡¡If¡¡that¡¡is¡¡what¡¡you¡¡get£»¡¡you¡¡have¡¡a¡¡successful¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡round¡trip¡¡and¡¡have¡¡created¡¡all¡¡of¡¡the¡¡puzzle¡¡pieces¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡REMEMBERING¡¡TO¡¡IMPLEMENT¡¡ALL¡¡THE¡¡PIECES¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Some¡¡readers¡¡may¡¡argue¡¡that¡¡having¡¡an¡¡echo¡¡implemented¡¡in¡¡¡¡LottoTicketProcessor¡¡is¡¡the¡¡wrong¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡approach¡¡because¡¡there¡¡might¡¡be¡¡a¡¡munication¡¡failure¡¡among¡¡team¡¡members£»¡¡leading¡¡to¡¡buggy¡¡code¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Also£»¡¡you¡¡might¡¡miss¡¡implementing¡¡some¡¡code£»¡¡creating¡¡bugs¡¡when¡¡there¡¡should¡¡not¡¡have¡¡been¡¡any¡£¡¡Although¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡those¡¡risks¡¡are¡¡involved£»¡¡this¡¡approach¡¡has¡¡important¡¡benefits£»¡¡and¡¡there¡¡are¡¡ways¡¡to¡¡mitigate¡¡the¡¡risks¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡One¡¡of¡¡the¡¡challenges¡¡for¡¡Visual¡¡Basic¡¡developers¡¡is¡¡knowing¡¡not¡¡only¡¡the¡¡language£»¡¡but¡¡also¡¡the¡¡¡¡API¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡This¡¡book¡¡will¡¡not¡¡talk¡¡about¡¡the¡¡API¡¡because¡¡you¡¡could¡¡die¡¡of¡¡old¡¡age¡¡before¡¡you¡¡read¡¡everything¡¡there¡¡is¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡know¡¡about¡¡the¡¡¡¡API¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡¡¡API¡¡is¡¡vast£»¡¡but¡¡you¡¡will¡¡not¡¡need¡¡to¡¡use¡¡all¡¡of¡¡the¡¡API¡¡all¡¡the¡¡time¡£¡¡What¡¡you¡¡need¡¡to¡¡be¡¡aware¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡of¡¡are¡¡the¡¡general¡¡classes¡¡of¡¡the¡¡API¡£¡¡What¡¡part¡¡of¡¡the¡¡API¡¡is¡¡used¡¡to¡¡read¡¡and¡¡write¡¡streams£¿¡¡What¡¡part¡¡of¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡API¡¡is¡¡used¡¡to¡¡create¡¡GUI¡¡elements£¿¡¡This¡¡means¡¡you¡¡are¡¡not¡¡ever¡¡going¡¡to¡¡be¡¡an¡¡expert¡¡on¡¡all¡¡parts¡¡of¡¡the¡¡API£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡although¡¡you¡¡might¡¡be¡¡an¡¡expert¡¡Visual¡¡Basic¡¡programmer¡¡and¡¡understand¡¡the¡¡general¡¡concepts¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡When¡¡I¡¡understand¡¡a¡¡domain¡¡quite¡¡well£»¡¡I¡¡develop¡¡using¡¡a¡¡bottom¡up¡¡approach¡£¡¡This¡¡works¡¡because¡¡I¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡know¡¡which¡¡interface¡¡and¡¡implementation¡¡need¡¡to¡¡talk¡¡to¡¡which¡¡other¡¡interface¡¡and¡¡implementation¡£¡¡When¡¡I¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡don¡¯t¡¡understand¡¡a¡¡domain¡¡fully£»¡¡I¡¡develop¡¡using¡¡a¡¡top¡down¡¡approach¡£¡¡Using¡¡a¡¡top¡down¡¡approach£»¡¡I¡¡can¡¡figure¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡out¡¡what¡¡the¡¡pieces¡¡are¡¡in¡¡a¡¡simplified¡¡manner¡£¡¡I¡¡create¡¡my¡¡echo¡¡program£»¡¡which¡¡gives¡¡a¡¡plete¡¡round¡trip¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡without¡¡getting¡¡bogged¡¡down¡¡in¡¡the¡¡details¡¡of¡¡the¡¡API¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Think¡¡of¡¡a¡¡bunch¡¡of¡¡guys¡¡putting¡¡together¡¡a¡¡barbecue¡¡grill¡£¡¡They¡¡might¡¡look¡¡at¡¡the¡¡instructions£»¡¡but¡¡more¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡likely£»¡¡they¡¡will¡¡look¡¡at¡¡the¡¡parts¡¡and¡¡try¡¡to¡¡mentally¡¡fit¡¡the¡¡pieces¡¡together¡£¡¡They¡¡might¡¡even¡¡put¡¡a¡¡couple¡¡of¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡pieces¡¡together¡¡to¡¡get¡¡an¡¡idea¡¡of¡¡what¡¡each¡¡piece¡¡does¡¡and¡¡how¡¡the¡¡overall¡¡grill¡¡should¡¡appear¡£¡¡Once¡¡they¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡bee¡¡confident¡¡of¡¡their¡¡prototype£»¡¡they¡¡build¡¡the¡¡real¡¡thing£»¡¡which¡¡hopefully¡¡resembles¡¡a¡¡barbecue¡¡grill¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡When¡¡you¡¡use¡¡this¡¡approach£»¡¡what¡¡you¡¡are¡¡doing¡¡is¡¡building¡¡a¡¡mockup£»¡¡proof¡¡of¡¡concept£»¡¡or¡¡prototype¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Maybe¡¡two¡¡or¡¡three¡¡team¡¡members¡¡might¡¡help¡¡develop¡¡this¡¡prototype£»¡¡but¡¡the¡¡fact¡¡that¡¡your¡¡code¡¡needs¡¡to¡¡be¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡declared¡¡as¡¡a¡¡prototype¡¡is¡¡extremely¡¡important¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡279¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡A¡¡PT¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡T¡¡E¡¡N¡¡CE¡¡257¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Visual¡¡Basic¡¡Express¡¡and¡¡the¡¡Visual¡¡Studio¡¡products¡¡help¡¡you¡¡in¡¡that¡¡they¡¡allow¡¡you¡¡to¡¡embed¡¡task¡¡markers¡£¡¡Go¡¡¡¡
¡¡¡¡¡¡back¡¡to¡¡the¡¡source¡¡code¡¡example¡¡where¡¡LottoTicketProcessor¡¡was¡¡illustrated¡¡and¡¡look¡¡at¡¡the¡¡ment£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡'¡¡TODO£º¡¡Finish¡¡implementing¡¡the¡¡class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Notice¡¡TODO¡¡is¡¡in¡¡all¡¡capital¡¡letters¡£¡¡That¡¡type¡¡of¡¡ment¡¡is¡¡special¡£¡¡It¡¡is¡¡called¡¡a¡¡¡¡task¡¡and¡¡is¡¡tracked¡¡by¡¡¡¡
¡¡¡¡¡¡Visual¡¡Basic¡¡Express¡¡in¡¡the¡¡Task¡¡List¡¡window¡£¡¡To¡¡open¡¡ments¡¡in¡¡the¡¡Task¡¡List¡¡window£»¡¡select¡¡View¡¡¡¡Other¡¡¡¡
¡¡¡¡¡¡Windows¡¡¡¡Task¡¡List£»¡¡and¡¡then¡¡select¡¡ments¡¡from¡¡the¡¡drop¡down¡¡list¡¡at¡¡the¡¡top¡¡of¡¡the¡¡window¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡This¡¡allows¡¡a¡¡team¡¡of¡¡developers¡¡to¡¡add¡¡markers¡¡throughout¡¡the¡¡entire¡¡code¡¡base£»¡¡indicating¡¡what¡¡is¡¡done¡¡¡¡
¡¡¡¡¡¡and¡¡not¡¡done¡£¡¡That¡¡way£»¡¡you¡¡will¡¡not¡¡forget¡¡to¡¡do¡¡certain¡¡tasks¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Some¡¡other¡¡identifiers¡¡that¡¡you¡¡can¡¡use¡¡are¡¡HACK¡¡to¡¡identify¡¡some¡¡code¡¡that¡¡is¡¡not¡¡correct£»¡¡but¡¡hacked¡¡in¡¡so¡¡¡¡
¡¡¡¡¡¡that¡¡it¡¡works£»¡¡and¡¡UNDONE¡£¡¡If¡¡you¡¡happen¡¡to¡¡be¡¡using¡¡a¡¡Visual¡¡Studio¡¡edition¡¡other¡¡than¡¡Express£»¡¡you¡¡can¡¡define¡¡¡¡
¡¡
¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿!
ÎÂÜ°Ìáʾ£º ο´Ð¡ËµµÄͬʱ·¢±íÆÀÂÛ£¬Ëµ³ö×Ô¼ºµÄ¿´·¨ºÍÆäËüС»ï°éÃÇ·ÖÏíÒ²²»´íŶ£¡·¢±íÊéÆÀ»¹¿ÉÒÔ»ñµÃ»ý·ÖºÍ¾Ñé½±Àø£¬ÈÏÕæдԴ´ÊéÆÀ ±»²ÉÄÉΪ¾«ÆÀ¿ÉÒÔ»ñµÃ´óÁ¿½ð±Ò¡¢»ý·ÖºÍ¾Ñé½±ÀøŶ£¡