*

Microsoft .NET §Þ³N¥N¨¥¤H±MÄæ¡G

¹w¨¾³nÅé±M®×¥¢±Ñªº§®¤è - AntiPattern

§@ªÌ¡GªLÄ£¬Ã

2004¦~ 1 ¤ë

¥Rº¡­·ÀIªº³nÅé¶}µo±M®×

¦Û±q¹q¸£µo©ú«á¡A¼Æ¦Ê¸Uªºµ{¦¡³]­p®v±N¨t²Î»Ý¨DÂàͦ¨¹q¸£¬Ý±oÀ´ªº«ü¥O¡A¤£ª¾²£¥X¤F¦h¤Ö»õ¦æªºµ{¦¡¡A¦³¤@¨Çµ{¦¡¤w¸g¦b¾÷¾¹¸Ì­±°õ¦æ¦h¦~¡A³Ð³y¤F³\¦h°Ó·~»ù­È¡A¤]¦³¤@¨Çµ{¦¡¦]¬°¥¢»~¦Ó¾É­P­«¤j·l¥¢¡A¦ý¬Û·í¤j¤ñ²v (70%) ªºµ{¦¡«h¦]¬°°¾Â÷»Ý¨D¡B©ÎµLªk¸Ñ¨M°ÝÃD¦Ó«Å§i¥¢±Ñ¡C®Ú¾Ú The Standish Group ¹ï³nÅé±M®×¶i¦æ¤j³W¼Òªº½Õ¬d¡A2000 ¦~ªº³ø§iÅã¥Ü³nÅé±M®×ªº¦¨¥\²v¤£¨ì 30%¡A©Ò¥H§Ú­Ì»Ý­n¦³§ó¦nªº¤èªk¨Ó¶i¦æ³nÅé¶}µoªº¤u§@¡C

¤°»ò¬O AntiPatterns

¬°¤F´£°ª³nÅé±M®×¦¨¥\ªº¤ñ²v¡A±M®a¾ÇªÌ´£¥X³\¦h¥ý¶iªº³nÅé¶}µo§Þ³N¡A¨Ò¦p Iterative development process¡Bª«¥ó¾É¦V§Þ³N¡B³]­p¼Ò¦¡ (design patterns)¡B³nÅ餸¥ó¡B¥­¥x»P®Ø¬[ (Platform & Framework)¡A³o¨Ç¥¿¦V¥B¨ã¦³«Ø³]©Êªº§Þ³N¨ó§U§Ú­Ì¥¿½T¦a«Øºc¸ê°T¨t²Î¡C¥»¤å­n¤¶²Ðªº¤º®eÄÝ©ó°f¦V«ä¦Òªº§Þ³N¡AºÙ¬° AntiPatterns¡A¥¦­Ì¬O±q³\¦h¥¢±Ñªº³nÅé±M®×¤¤Âk¯Ç¥X¨Óªº¿ù»~¼Ò¦¡¡A©Ò¥H³nÅ餤¥]§t¶V¦h AntiPatterns¡A¥¢±Ñ¾÷²v¶V°ª¡CAntiPatterns ¼sªx¥X²{¦bªº¨t²Î¤W¡A¦ý¤´¦³³\¦h³nÅé¤H­û¦b¶}µo·s¨t²Î®É­«ÁÐÂÐÂá¡A¦Ó¥B¥Ø«e¦³¤@¥b¥H¤Wªº MIS ¸ê°T¤H­û»Ý­nºûÅ@©Î©µ®i¦Ñªº¨t²Î¡A©Ò¥H¼ô±x AntiPatterns ¤£¦ý¦³§U©ó§ïµ½Â¨t²ÎªººûÅ@¤u§@¡A¦Ó¥B¥i¥H­°§C¶}µo·s¨t²Îªº¥¢±Ñ­·ÀI¡C

AntiPattern ªº´y­z»P¤ÀÃþ

´y­z AntiPattern ¦³Â²©ú¤Î§¹¾ã¤GºØ§Î¦¡¡A²©ú§Î¦¡ (Mini-Form) ¥]§t¦WºÙ (name)¡B°ÝÃD´y­z (Problem)¡B¸Ñ¨M°ÝÃDªº¤è®× (Refactored Solution)¡A¦³®É­Ô¨Ï¥Î¤@´Tº©µe©Î¤@«h½ì»D¨Ó¬ðÅã°ÝÃDªº¥»½è¡C§¹¾ã§Î¦¡ (Full-Template) «h¥]§t¦WºÙ»P§O¦W¡A°ÝÃDªº´y­z¡AÂÇ¥H¿ëÃѰÝÃDªº¯gª¬¡A¤£¨}ªº«áªG¡A°ÝÃDªº®Ú¥»­ì¦]¡A¤Î¸Ñ¨M°ÝÃDªº¤è®×¡CAntiPatterns «ö·Ó³nÅé¶}µoªº¤j²¤¤À¤u³W«h¤À¬°¤T¤jºØÃþ¡GDevelopment (µ{¦¡³]­p)¡BArchitecture (¬[ºc) »P Management (ºÞ²z)¡A¤À§O¤¶²Ð¦p¤U¡C

µ{¦¡³]­pªº AntiPatterns

Development AntiPatterns ¥D­n¬O´y­z¤£¨}µ{¦¡³]­p¡A¨Ò¦pªì¾Çª«¥ó¾É¦V§Þ³Nªºµ{¦¡³]­p®v±`¥Ç The Blob AntiPattern¡AThe Blob ªº§O¦W¬O God Class¡A¨ä¯gª¬¬Oµ{¦¡¤¤¥]§t¤@­Ó«D±`½ÆÂøªºÃþ§O (class) ­t³d°õ¦æ¥þ³¡ªº¥\¯à¡A¦Ó¨ä¥LªºÃþ§O«h¥u¦³¸ê®Æ©Î§t¦³¤Ö¶qªº¥\¯à¡A¾É­P³oºØ AntiPattern ªº®Ú¥»­ì¦]¬Oµ{¦¡³]­p®v¤´¨Ï¥Î Procedural ¤è¦¡³]­pµ{¦¡¡A¸Ñ¨M³o°ÝÃDªº¤èªk¬O±NÀ³¥Îµ{¦¡ªº¥\¯à§¡¿Å¤À°t¨ì¾A·íªºÃþ§O¡C¨ä¥L±`¨£ªº AntiPatterns ¨Ò¦p Spaghetti code¡Gªí¥Ü¤@¹Î²V¶Ãªºµ{¦¡½X¡A³q±`³s­ì¨Ó¼¶¼gªº¤H³£·d¤£²M·¡¨ä¤¤ªºÅÞ¿è¡A§ó¤£¥Î»¡±µ¤âºûÅ@ªº¤H¡CLava Flow (¤õ¤s©¥¼ß¬y)¡Gªí¥Üµ{¦¡ªº¥\¯à§ïÅܩΫùÄòºt¤Æ«á¡A¯d¤U³\¦h¤w¸g¤£¦A¨Ï¥Î©ÎµL¤HÃö¤ßªºµ{¦¡½X¡A¦ý¤S¨S¦³¤H·d²M·¡§R°£³o¨Ç code ·|¤£·|¦³·N¥~¼vÅT¡CInput Kludge¡Gµ{¦¡¤¤¥]§t¤C«÷¤K´êªº¿é¤JÅçÃÒ¥\¯à¡A³q±`¬O¦]¬°¿é¤JÄæ¦ì¤¹³\¨Ï¥Î Free format¡A¾É­PÃø¥H³B²z¿é¤Jªº¸ê®Æ¡C

¬[ºcªº AntiPatterns

Architecture AntiPattern ±`¨£ªº¨Ò¤l¬O Architecture by Implication (¨S¦³©ú½Tªº¬[ºc)¡A©Ò¥H¨C­Ó¤H®Ú¾Ú¦Û¤v»{¬°ªº¬[ºc Coding¡A³oºØª¬ªpªº®Ú¥»­ì¦]¬O¨S¦³¤H­t³d¬[ºc³]­p¡A¨ä¸Ñ¨M¤èªk¬O¦³¤H­t³d§â¨t²Î¤Á³Î¬°¼Æ­Ó¥D­nªº³nÅ餸¥ó¡A©w¸q¨C­Ó¤¸¥óªº¤¶­±¤Î¤¸¥ó¶¡ªº·¾³q¼Ð·Ç¡C¨ä¥L±`¨£ªº AntiPatterns ¨Ò¦p Jumble (Âø¶Ã)¡G³nÅ餸¥ó¤¬¬Û©I¥s¡A¨ä¶¡ªºÃö«YªÈÄñ²V¶Ã¡A¸Ñ¨Mªº¤èªk¤§¤@¬O¿í´`¦h¼h¦¡¬[ºcªº³]­p³W½d¡CVendor Lock-in¡GÀ³¥Îµ{¦¡ª½±µ©I¥s¥~ÁʳnÅ餸¥óªº¥\¯à¡A¨Ï±oÀ³¥Îµ{¦¡°ª«×­Ê¿à¦¹¥~ÁʳnÅé¡A¨ä¸Ñ¨M¤è¦¡¬O¸ò¾Ú»Ý¨D³]­p¤@¼h¤¶­±»P¥~ÁʳnÅé·¾³q¡AÀ³¥Îµ{¦¡§Y¥i±o¨ì¸û°ªªº¿W¥ß©Ê¡C

ºÞ²zªº AntiPatterns

Management AntiPattern ªº¨å«¬¬O Project MisManagement (¤£¨}ªº±M®×ºÞ²z)¡G®Ú¥»­ì¦]³q±`¬O¹ï±M®×ªº¤£Ãö¤ß¡A¦]¦Ó©¿²¤¤F¾A«×¦a³W¹º¡B±±¨î»PÀˬdµ¥µ¥±M®×¦¨¥\ªº¥²­n¦]¯À¡C¨ä¥Lªº AntiPatterns ¨Ò¦p Analysis Paralysis (¤ÀªRÅõºÈ)¡G¨t²Î¤ÀªR®v¬°¨D§¹¬ü©Î¹L«×¥J²Ó¦Ó©µ»~³W®æ½T¥ß¡AÀ½À£«áÄò¤u§@ªº®Éµ{¡A¨ä¸Ñ¨M¤è®×¬O±Ä¥Î»¼¼W¦¡¶}µo¬yµ{ (Incremental & Iterative development process)¡CViewgraph Engineering¡G¶}µo¤H­û³Q»s§@¹Ïªí¤Î¤å¥óªº¤u§@©µ»~®Éµ{¡A­ì¦]³q±`¬O¶}µo¤H­û¨Ï¥Î¤£·íªº¤u¨ã¡A¸Ñ¨Mªº¤èªk«h¬O³]ªk¨ú±o¾A·íªº¤u¨ã¡C

ÂÔ·VÀ³¥Î AntiPatterns

À³¥Î AntiPatterns ®É¥²¶·ª`·N¤@¨Çª¬ªp¥HÁ×§K¤Ï®ÄªG¡A­º¥ý­nª`·Nªº¬O«ü¥X²Õ´©Îµ{¦¡ªº AntiPatterns ¥i¯à偒¤Î¥L¤H¡A¨Ã¤Þ°_¤¬¬Û«ü³dªº±¡¨Æ¡A©Ò¥H­n§â AntiPattern ¿Ä¤J³nÅé¶}µo¬yµ{¡A¨Ï¤§¶¶§Q¦¨¬°§ïµ½«~½èªº¤u§@§Þ¥©¡C¨ä¦¸¬O¿í´`¡y¦pªG¨SÃa´N¤£­n­×²z¡z­ì«h¡A¤£­n¬°¤F°l¨D§Þ³N§¹¬ü¦Ó«_µM°Ê¤â¡C¦pªG»Ý­n¶i¦æ§ïµ½¡A«hÀ³§´µ½³W¹º¡A¨ÃÁ×§K¦P¤@®É¶¡³B²z¦h­Ó AntiPatterns¡C

µ²½×

Design Patterns »P AntiPatterns ¬O¬Û»²¬Û¦¨ªº§Þ³N¡ADesign Patterns ¬O¸Ñ¨M°ÝÃDªº¥¿½T¼Ò¦¡¡A¦Ó AntiPatterns «h¬O¾É­P¥¢±Ñªº¿ù»~¤èªk¡A©Ò¥H§Ú­Ì¨Ï¥Î Design Patterns ¶}µo³nÅé¡A¨Ï¥Î AntiPatterns ´£¿ô§Ú­ÌÁ×¶}³´¨À¡C¦ý¬OÀô¹Ò©Î§Þ³NªºÅܾE¡A²{¦bªº Design Patterns ¥i¯àÅܦ¨¥¼¨Óªº AntiPatterns¡A¨Ò¦p·í¦~ªºµ²ºc¤Æ¨t²Î¤ÀªR»P³]­p§Þ³N«K¬O³Ì©úÅã¨Ò¤l¡C©Ò¥H³nÅé¶}µo¤H­û¦b¹B¥Î Patterns ®É¡A°È¥²¦Ò¼{¾A¥Îªº±ø¥ó¡B½d³ò¡B¤Î¥I¥Xªº¦¨¥»¡A¤è¯à¹ê²{§Æ±æ±o¨ìªº®Ä¯q¡C

¬ÛÃö¸ê·½¡G


§@ªÌ²¤¶

ªLÄ£¬Ã¬° Microsoft.NET §Þ³N¥N¨¥¤H¡A¥Ø«e¥ô¾²Ä¤Tªi¸ê°T§Þ³NÁ`ºÊ¡A¾ú¥ô²Ä¤Tªi¸ê°T±Ð¨|°V½m³B³Bªø¤Î¨|ùּƦì¬ì§ÞÁ`¸g²z¡C±Mªø©ó¸ê°T¨t²Î³W¹º¤Î³nÅé¶}µo§Þ³N¡A¾Ö¦³ Microsoft MCSD / MCSE / MCDBA¡ARational OOAD¡ALotus Notes / Domino µ¥»{ÃÒ¸ê®æ¡A¨Ã¬° Microsoft.NET / Java J2EE / ª«¥ó¾É¦V¨t²Î¤ÀªR³]­pªº¸ê²`Á¿®v¤Î¦h®a¤½¥ÁÀç¾÷ºcªº e ¤ÆÅU°Ý¡C

·N¨£»P¤ä´©

 ±z¦³¥ô¦ó°ÝÃD¡B·N¨£©Î«ØÄ³¶Ü¡H±z¥i¥H³z¹L¤U¦C¹q¤l¶l¥ó»P§@ªÌ³sµ¸¡G
 lyaochen@ms3.hinet.net