diff --git a/README.md b/README.md index f4fa5df9..0449f5d5 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,18 @@ Fileã€�InputStream å’Œ OutputStreamã€�Reader å’Œ Writerã€�Serializableã€�Socket 以å�Š NIO +# ç¼–ç �实践 + +> [é‡�æž„](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/é‡�æž„.md) + +> [编写å�¯è¯»ä»£ç �的艺术](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/编写å�¯è¯»ä»£ç �的艺术.md) + +# 个人æ��å�‡ + +> [黑客与画家](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/黑客与画家.md) + +> [程åº�员的è�Œä¸šç´ å…»](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/程åº�员的è�Œä¸šç´ å…».md) + # 资料下载 > [百度网盘](https://pan.baidu.com/s/1o9oD1s2#list/path=%2F) diff --git a/notes/程åº�员的è�Œä¸šç´ å…».md b/notes/程åº�员的è�Œä¸šç´ å…».md new file mode 100644 index 00000000..b0a7761d --- /dev/null +++ b/notes/程åº�员的è�Œä¸šç´ å…».md @@ -0,0 +1,129 @@ + +* [ÒëÕßÐò](#ÒëÕßÐò) +* [ǰÑÔ](#ǰÑÔ) +* [רҵÖ÷Òå](#רҵÖ÷Òå) +* [˵²»](#˵²») +* [˵ÊÇ](#˵ÊÇ) +* [±à³Ì](#±à³Ì) +* [²âÊÔÇý¶¯¿ª·¢](#²âÊÔÇý¶¯¿ª·¢) +* [Á·Ï°](#Á·Ï°) + + +# ÒëÕßÐò + +×÷Õß Bob ´óÊ壬ָÓС¶Ãô½ÝÈí¼þ¿ª·¢£ºÔ­Ôò¡¢Ä£Ê½Óëʵ¼ù¡·¡¶´úÂëÕû½àÖ®µÀ¡·¡¶³ÌÐòÔ±µÄÖ°ÒµËØÑø¡· + +¶ÔÓÚ½â¾öÎÊÌâ£¬ÖØÒªµÄ²»ÊÇÎÊÌâ±¾Éí£¬¶øÊǽâ¾öÎÊÌâµÄ·½Ê½¡¢²½ÖèÒÔ¼°·´Ë¼µÄÉî¶È£¬Õâ¾ÍÊÇÖ°ÒµËØÑø¡£ + +# ǰÑÔ + +ÓÉÓÚ¹ÜÀíÕßÃæÁٺܴóµÄ²ÆÎñºÍÕþÖÎѹÁ¦£¬ËûÃÇÎÞÊÓ¼¼ÊõÈËÔ±·¢³öµÄΣÏÕ¾¯¸æ£¬±§×ŽÄÐÒÐÄÀí·¢ÉäÁË¡°ÌôÕ½Õß¡±º½Ìì·É»ú£¬×îÖÕµ¼Öº½Ìì·É»úÔڸ߿ձ¬Õ¨¡£Ëä˵¼¼ÊõÈËÔ±ÒѾ­×öºÜ¶àÊÂÇéÈ¥×èÖ¹Õâ´Î·¢É䣬µ«ÊDz¢²»ÊÇ˵×öÁËËùÓÐËûÃÇÄÜ×öµÄ£¬ÀýÈçËûÃǾÍûÓдòµç»°È¥ÐÂÎĄ̊½Ò¶´Ë´Î·¢ÉäµÄΣÏÕÐÔ¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/bccb799f-56e2-4356-95f0-a9ea05b0de2a.jpg) + + +# רҵÖ÷Òå + +רҵÖ÷Òå²»½öÒâζ×ÅÈÙÓþºÍ½¾°Á£¬Ò²Òâζ×ÅÔðÈΡ£ + +×÷ÕßÔÚ×Ô¼º¿ª·¢µÄÒ»¸öµç»°Ïß·¹ÊÕϼì²âϵͳʱ£¬ÒòΪ¸Ï×ÅÔÚµ½ÆÚÈÕ½»¸¶Ð¹¦ÄÜ£¬Ã»ÓжÔÕû¸öϵͳ½øÐвâÊÔ£¬µ¼ÖÂÁËÒ»¸ö bug µÄ³öÏÖ¡£×÷ÕßÈÏΪÕâÊÇÒ»ÖÖ²»¸ºÔðÈεıíÏÖ£¬Ò²¾ÍÊDz»×¨ÒµµÄ±íÏÖ¡£ + +´úÂëÖÐÄÑÃâÓÐ bug£¬µ«ÊDz»Òâζ×ÅÄã²»ÓÃΪ bug ¸ºÔð¡£ + +ÓÐÈ衄 QA µ±³É²é bug µÄ»úÆ÷£¬µÈ×Å QA ·¢ÏÖ bug£¬¶ø×Ô¼ºÈ´²»Ö÷¶¯È¥·¢ÏÖ bug£¬ÕâÊDz»¶ÔµÄ¡£ + +ΪÁ˱£Ö¤´úÂëµÄÕýÈ·ÐÔ£¬ÐèÒªÐ´Ò»Ð©ËæÊ±¿ÉÒÔÔËÐеĵ¥Ôª²âÊÔ£¬²¢ÇÒ²»¶ÏµØÈ¥ÔËÐÐËüÃÇ¡£ + +Èí¼þÏîÄ¿µÄ¸ù±¾Ô­Ôò - Ò×ÓÚÐ޸ġ£ÎªÁËÈÃ×Ô¼ºµÄÈí¼þÒ×ÓÚÐ޸ģ¬ÐèÒª¾­³£È¥ÐÞ¸ÄËü£¡ + +µ¥Ôª²âÊÔ¿ÉÒÔÈóÌÐòÔ±¸üÓÐ×ÔÐÅÈ¥Ð޸ĴúÂ룬ÒòΪËü»áÈÃÈËÈ·ÐÅÐ޸ĵØÊÇ·ñÕýÈ·¡£ + +×¨ÒµËØÑø°üÀ¨ÒÔÏÂÄÚÈÝ£º + +1. ¼á³Öѧϰ +2. ÿÌìÁ·Ï°Ò»Ð©¼òµ¥µÄ±à³ÌÌâÄ¿ +3. ÓëËûÃǺÏ×÷£¬´Ó±Ë´ËÉíÉÏѧµ½¸ü¶à¶«Î÷ +4. ½»Á÷¡£Í¨¹ý½»Á÷±í´ï×Ô¼ºµÄ˼Ï룬·¢ÏÖ×Ô¼ºµÄ²»×ãÒÔ¼°Óë±ðÈË˼ÏëÉϵIJîÒì¡£ +5. Á˽âÒµÎñÁìÓò£¬ÕÒ¼¸±¾Ïà¹ØÁìÓòµÄÊé¿´¡£ +6. Óë¹ÍÖ÷ / ¿Í»§±£³ÖÒ»Ö +7. ǫѷ£¬ÒòΪËûÃÇÖªµÀ×Ô¼ºÒ²¿ÉÄÜ·¸´í¡£ + +# ˵²» + +¶ÔһЩ²»ºÏÀíµÄÒªÇ󣬲»ÄÜÖ»ÊÇ˵¡°ÊÔÊÔ¿´¡±£¬Õâ»á±»µ±³ÉÊǽÓÊÜÁËÕâ¸öÒªÇó¡£Èç¹û×Ô¼ºÉîÖªÕâÖÖ²»ºÏÀíµÄÒªÇó»áµ¼ÖÂÑÏÖØµÄºó¹û£¬¾Í²»ÄÜÈÎÓÉËü·¢Õ¹ÏÂÈ¥£¬¶ÔÕâÒ»ÒªÇó˵¡°²»¡±¡£ + +˵¡°²»¡±Ê±ÒªÓÃ×îÏêϸµÄϸ½ÚÀ´ËµÃ÷£¬¶ø²»ÊÇ·³ÔêµØ·´²µ¡£ + +µ±ÒªÇóÃ÷ÏÔ²»ºÏÀíʱ£¬¿ÉÒÔЭÉÌһЩ˫·½¶¼ÄܽÓÊܵķ½°¸¡£ + +"ÓпÉÄÜд³öºÃ´úÂëÂð" ÕâÆª²©ÎÄ£¬½²ÊöÁËÒ»´Î¿ª·¢Ò»¼ÒÁãÊÛÉÌΪÁËÔÚ"ºÚÉ«ÐÇÆÚÎå"Äܹ»Èù˿Ϳ´µ½ÉÌÆ·ÐÅÏ¢É̵êÐÅÏ¢ÒÔ¼°·¢²¼ÓÅ»ÝÂëµÈ¹¦ÄÜµÄ ipone Ó¦Óã¬×ʼÁãÊÛÉ̵ľ­Àí³Ðŵ˵ֻҪд¸öÓ²±àÂëµÄÓ¦ÓþÍÐÐÁË£¬µ«Êǿͻ§ËùÒªµÄÈκÎÒ»ÏÄÜ£¬×ܱÈËü×ʼʱËù˵µÄÒª¸´ÔÓÐí¶à¡£Ãæ¶Ôʱ¼äµÄ½ô¼±£¬¿Í»§·½µÄ²»ÅäºÏ£¬ÒÔ¼°ÐèÇóµÄ±ä¸ü£¬Èò©ÎÄ×÷ÕßдÁËÒ»¶ÑºÜÀõĴúÂ룬¶øËû×Ô¼ºÈ·Êµ¶ÔÄÇЩÉè¼ÆÄ£Ê½µÈ¸ß¼¶¿ª·¢¼¼ÊõÊǷdz£ÈÈÖԵġ£ËùÒÔËûÈÏΪÔÚʵ¼ÊµÄ¿ª·¢ÖÐÒòΪ¿Í»§µÄÐèÇóµÈÒòËØ£¬ºÜÄÑд×÷×Ô¼ºÏëдµÄ´úÂë¡£Bob ÈÏΪ£¬ÉÏÃæÄÇÆª²©ÎĵÄ×÷Õß²ÅÊǴ˴οª·¢¹ý³ÌÅöµ½µÄÄÇЩÎÊÌâµÄ¸ºÔðÈË£¬ÒòΪËûûÓжÔÄÇЩ²»ºÏÀíµÄÒªÇó˵²»¡£ + +# ˵ÊÇ + +×ö³ö³ÐŵµÄÊÇÈý¸ö²½Ö裺¿ÚÍ·ÉÏ´ðÓ¦£¬·ÅÔÚÐÄÀ¸¶ÖîÐж¯¡£ + +ȱ·¦³ÐŵµÄ´ÊÓ + +1. ÐèÒª£ºÎÒÐèÒª°ÑÕâÊÂ×öÍꣻ +2. Ï£Íû£ºÏ£Íû½ñÌìÎÒÄÜÍê³ÉÈÎÎñ£» +3. ÈÃÎÒÃÇ£ºÈÃÎÒÃǰÑÕâ¼þÊÂ×öÍê¡£ + +ȱ·¦³ÐŵµÄÈ˲»»á°ÑÖØµã·ÅÔÚ×Ô¼ºÉíÉÏ£¬Ò²²»»áÃ÷ȷ˵Ã÷Ò»¼þÊÂÇéµÄ½ØÖ¹ÈÕÆÚ¡£ÕæÕýµÄ³ÐŵÊÇÕâÑùµÄ¡°ÎÒ»áÔÚ...֮ǰ...¡± + +¶Ô×Ô¼ºÎÞ·¨ÍêÈ«ÕÆÎÕµÄÊ£¬²»ÒªÇáÒ׳Ðŵ¡£ + +·¢ÏÖ×Ô¼ºÎÞ·¨×öµ½³Ðŵ£¬Á¢ÂíÈ¥µ÷Õû±ðÈ˶ÔÄãµÄÔ¤ÆÚ¡£ + +¡°ÊÔÊÔ¿´¡±ËµÃ÷×Ô¼º¶Ô³ÐŵµÄÄÚÈÝÓеã¹Ë¼É£¬Òò´Ë²»ÒªÓÃÊÔÊÔ¿´À´×÷ΪһÖÖ³Ðŵ¡£Èç¹û²»ÄÜÈ·ÐÅ×Ô¼ºÄÜ´ïµ½³ÐŵµÄÄÚÈݶøËæ±ã³Ðŵ£¬ÄÇô×îºóÍùÍù»á²úÉúÑÏÖØµÄºó¹û¡£ + +# ±à³Ì + +Òª¾«Í¨Ò»Ïî¼¼Êõ£¬Òª¶Ô¸Ã¼¼Êõ¾ß±¸¡°ÐÅÐÄ¡±ºÍ¡°¸ÐÖªÄÜÁ¦¡±¡£ + +״̬²»ºÃµÄʱºò×îºÃ±ðд´úÂ롣״̬²»ºÃ·ÖΪ£ºÆ£ÀÍ£¬±ÈÈç°¾Ò¹£»½¹ÂÇ£¬ÒòΪÍâ½çµÄÊÂÇéÈÃ×Ô¼º²»Äܰ²ÐÄÏÂÀ´£¬Õâ¸öʱºòÓ¦¸Ãϵ÷ÕûºÃÔÙ½øÐбà³Ì¡£ + +½øÈëÁ÷״̬µÄ¸Ð¾õºÜºÃ£¬¾õµÃ¿ÉÒÔ×öºÜ¶àÊ£¬µ«ÊÇÁ÷״̬ÆäʵÊÇÒ»ÖÖdz²ãÚ¤Ï룬˼άÄÜÁ¦»áϽµ£¬Òò´ËÒª±ÜÃâ½øÈëÁ÷״̬¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f0321ed1-fa93-460e-951b-4239fef819f3.jpg) + +Á÷״̬µÄÌØµãÊǸô¾ø¹µÍ¨£¬¶ø½á¶Ô±à³ÌÄܹ»´òÆÆÕâÖÖ¸ô¾ø£¬Òò´Ë½á¶Ô±à³ÌÄܹ»·ÀÖ¹½øÈëÁ÷״̬¡£ + +µ±×Ô¼ºÃ»·¨¼ÌÐø±à³Ìʱ£¬½á¶Ô±à³ÌÊǸöºÃÑ¡Ôñ£¬½á¶Ô±à³Ìʱ£¬´óÄÔºÍÉíÌå»áÓл¯Ñ§±ä»¯£¬Ò²¾ÍÊÇ˵˼ά·½Ê½»á¸Ä±ä£¬ÓÐÖúÓÚÍ»ÆÆµ±Ç°µÄ˼ά×èÈû״̬¡£ + +ÌýÒôÀÖʱÒôÀÖ»áÕ¼ÓÃÒ»²¿·ÖÄÔÁ¦×ÊÔ´£¬Òò´Ë»áµ¼ÖÂЧÂÊϽµ£¬µ«ÊÇÕâ²»ÊǾø¶Ô¡£ + +¶àÊäÈëһЩ´´ÔìÐÔµÄÄÚÈÝ£¬±ÈÈç¿Æ»ÃС˵µÈ£¬×Ô¼ºµÄ´´ÔìÁ¦Ò²»áµÃµ½ÌáÉý¡£ + +µ÷ÊÔʱ¼äÒ²ºÜ±¦¹ó£¬²âÊÔÇý¶¯¿ª·¢Äܹ»½µµÍµ÷ÊÔµÄʱ¼ä¡£ + +±àÂëºÍÅÜÂíÀ­ËÉÒ»Ñù£¬ÎÞ·¨È«³ÌÒÔ×î¿ìµÄËٶȳå´Ì£¬Ö»ÄÜͨ¹ý±£³ÖÌåÁ¦ºÍά³Ö½Ú×àÀ´È¡µÃʤÀû¡£Òò´ËÒª±£³ÖºÃ×Ô¼ºµÄ½Ú×࣬ÔÚÆ£À͵ÄʱºòÊʵ±ÐÝÏ¢¡£ + +¶¨ÆÚ×ö½ø¶ÈºâÁ¿£¬ÓÃÀÖ¹ÛÔ¤¹À¡¢±ê×¼Ô¤¹ÀºÍ±¯¹ÛÔ¤¹ÀÕâÈý¸öʱ¼äµã¡£ + +Èç¹û×Ô¼ºÔ¤¹ÀµÄ½ø¶È¸Ï²»ÉϽØÖ¹Ê±¼ä£¬²»Òª´ðÓ¦ÔÚ½ØÖ¹Ê±¼äÈ¥Íê³É£¬ÒòΪÄãÖªµÀ¸ù¾Ý×Ô¼ºµÄÔ¤¹ÀÕâÊDz»¿ÉÄܵġ£ + +ÈÎÎñÍê³ÉµÄ±ê׼ͨ³£ÓÃÒ»¸ö×Ô¶¯»¯µÄÑéÊÕ²âÊÔÀ´¶¨Òå¡£ + +°ïÖúËûÈËÒ²»á¸ø×Ô¼º´øÀ´ºÃ´¦£¬ÔÚ°ïÖú±ðÈ˵Äʱºò²»ÒªÈÃ×Ô¼º¿´ÆðÀ´ºÜ²Ö´Ù£¬¾ÍÏñÊÇÔÚËæ±ãÓ¦¸¶¡£Ò»°ã°ïÖú±ðÈ˲»ÐèÒªÌØ±ð¶àµÄʱ¼ä¡£Ò²ÒªÑ§»áÇëÇó±ðÈ˵İïÖú£¬ÒòΪ×Ô¼º²»¿ÉÄÜÊÇÍòÄܵģ¬Í¨¹ý±ðÈ˵İïÖúÄܸüºÃµÄ½â¾öÎÊÌâ¡£ + +# ²âÊÔÇý¶¯¿ª·¢ + +TDD µÄÔËÐÐÖÜÆÚºÜ¶Ì£¬¿ÉÄÜÒ»Á½·ÖÖӾͿÉÒÔÔËÐÐÒ»´Î³ÌÐò£¬¶ÌÖÜÆÚ¿ÉÒÔ¿ìËٵõ½·´À¡£¬·´À¡ÔÚ¿ª·¢ÖÐÌØ±ðÖØÒª£¬Ò»·½ÃæÊÇÌá¸ß³ÌÐòÔ±±àÂëµÄ¼¤Ç飬ÁíÒ»·½ÃæÊÇÄܹ»¼°Ôç·¢ÏÖ bug£¬¶ø bug Ô½Ôç·¢ÏÖÐ޸ĵشú¼ÛÒ²Ô½µÍ¡£ + +TDD Èý·¨Ôò£º + +1. ÏÈд²âÊÔ£» +2. ÔÚÒ»¸öµ¥Ôª²âÊÔʧ°ÜµÄʱºò£¬²»ÒªÔÙд²âÊÔ´úÂ룻 +3. ²úÆ·´úÂëÄÜÇ¡ºÃͨ¹ýµ±Ç°Ê§°ÜµÄµ¥Ôª²âÊÔ¼´¿É£¬²»Òª¶àд¡£ + +TDD Óŵã + +1. È·¶¨ÐÔ£ºÈ·¶¨µ±Ç°ÏµÍ³ÊÇ·ñÕýÈ·£» +2. ÐÅÐÄ£º³ÌÐòÔ±¸üÓÐÐÅϢȥÐ޸ĻìÂҵĴúÂ룬ÒòΪͨ¹ýµ¥Ôª²âÊÔ¿ÉÒÔÖªµÀÊÇ·ñÐ޸ĵØÕýÈ·£» +3. Îĵµ£ºµ¥Ôª²âÊÔÊǵײãÉè¼ÆÏ¸½ÚµÄÎĵµ£¬Í¨¹ýÔĶÁµ¥Ôª²âÊÔÄܹ»ÖªµÀ³ÌÐòµÄÔËÐз½Ê½£» + +# Á·Ï° + +¿¨ËþÔÚÎäÊõÀïÃæÊÇÒ»Ì×Éè¼ÆºÃµÄÕÐʽ£¬¸ÃÕÐʽģÄâÕæÊµ²«¶·³¡¾°£¬Ï°ÎäÕß²»¶ÏѵÁ·À´ÈÃÉíÌåÊìϤ¸ÃÕÐʽ£¬´Ó¶ø×öµ½´¿Êì¡£±à³Ì¿¨ËþÊÇÒ»Ì×±à³Ì¹ý³ÌÇû÷Êó±êºÍ¼üÅ̵͝×÷£¬Á·Ï°Õß²»ÊÇΪÁ˽â¾öÕæÕýµÄÎÊÌ⣬ÒòΪÒѾ­ÖªµÀÁ˽â¾ö·½°¸£¬¶øÊÇÁ·Ï°½â¾öÕâ¸öÎÊÌâËùÐèÒªµÄ¶¯×÷ºÍ¾ö²ß¡£ + +ÍßÈø¼´Ê¹Á½È˶ÔÁ·µÄ¿¨Ëþ¡£ÔÚ±à³ÌÁìÓò£¬¿ÉÒÔÊÇÒ»¸öÈËдµ¥Ôª²âÊÔ£¬ÁíÒ»¸öÈËд³ÌÐòͨ¹ýµ¥Ôª²âÊÔ¡£±ÈÈ磬һ¸öÈËʵÏÖÅÅÐòËã·¨£¬Ð´²âÊÔµÄÈË¿ÉÒÔºÜÈÝÒ×µØÏÞÖÆËٶȺÍÄڴ棬¸øÍ¬°éʩѹ¡£ diff --git a/notes/编写å�¯è¯»ä»£ç �的艺术.md b/notes/编写å�¯è¯»ä»£ç �的艺术.md new file mode 100644 index 00000000..5f14f947 --- /dev/null +++ b/notes/编写å�¯è¯»ä»£ç �的艺术.md @@ -0,0 +1,342 @@ + +* [µÚ 1 Õ ¿É¶ÁÐÔµÄÖØÒªÐÔ](#µÚ-1-ÕÂ-¿É¶ÁÐÔµÄÖØÒªÐÔ) +* [µÚ 2 Õ ÓÃÃû×Ö±í´ï´úÂ뺬Òå](#µÚ-2-ÕÂ-ÓÃÃû×Ö±í´ï´úÂ뺬Òå) +* [µÚ 3 Õ Ãû×Ö²»ÄÜ´øÀ´ÆçÒå](#µÚ-3-ÕÂ-Ãû×Ö²»ÄÜ´øÀ´ÆçÒå) +* [µÚ 4 Õ Á¼ºÃµÄ´úÂë·ç¸ñ](#µÚ-4-ÕÂ-Á¼ºÃµÄ´úÂë·ç¸ñ) +* [µÚ 5 Õ ±àдעÊÍ](#µÚ-5-ÕÂ-±àдעÊÍ) +* [µÚ 6 Õ ÈçºÎ±àдעÊÍ](#µÚ-6-ÕÂ-ÈçºÎ±àдעÊÍ) +* [µÚ 7 Õ Ìá¸ß¿ØÖÆÁ÷µÄ¿É¶ÁÐÔ](#µÚ-7-ÕÂ-Ìá¸ß¿ØÖÆÁ÷µÄ¿É¶ÁÐÔ) +* [µÚ 8 Õ ²ð·Ö³¤±í´ïʽ](#µÚ-8-ÕÂ-²ð·Ö³¤±í´ïʽ) +* [µÚ 9 Õ ±äÁ¿Óë¿É¶ÁÐÔ](#µÚ-9-ÕÂ-±äÁ¿Óë¿É¶ÁÐÔ) +* [µÚ 10 Õ ³éÈ¡º¯Êý](#µÚ-10-ÕÂ-³éÈ¡º¯Êý) +* [µÚ 11 Õ һ´ÎÖ»×öÒ»¼þÊÂ](#µÚ-11-ÕÂ-Ò»´ÎÖ»×öÒ»¼þÊÂ) +* [µÚ 12 Õ ÓÃ×ÔÈ»ÓïÑÔ±íÊö´úÂë](#µÚ-12-ÕÂ-ÓÃ×ÔÈ»ÓïÑÔ±íÊö´úÂë) +* [µÚ 13 Õ ¼õÉÙ´úÂëÁ¿](#µÚ-13-ÕÂ-¼õÉÙ´úÂëÁ¿) + + +# µÚ 1 Õ ¿É¶ÁÐÔµÄÖØÒªÐÔ + +±à³ÌÓкܴóÒ»²¿·Öʱ¼äÊÇÔÚÔĶÁ´úÂ룬²»½öÒªÔĶÁ×Ô¼ºµÄ´úÂ룬¶øÇÒÒªÔĶÁ±ðÈ˵ĴúÂë¡£Òò´Ë£¬¿É¶ÁÐÔÁ¼ºÃµÄ´úÂëÄܹ»´ó´óÌá¸ß±à³ÌЧÂÊ¡£ + +¿É¶ÁÐÔÁ¼ºÃµÄ´úÂëÍùÍù»áÈôúÂë¼Ü¹¹¸üºÃ£¬ÒòΪ³ÌÐòÔ±¸üÔ¸ÒâÈ¥ÐÞ¸ÄÕⲿ·Ö´úÂ룬¶øÇÒÒ²¸üÈÝÒ×Ð޸ġ£ + +Ö»ÓÐÔÚºËÐÄÁìÓòΪÁËЧÂʲſÉÒÔ·ÅÆú¿É¶ÁÐÔ£¬·ñÔò¿É¶ÁÐÔÊǵÚһλ¡£ + +# µÚ 2 Õ ÓÃÃû×Ö±í´ï´úÂ뺬Òå + +һЩ±È½ÏÓбí´ïÁ¦µÄµ¥´Ê£º + +| µ¥´Ê | ¿ÉÌæ´úµ¥´Ê | +| --- | --- | +| send | deliver¡¢dispatch¡¢announce¡¢distribute¡¢route | +| find | search¡¢extract¡¢locate¡¢recover | +| start| launch¡¢create¡¢begin¡¢open| +|make|create¡¢set up¡¢build¡¢generate¡¢compose¡¢add¡¢new| + +ʹÓà i¡¢j¡¢k ×÷Ϊѭ»·µü´úÆ÷²»×ÜÊǺõģ¬Îªµü´úÆ÷Ìí¼Ó¸üÓбí´ïÁ¦µÄÃû×Ö»á¸üºÃ£¬±ÈÈç user_i¡¢member_i¡£ÒòΪѭ»·²ã´ÎÔ½¶à£¬´úÂëÔ½ÄÑÀí½â£¬Óбí´ïÁ¦µÄµü´úÆ÷Ãû×ֿɶÁÐÔ»á¸ü¸ß + +ΪÃû×ÖÌí¼ÓÐÎÈݴʵÈÐÅÏ¢ÄÜÈÃÃû×Ö¸ü¾ßÓбí´ïÁ¦£¬µ«ÊÇÃû×ÖÒ²»á±ä³¤¡£Ãû×Ö³¤¶ÌµÄ×¼ÔòÊÇ£º×÷ÓÃÓòÔ½´ó£¬Ãû×ÖÔ½³¤¡£Òò´ËÖ»ÓÐÔÚ¶Ì×÷ÓÃÓò²ÅÄÜʹÓÃһЩ¼òµ¥Ãû×Ö¡£ + +# µÚ 3 Õ Ãû×Ö²»ÄÜ´øÀ´ÆçÒå + +ÆðÍêÃû×ÖҪ˼¿¼Ò»Ï±ðÈË»á¶ÔÕâ¸öÃû×ÖÓкνâ¶Á£¬»á²»»áÎó½âÁËÔ­±¾Ïë±í´ïµÄº¬Òå¡£ + +Óà min¡¢max ±íʾÊýÁ¿·¶Î§£» + +Óà first¡¢last ±íʾ·ÃÎʿռäµÄ°üº¬·¶Î§£¬begin¡¢end ±íʾ·ÃÎʿռäµÄÅųý·¶Î§£¬¼´ end ²»°üº¬Î²²¿¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/26772ecc-a3e3-4ab7-a46f-8b4656990c27.jpg) + +²¼¶ûÏà¹ØµÄÃüÃû¼ÓÉÏ is¡¢can¡¢should¡¢has µÈǰ׺¡£ + +# µÚ 4 Õ Á¼ºÃµÄ´úÂë·ç¸ñ + +Êʵ±µÄ¿ÕÐкÍËõ½ø + +ÅÅÁÐÕûÆëµÄ×¢ÊÍ£º + +``` +int a = 1; // ×¢ÊÍ +int b = 11; // ×¢ÊÍ +int c = 111; // ×¢ÊÍ +``` + +Óï¾ä˳Ðò²»ÄÜËæÒ⣬±ÈÈçÓë html ±íµ¥Ïà¹ØÁªµÄ±äÁ¿µÄ¸³ÖµÓ¦¸ÃºÍ±íµ¥ÔÚ html ÖеÄ˳ÐòÒ»Ö£» + +°ÑÏà¹ØµÄ´úÂë°´¿é×éÖ¯·ÅÔÚÒ»Æð¡£ + +# µÚ 5 Õ ±àдעÊÍ + +ÔĶÁ´úÂëÊ×ÏÈ»á×¢Òâµ½×¢ÊÍ£¬Èç¹û×¢ÊÍû̫´ó×÷Óã¬ÄÇô¾Í»áÀË·Ñ´úÂëÔĶÁµÄʱ¼ä¡£ÄÇЩÄÜÖ±½Ó¿´³öº¬ÒåµÄ´úÂë²»ÐèҪдעÊÍ£¬ÌرðÊDz¢²»ÐèҪΪÿ¸ö·½·¨¶¼¼ÓÉÏ×¢ÊÍ£¬±ÈÈçÄÇЩ¼òµ¥µÄ getter ºÍ setter ·½·¨£¬ÎªÕâЩ·½·¨Ð´×¢ÊÍ·´¶øÈôúÂë¿É¶ÁÐÔ¸ü²î¡£ + +²»ÄÜÒòΪÓÐ×¢Ê;ÍËæ±ãÆð¸öÃû×Ö£¬¶øÊÇÕùÈ¡Æð¸öºÃÃû×Ö¶ø²»Ð´×¢ÊÍ¡£ + +¿ÉÒÔÓÃ×¢ÊÍÀ´¼Ç¼²ÉÓõ±Ç°½â¾ö°ì·¨µÄ˼¿¼¹ý³Ì£¬´Ó¶øÈöÁÕ߸üÈÝÒ×Àí½â´úÂë¡£ + +×¢ÊÍÓÃÀ´ÌáÐÑÒ»Ð©ÌØÊâÇé¿ö¡£ + +Óà TODO µÈ×ö±ê¼Ç£º + +| ±ê¼Ç | Ó÷¨ | +|---|---| +|TODO| ´ý×ö | +|FIXME| ´ýÐÞ¸´ | +|HACH| ´Ö²ÚµÄ½â¾ö·½°¸ | +|XXX| ΣÏÕ£¡ÕâÀïÓÐÖØÒªµÄÎÊÌâ | + +# µÚ 6 Õ ÈçºÎ±àдעÊÍ + +¾¡Á¿¼ò½àÃ÷ÁË£º + +``` +// The first String is student's name +// The Second Integer is student's score +Map scoreMap = new HashMap<>(); +``` + +``` +// Student' name -> Student's score +Map scoreMap = new HashMap<>(); +``` + +Ìí¼Ó²âÊÔÓÃÀýÀ´ËµÃ÷£º + +``` +//... +// Example: add(1, 2), return 3 +int add(int x, int y) { + return x + y; +} +``` + +Ôںܸ´Ôӵĺ¯Êýµ÷ÓÃÖжÔÿ¸ö²ÎÊý±êÉÏÃû×Ö£º + +``` +int a = 1; +int b = 2; +int num = add(\* x = *\ a, \* y = *\ b); +``` + +ʹÓÃרҵÃû´ÊÀ´Ëõ¶Ì¸ÅÄîÉϵĽâÊÍ£¬±ÈÈçÓÃÉè¼ÆÄ£Ê½ÃûÀ´ËµÃ÷´úÂë¡£ + +# µÚ 7 Õ Ìá¸ß¿ØÖÆÁ÷µÄ¿É¶ÁÐÔ + +Ìõ¼þ±í´ïʽÖУ¬×ó²àÊDZäÁ¿£¬ÓÒ²àÊdz£Êý¡£±ÈÈçÏÂÃæµÚÒ»¸öÓï¾äÕýÈ·£º + +``` +if(len < 10) +if(10 > len) +``` + +if / else Ìõ¼þÓï¾ä£¬ÏÈ´¦ÀíÒÔÏÂÂß¼­£º¢Ù ÕýÂß¼­£»¢Ú ¹Ø¼üÂß¼­£»¢Û£º¼òµ¥Âß¼­ +``` +if(a == b) { + // ÕýÂß¼­ +} else{ + // ·´Âß¼­ +} +``` + +Ö»ÓÐÔÚÂß¼­¼òµ¥µÄÇé¿öÏÂʹÓà ? : ÈýÄ¿ÔËËã·ûÀ´Ê¹´úÂë¸ü½ô´Õ£¬·ñÔòÓ¦¸Ã²ð·Ö³É if / else£» + +do / while µÄÌõ¼þ·ÅÔÚºóÃæ£¬²»¹»¼òµ¥Ã÷ÁË£¬²¢ÇÒ»áÓÐһЩÃÔ»óµÄµØ·½£¬×îºÃʹÓà while À´´úÌæ¡£ + +Èç¹ûÖ»ÓÐÒ»¸ö goto Ä¿±ê£¬ÄÇô goto ÉÐÇÒ»¹ÄܽÓÊÜ£¬µ«ÊǹýÓÚ¸´Ô goto »áÈôúÂë¿É¶ÁÐÔÌØ±ð²î£¬Ó¦¸Ã±ÜÃâʹÓà goto¡£ + +ÔÚǶÌ×µÄÑ­»·ÖУ¬ÓÃһЩ return Óï¾äÍùÍùÄܼõÉÙǶÌ׵IJãÊý¡£ + +# µÚ 8 Õ ²ð·Ö³¤±í´ïʽ + +³¤±í´ïʽµÄ¿É¶ÁÐԺܲ¿ÉÒÔÒýÈëһЩ½âÊͱäÁ¿´Ó¶ø²ð·Ö±í´ïʽ£º + +``` +if line.split(':')[0].strip() == "root": + ... +``` +``` +username = line.split(':')[0].strip() +if username == "root": + ... +``` + +ʹÓÃĦ¸ù¶¨Àí¼ò»¯Ò»Ð©Âß¼­±í´ïʽ£º + +``` +if(!a && !b) { + ... +} +``` +``` +if(a || b) { + ... +} +``` + +# µÚ 9 Õ ±äÁ¿Óë¿É¶ÁÐÔ + +È¥³ý¿ØÖÆÁ÷±äÁ¿¡£ÔÚÑ­»·ÖÐͨ¹ý break »òÕß return ¿ÉÒÔ¼õÉÙ¿ØÖÆÁ÷±äÁ¿µÄʹÓᣠ+ +``` +boolean done = false; +while(/* condition */ && !done) { + ... + if(...) { + done = true; + continue; + } +} +``` +``` +while(/* condition */) { + ... + if(...) { + break; + } +} +``` + +¼õС±äÁ¿×÷ÓÃÓò¡£×÷ÓÃÓòԽС£¬Ô½ÈÝÒ×¶¨Î»µ½±äÁ¿ËùÓÐʹÓõĵط½¡£ + +JavaScript ¿ÉÒÔÓñհü¼õС×÷ÓÃÓò¡£ÒÔÏ´úÂëÖÐ submit_form ÊǺ¯Êý±äÁ¿£¬submitted ±äÁ¿¿ØÖƺ¯Êý²»»á±»Ìá½»Á½´Î¡£µÚÒ»¸öʵÏÖÖÐ submitted ÊÇÈ«¾Ö±äÁ¿£¬µÚ¶þ¸öʵÏÖ°Ñ submitted ·Åµ½ÄäÃûº¯ÊýÖУ¬´Ó¶øÏÞÖÆÁËÆð×÷ÓÃÓò·¶Î§¡£ + +``` +submitted = false; +var submit_form = function(form_name) { + if(submitted) { + return; + } + submitted = true; +}; +``` + +``` +var submit_form = (function() { + var submitted = false; + return function(form_name) { + if(submitted) { + return; + } + submitted = true; + } +}()); // () ʹµÃÍâ²ãÄäÃûº¯ÊýÁ¢¼´Ö´ÐÐ +``` + +JavaScript ÖÐûÓÐÓà var ÉùÃ÷µÄ±äÁ¿¶¼ÊÇÈ«¾Ö±äÁ¿£¬¶øÈ«¾Ö±äÁ¿ºÜÈÝÒ×Ôì³ÉÃÔ»ó£¬Òò´ËÓ¦µ±×ÜÊÇÓà var À´ÉùÃ÷±äÁ¿¡£ + +±äÁ¿¶¨ÒåµÄλÖÃÓ¦µ±ÀëËüʹÓõÄλÖÃ×î½ü¡£ + +**ʵÀý½âÎö** + +ÔÚÒ»¸öÍøÒ³ÖÐÓÐÒÔÏÂÎı¾ÊäÈë×ֶΣº + +``` + + + + +``` + +ÏÖÔÚÒª½ÓÊÜÒ»¸ö×Ö·û´®²¢°ÑËü·Åµ½µÚÒ»¸ö¿ÕµÄ input ×Ö¶ÎÖУ¬³õʼʵÏÖÈçÏ£º + +``` +var setFirstEmptyInput = function(new_alue) { + var found = false; + var i = 1; + var elem = document.getElementById('input' + i); + while(elem != null) { + if(elem.value === '') { + found = true; + break; + } + i++; + elem = document.getElementById('input' + i); + } + if(found) elem.value = new_value; + return elem; +} +``` + +ÒÔÉÏʵÏÖÓÐÒÔÏÂÎÊÌ⣺ + +- found ¿ÉÒÔÈ¥³ý£» +- elem ×÷ÓÃÓò¹ý´ó£» +- ¿ÉÒÔÓà for Ñ­»·´úÌæ while Ñ­»·£» + +``` +var setFirstEmptyInput = function(new_value) { + for(var i = 1; true; i++) { + var elem = document.getElementById('input' + i); + if(elem === null) { + return null; + } + if(elem.value === '') { + elem.value = new_value; + return elem; + } + } +}; +``` + +# µÚ 10 Õ ³éÈ¡º¯Êý + +¹¤³Ìѧ¾ÍÊǰѴóÎÊÌâ²ð·Ö³ÉСÎÊÌâÔÙ°ÑÕâЩÎÊÌâµÄ½â¾ö·½°¸·Å»ØÒ»Æð¡£ + +Ê×ÏÈÓ¦¸ÃÃ÷È·Ò»¸öº¯ÊýµÄ¸ß²ã´ÎÄ¿±ê£¬È»ºó¶ÔÓÚ²»ÊÇÖ±½ÓΪÁËÕâ¸öÄ¿±ê¹¤×÷µÄ´úÂ룬³éÈ¡³öÀ´·Åµ½¶ÀÁ¢µÄº¯ÊýÖС£ + +½éÉÜÐԵĴúÂ룺 + +``` +int findClostElement(int[] arr) { + int clostIdx; + int clostDist = Interger.MAX_VALUE; + for(int i = 0; i < arr.length; i++) { + int x = ...; + int y = ...; + int z = ...; + int value = x * y * z; + int dist = Math.sqrt(Math.pow(value, 2), Math.pow(arr[i], 2)); + if(dist < clostDist) { + clostIdx = i; + clostDist = value; + } + } + return clostIdx; +} +``` + +ÒÔÉÏ´úÂëÖÐÑ­»·²¿·ÖÖ÷Òª¼ÆËã¾àÀ룬Õⲿ·Ö²»ÊôÓÚ´úÂë¸ß²ã´ÎÄ¿±ê£¬¸ß²ã´ÎÄ¿±êÊÇѰÕÒ×îС¾àÀëµÄÖµ£¬Òò´Ë¿ÉÒÔ°ÑÕⲿ·Ö´úÌæÌáÈ¡µ½¶ÀÁ¢µÄº¯ÊýÖС£ÕâÑù×öÒ²´øÀ´Ò»¸ö¶îÍâµÄºÃ´¦ÓУº¿ÉÒÔµ¥¶À½øÐвâÊÔ¡¢¿ÉÒÔ¿ìËÙÕÒµ½³ÌÐò´íÎó²¢Ð޸ġ£ + +``` +public int findClostElement(int[] arr) { + int clostIdx; + int clostDist = Interger.MAX_VALUE; + for(int i = 0; i < arr.length; i++) { + int dist = computDist(arr, i); + if(dist < clostDist) { + clostIdx = i; + clostDist = value; + } + } + return clostIdx; +} +``` + +²¢²»ÊǺ¯Êý³éÈ¡µÄÔ½¶àÔ½ºÃ£¬Èç¹û³éÈ¡¹ý¶à£¬ÔÚÔĶÁ´úÂëµÄʱºò¿ÉÄÜÐèÒª²»¶ÏÌøÀ´ÌøÈ¥¡£Ö»ÓÐÔÚµ±Ç°º¯Êý²»ÐèҪȥÁ˽âijһ¿é´úÂëϸ½Ú¶øÄܹ»±í´ïÆäÄÚÈÝʱ£¬°ÑÕâ¿é´úÂë³éÈ¡³É×Óº¯Êý²ÅÊǺõġ£ + +º¯Êý³éȡҲÓÃÓÚ¼õС´úÂëµÄÈßÓà¡£ + +# µÚ 11 Õ һ´ÎÖ»×öÒ»¼þÊ + +Ö»×öÒ»¼þʵĴúÂëºÜÈÝÒ×ÈÃÈËÖªµÀÆäÒª×öµÄÊ£» + +»ù±¾Á÷³Ì£ºÁгö´úÂëËù×öµÄËùÓÐÈÎÎñ£»°Ñÿ¸öÈÎÎñ²ð·Öµ½²»Í¬µÄº¯Êý£¬»òÕß²»Í¬µÄ¶ÎÂä¡£ + +# µÚ 12 Õ ÓÃ×ÔÈ»ÓïÑÔ±íÊö´úÂë + +ÏÈÓÃ×ÔÈ»ÓïÑÔÊéд´úÂëÂß¼­£¬Ò²¾ÍÊÇα´úÂ룬ȻºóÔÙд´úÂ룬ÕâÑù´úÂëÂß¼­»á¸üÇåÎú¡£ + +# µÚ 13 Õ ¼õÉÙ´úÂëÁ¿ + +²»Òª¹ý¶ÈÉè¼Æ£¬±àÂë¹ý³Ì»áÓкܶà±ä»¯£¬¹ý¶ÈÉè¼ÆµÄÄÚÈݵ½×îºóÍùÍùÊÇÎÞÓõġ£ + +¶àÓñê×¼¿âʵÏÖ¡£ diff --git a/notes/é‡�æž„.md b/notes/é‡�æž„.md new file mode 100644 index 00000000..7ac2b62d --- /dev/null +++ b/notes/é‡�æž„.md @@ -0,0 +1,979 @@ + +* [µÚÒ»ÕÂ ÖØ¹¹£¬µÚÒ»¸ö°¸Àý](#µÚÒ»ÕÂ-ÖØ¹¹£¬µÚÒ»¸ö°¸Àý) +* [µÚ¶þÕÂ ÖØ¹¹Ô­Ôò](#µÚ¶þÕÂ-ÖØ¹¹Ô­Ôò) +* [µÚÈýÕ ´úÂëµÄ»µÎ¶µÀ](#µÚÈýÕÂ-´úÂëµÄ»µÎ¶µÀ) + * [1. Duplicated Code£¨Öظ´´úÂ룩](#1-duplicated-code£¨Öظ´´úÂ룩) + * [2. Long Method£¨¹ý³¤º¯Êý£©](#2-long-method£¨¹ý³¤º¯Êý£©) + * [3. Large Class£¨¹ý´óµÄÀࣩ](#3-large-class£¨¹ý´óµÄÀࣩ) + * [4. Long Parameter List£¨¹ý³¤µÄ²ÎÊýÁУ©](#4-long-parameter-list£¨¹ý³¤µÄ²ÎÊýÁУ©) + * [5. Divergent Change£¨·¢É¢Ê½±ä»¯£©](#5-divergent-change£¨·¢É¢Ê½±ä»¯£©) + * [6. Shotgun Surgery£¨É¢µ¯Ê½Ð޸ģ©](#6-shotgun-surgery£¨É¢µ¯Ê½Ð޸ģ©) + * [7. Feature Envy£¨ÒÀÁµÇé½á£©](#7-feature-envy£¨ÒÀÁµÇé½á£©) + * [8. Data Clumps£¨Êý¾ÝÄàÍÅ£©](#8-data-clumps£¨Êý¾ÝÄàÍÅ£©) + * [9. Primitive Obsession£¨»ù±¾ÀàÐÍÆ«Ö´£©](#9-primitive-obsession£¨»ù±¾ÀàÐÍÆ«Ö´£©) + * [10. Switch Statements£¨switch ¾ªã¤ÏÖÉí£©](#10-switch-statements£¨switch-¾ªã¤ÏÖÉí£©) + * [11. Parallel Inheritance Hierarchies£¨Æ½Ðм̳ÐÌåϵ£©](#11-parallel-inheritance-hierarchies£¨Æ½Ðм̳ÐÌåϵ£©) + * [12. Lazy Class£¨ÈßÓàÀࣩ](#12-lazy-class£¨ÈßÓàÀࣩ) + * [13. Speculative Generality£¨¿ä¿äÆä̸δÀ´ÐÔ£©](#13-speculative-generality£¨¿ä¿äÆä̸δÀ´ÐÔ£©) + * [14. Temporary Field£¨ÁîÈËÃÔ»óµÄÔÝʱ×ֶΣ©](#14-temporary-field£¨ÁîÈËÃÔ»óµÄÔÝʱ×ֶΣ©) + * [15. Message Chains£¨¹ý¶ÈñîºÏµÄÏûÏ¢Á´£©](#15-message-chains£¨¹ý¶ÈñîºÏµÄÏûÏ¢Á´£©) + * [16. Middle Man£¨ÖмäÈË£©](#16-middle-man£¨ÖмäÈË£©) + * [17. Inappropriate Intimacy£¨áòêǹØÏµ£©](#17-inappropriate-intimacy£¨áòêǹØÏµ£©) + * [18. Alernative Classes with Different Interfaces£¨ÒìÇúͬ¹¤µÄÀࣩ](#18-alernative-classes-with-different-interfaces£¨ÒìÇúͬ¹¤µÄÀࣩ) + * [19. Incomplete Library Class£¨²»ÍêÃÀµÄÀà¿â£©](#19-incomplete-library-class£¨²»ÍêÃÀµÄÀà¿â£©) + * [20. Data Class£¨Ó×ÖɵÄÊý¾ÝÀࣩ](#20-data-class£¨Ó×ÖɵÄÊý¾ÝÀࣩ) + * [21. Refused Bequest£¨±»¾Ü¾øµÄÀ¡Ôù£©](#21-refused-bequest£¨±»¾Ü¾øµÄÀ¡Ôù£©) + * [22. Comments£¨¹ý¶àµÄ×¢ÊÍ£©](#22-comments£¨¹ý¶àµÄ×¢ÊÍ£©) +* [µÚËÄÕ ¹¹Öþ²âÊÔÌåϵ](#µÚËÄÕÂ-¹¹Öþ²âÊÔÌåϵ) +* [µÚÎåÕÂ ÖØ¹¹Áбí](#µÚÎåÕÂ-ÖØ¹¹Áбí) +* [µÚÁùÕÂ ÖØÐÂ×éÖ¯º¯Êý](#µÚÁùÕÂ-ÖØÐÂ×éÖ¯º¯Êý) + * [1. Extract Method£¨ÌáÁ¶º¯Êý£©](#1-extract-method£¨ÌáÁ¶º¯Êý£©) + * [2. Inline Method£¨ÄÚÁªº¯Êý£©](#2-inline-method£¨ÄÚÁªº¯Êý£©) + * [3. Inline Temp£¨ÄÚÁªÁÙʱ±äÁ¿£©](#3-inline-temp£¨ÄÚÁªÁÙʱ±äÁ¿£©) + * [4. Replace Temp with Query£¨ÒÔ²éѯȡ´úÁÙʱ±äÁ¿£©](#4-replace-temp-with-query£¨ÒÔ²éѯȡ´úÁÙʱ±äÁ¿£©) + * [5. Introduce Explaining Variable£¨ÒýÆð½âÊͱäÁ¿£©](#5-introduce-explaining-variable£¨ÒýÆð½âÊͱäÁ¿£©) + * [6. Split Temporary Variable£¨·Ö½âÁÙʱ±äÁ¿£©](#6-split-temporary-variable£¨·Ö½âÁÙʱ±äÁ¿£©) + * [7. Remove Assigments to Parameters£¨ÒƳý¶Ô²ÎÊýµÄ¸³Öµ£©](#7-remove-assigments-to-parameters£¨ÒƳý¶Ô²ÎÊýµÄ¸³Öµ£©) + * [8. Replace Method with Method Object£¨ÒÔº¯Êý¶ÔÏóÈ¡´úº¯Êý£©](#8-replace-method-with-method-object£¨ÒÔº¯Êý¶ÔÏóÈ¡´úº¯Êý£©) + * [9. Subsititute Algorithn£¨Ìæ»»Ëã·¨£©](#9-subsititute-algorithn£¨Ìæ»»Ëã·¨£©) +* [µÚÆßÕ ÔÚ¶ÔÏóÖ®¼ä°áÒÆÌØÐÔ](#µÚÆßÕÂ-ÔÚ¶ÔÏóÖ®¼ä°áÒÆÌØÐÔ) + * [1. Move Method£¨°áÒÆº¯Êý£©](#1-move-method£¨°áÒÆº¯Êý£©) + * [2. Move Field£¨°áÒÆ×ֶΣ©](#2-move-field£¨°áÒÆ×ֶΣ©) + * [3. Extract Class£¨ÌáÁ¶Àࣩ](#3-extract-class£¨ÌáÁ¶Àࣩ) + * [4. Inline Class£¨½«ÀàÄÚÁª»¯£©](#4-inline-class£¨½«ÀàÄÚÁª»¯£©) + * [5. Hide Delegate£¨Òþ²Ø¡°Î¯ÍйØÏµ¡±£©](#5-hide-delegate£¨Òþ²Ø¡°Î¯ÍйØÏµ¡±£©) + * [6. Remove Middle Man£¨ÒƳýÖмäÈË£©](#6-remove-middle-man£¨ÒƳýÖмäÈË£©) + * [7. Introduce Foreign Method£¨ÒýÈëÍâ¼Óº¯Êý£©](#7-introduce-foreign-method£¨ÒýÈëÍâ¼Óº¯Êý£©) + * [8. Introduce Local Extension£¨ÒýÈë±¾µØÀ©Õ¹£©](#8-introduce-local-extension£¨ÒýÈë±¾µØÀ©Õ¹£©) +* [µÚ°ËÕÂ ÖØÐÂ×éÖ¯Êý¾Ý](#µÚ°ËÕÂ-ÖØÐÂ×éÖ¯Êý¾Ý) + * [1. Self Encapsulate Field£¨×Ô·â×°×ֶΣ©](#1-self-encapsulate-field£¨×Ô·â×°×ֶΣ©) + * [2. Replace Data Value with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý¾ÝÖµ£©](#2-replace-data-value-with-object£¨ÒÔ¶ÔÏóÈ¡´úÊý¾ÝÖµ£©) + * [3. Change Value to Reference£¨½«Öµ¶ÔÏó¸Ä³ÉÒýÓöÔÏó£©](#3-change-value-to-reference£¨½«Öµ¶ÔÏó¸Ä³ÉÒýÓöÔÏó£©) + * [4. Change Reference to value£¨½«ÒýÓöÔÏó¸ÄΪֵ¶ÔÏó£©](#4-change-reference-to-value£¨½«ÒýÓöÔÏó¸ÄΪֵ¶ÔÏó£©) + * [5. Replace Array with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý×飩](#5-replace-array-with-object£¨ÒÔ¶ÔÏóÈ¡´úÊý×飩) + * [6. Duplicate Observed Data£¨¸³Öµ¡°±»¼àÊÓÊý¾Ý¡±£©](#6-duplicate-observed-data£¨¸³Öµ¡°±»¼àÊÓÊý¾Ý¡±£©) + * [7. Change Unidirectional Association to Bidirectional£¨½«µ¥Ïò¹ØÁª¸ÄΪ˫Ïò¹ØÁª£©](#7-change-unidirectional-association-to-bidirectional£¨½«µ¥Ïò¹ØÁª¸ÄΪ˫Ïò¹ØÁª£©) + * [8. Change Bidirectional Association to Unidirectional£¨½«Ë«Ïò¹ØÁª¸ÄΪµ¥Ïò¹ØÁª£©](#8-change-bidirectional-association-to-unidirectional£¨½«Ë«Ïò¹ØÁª¸ÄΪµ¥Ïò¹ØÁª£©) + * [9. Replace Magic Number with Symbolic Constant£¨ÒÔ×ÖÃæ³£Á¿È¡´úħ·¨Êý£©](#9-replace-magic-number-with-symbolic-constant£¨ÒÔ×ÖÃæ³£Á¿È¡´úħ·¨Êý£©) + * [10. Encapsulate Field£¨·â×°×ֶΣ©](#10-encapsulate-field£¨·â×°×ֶΣ©) + * [11. Encapsulate Collection£¨·â×°¼¯ºÏ£©](#11-encapsulate-collection£¨·â×°¼¯ºÏ£©) + * [12. Replace Record with Data Class£¨ÒÔÊý¾ÝÀàÈ¡´ú¼Ç¼£©](#12-replace-record-with-data-class£¨ÒÔÊý¾ÝÀàÈ¡´ú¼Ç¼£©) + * [13. Replace Type Code with Class£¨ÒÔÀàÈ¡´úÀàÐÍÂ룩](#13-replace-type-code-with-class£¨ÒÔÀàÈ¡´úÀàÐÍÂ룩) + * [14. Replace Type Code with Subcalsses£¨ÒÔ×ÓÀàÈ¡´úÀàÐÍÂ룩](#14-replace-type-code-with-subcalsses£¨ÒÔ×ÓÀàÈ¡´úÀàÐÍÂ룩) + * [15. Replace Type Code with State/Strategy £¨ÒÔ State/Strategy È¡´úÀàÐÍÂ룩](#15-replace-type-code-with-statestrategy-£¨ÒÔ-statestrategy-È¡´úÀàÐÍÂ룩) + * [16. Replace Subclass with Fields£¨ÒÔ×Ö¶ÎÈ¡´ú×ÓÀࣩ](#16-replace-subclass-with-fields£¨ÒÔ×Ö¶ÎÈ¡´ú×ÓÀࣩ) +* [µÚ¾ÅÕ ¼ò»¯Ìõ¼þ±í´ïʽ](#µÚ¾ÅÕÂ-¼ò»¯Ìõ¼þ±í´ïʽ) + * [1. Decompose Conditional£¨·Ö½âÌõ¼þ±í´ïʽ£©](#1-decompose-conditional£¨·Ö½âÌõ¼þ±í´ïʽ£©) + * [2. Consolidate Conditional Expression£¨ºÏ²¢Ìõ¼þ±í´ïʽ£©](#2-consolidate-conditional-expression£¨ºÏ²¢Ìõ¼þ±í´ïʽ£©) + * [3. Consolidate Duplicate Conditional Fragments £¨ºÏ²¢Öظ´µÄÌõ¼þƬ¶Î£©](#3-consolidate-duplicate-conditional-fragments-£¨ºÏ²¢Öظ´µÄÌõ¼þƬ¶Î£©) + * [4. Remove Control Flag£¨ÒƳý¿ØÖƱê¼Ç£©](#4-remove-control-flag£¨ÒƳý¿ØÖƱê¼Ç£©) + * [5. Replace Nested Conditional with Guard Clauses £¨ÒÔÎÀÓï¾äÈ¡´úǶÌ×Ìõ¼þ±í´ïʽ£©](#5-replace-nested-conditional-with-guard-clauses-£¨ÒÔÎÀÓï¾äÈ¡´úǶÌ×Ìõ¼þ±í´ïʽ£©) + * [6. Replace Conditional with Polymorphism £¨ÒÔ¶à̬ȡ´úÌõ¼þ±í´ïʽ£©](#6-replace-conditional-with-polymorphism-£¨ÒÔ¶à̬ȡ´úÌõ¼þ±í´ïʽ£©) + * [7. Introduce Null Object£¨ÒýÈëNull¶ÔÏó£©](#7-introduce-null-object£¨ÒýÈënull¶ÔÏó£©) + * [8. Introduce Assertion£¨ÒýÈë¶ÏÑÔ£©](#8-introduce-assertion£¨ÒýÈë¶ÏÑÔ£©) +* [µÚʮՠ¼ò»¯º¯Êýµ÷ÓÃ](#µÚÊ®ÕÂ-¼ò»¯º¯Êýµ÷ÓÃ) + * [1. Rename Method£¨º¯Êý¸ÄÃû£©](#1-rename-method£¨º¯Êý¸ÄÃû£©) + * [2. Add Parameter£¨Ìí¼Ó²ÎÊý£©](#2-add-parameter£¨Ìí¼Ó²ÎÊý£©) + * [3. Remove Parameter£¨ÒƳý²ÎÊý£©](#3-remove-parameter£¨ÒƳý²ÎÊý£©) + * [4. Separate Query from Modifier£¨½«²éѯº¯ÊýºÍÐ޸ĺ¯Êý·ÖÀ룩](#4-separate-query-from-modifier£¨½«²éѯº¯ÊýºÍÐ޸ĺ¯Êý·ÖÀ룩) + * [5. Parameterize Method£¨ÁÊýЯ´ø²ÎÊý£©](#5-parameterize-method£¨ÁÊýЯ´ø²ÎÊý£©) + * [6. Replace Parameter with Explicit Methods£¨ÒÔÃ÷È·º¯ÊýÈ¡´ú²ÎÊý£©](#6-replace-parameter-with-explicit-methods£¨ÒÔÃ÷È·º¯ÊýÈ¡´ú²ÎÊý£©) + * [7. Preserve Whole Object£¨±£³Ö¶ÔÏóÍêÕû£©](#7-preserve-whole-object£¨±£³Ö¶ÔÏóÍêÕû£©) + * [8. Replace Parameter with Methods£¨ÒÔº¯ÊýÈ¡´ú²ÎÊý£©](#8-replace-parameter-with-methods£¨ÒÔº¯ÊýÈ¡´ú²ÎÊý£©) + * [9. Introduce Parameter Object£¨ÒýÈë²ÎÊý¶ÔÏó£©](#9-introduce-parameter-object£¨ÒýÈë²ÎÊý¶ÔÏó£©) + * [10. Remove Setting Method£¨ÒƳýÉèÖµº¯Êý£©](#10-remove-setting-method£¨ÒƳýÉèÖµº¯Êý£©) + * [11. Hide Method£¨Òþ²Øº¯Êý£©](#11-hide-method£¨Òþ²Øº¯Êý£©) + * [12. Replace Constructor with Factory Method £¨ÒÔ¹¤³§º¯ÊýÈ¡´ú¹¹Ô캯Êý£©](#12-replace-constructor-with-factory-method-£¨ÒÔ¹¤³§º¯ÊýÈ¡´ú¹¹Ô캯Êý£©) + * [13. Encapsulate Downcast£¨·â×°ÏòÏÂתÐÍ£©](#13-encapsulate-downcast£¨·â×°ÏòÏÂתÐÍ£©) + * [14. Replace Error Code with Exception £¨ÒÔÒ쳣ȡ´ú´íÎóÂ룩](#14-replace-error-code-with-exception-£¨ÒÔÒ쳣ȡ´ú´íÎóÂ룩) + * [15. Replace Exception with Test£¨ÒÔ²âÊÔÈ¡´úÒì³££©](#15-replace-exception-with-test£¨ÒÔ²âÊÔÈ¡´úÒì³££©) +* [µÚʮһÕ ´¦Àí¸ÅÀ¨¹ØÏµ](#µÚʮһÕÂ-´¦Àí¸ÅÀ¨¹ØÏµ) + * [1. Pull Up Field£¨×Ö¶ÎÉÏÒÆ£©](#1-pull-up-field£¨×Ö¶ÎÉÏÒÆ£©) + * [2. Pull Up Method£¨º¯ÊýÉÏÒÆ£©](#2-pull-up-method£¨º¯ÊýÉÏÒÆ£©) + * [3. Pull Up Constructor Body£¨¹¹Ô캯Êý±¾ÌåÉÏÒÆ£©](#3-pull-up-constructor-body£¨¹¹Ô캯Êý±¾ÌåÉÏÒÆ£©) + * [4. Push Down Method£¨º¯ÊýÏÂÒÆ£©](#4-push-down-method£¨º¯ÊýÏÂÒÆ£©) + * [5. Push Down Field£¨×Ö¶ÎÏÂÒÆ£©](#5-push-down-field£¨×Ö¶ÎÏÂÒÆ£©) + * [6. Extract Subclass£¨ÌáÁ¶×ÓÀࣩ](#6-extract-subclass£¨ÌáÁ¶×ÓÀࣩ) + * [7. Extract Superclass£¨ÌáÁ¶³¬Àࣩ](#7-extract-superclass£¨ÌáÁ¶³¬Àࣩ) + * [8. Extract Interface£¨ÌáÁ¶½Ó¿Ú£©](#8-extract-interface£¨ÌáÁ¶½Ó¿Ú£©) + * [9. Collapse Hierarchy£¨ÕÛµþ¼Ì³ÐÌåϵ£©](#9-collapse-hierarchy£¨ÕÛµþ¼Ì³ÐÌåϵ£©) + * [10. Form Template Method£¨ËÜÔìÄ£°åº¯Êý£©](#10-form-template-method£¨ËÜÔìÄ£°åº¯Êý£©) + * [11. Replace Inheritance with Delegation £¨ÒÔίÍÐÈ¡´ú¼Ì³Ð£©](#11-replace-inheritance-with-delegation-£¨ÒÔίÍÐÈ¡´ú¼Ì³Ð£©) + * [12. Replace Delegation with Inheritance £¨ÒԼ̳ÐÈ¡´úίÍУ©](#12-replace-delegation-with-inheritance-£¨ÒԼ̳ÐÈ¡´úίÍУ©) + + +# µÚÒ»ÕÂ ÖØ¹¹£¬µÚÒ»¸ö°¸Àý + +Èç¹ûÄã·¢ÏÖ×Ô¼ºÐèҪΪ³ÌÐòÌí¼ÓÒ»¸öÌØÐÔ£¬¶ø´úÂë½á¹¹Ê¹ÄãÎÞ·¨ºÜ·½±ãµØ´ï³ÉÄ¿µÄ£¬ÄǾÍÏÈÖØ¹¹Õâ¸ö³ÌÐò¡£ + +ÔÚÖØ¹¹Ç°£¬ÐèÒªÏȹ¹½¨ºÃ¿É¿¿µÄ²âÊÔ»·¾³£¬È·±£°²È«µØÖع¹¡£ + +ÖØ¹¹ÊÇÒÔ΢СµÄ²½·¥Ð޸ijÌÐò£¬Èç¹û·¸Ï´íÎ󣬺ÜÈÝÒ×±ã¿ÉÒÔ·¢ÏÖËü¡£ + +**°¸Àý·ÖÎö** + +ӰƬ³ö×âµêÓ¦ÓóÌÐò£¬°üÀ¨Èý¸öÀࣺMovie¡¢Rental ºÍ Customer£¬Rental °üº¬×âÁÞµÄ Movie ÒÔ¼°ÌìÊý¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a758c8b2-0ac7-438f-90c2-3923ffad6328.png) + +×ʼµÄʵÏÖÊǰÑËùÓеļƷѴúÂë¶¼·ÅÔÚ Customer ÀàÖУ¬Ôڱ仯·¢Éúʱ£¬ÐèÒª¶ÔÕⲿ·Ö´úÂë½øÐиü¸Ä¡£±¾°¸ÀýÖпÉÄÜ·¢ÉúµÄ±ä»¯ÓУºÒ»ÖÖÀà±ðµÄ¼Æ·Ñ·½Ê½·¢Éú¸Ä±ä£»Ìí¼ÓеĵçÓ°Àà±ð¡£¿¼Âǵ½¼Æ·Ñ´úÂë¿ÉÄÜ´æÔÚÓÚ¶à´¦£¬Ò»µ©·¢Éú¸Ä±äʱ£¬¾ÍÐèÒª¶ÔËùÓмƷѴúÂë½øÐÐÐ޸ġ£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9e5e3cc6-3107-4051-b584-8ff077638fe6.png) + +ÒÔÏÂÊǼ̳РMovie µÄ¶à̬·½°¸¡£µ«ÊÇÓÉÓÚÒ»²¿ Movie µÄÀà±ð»á¶¯Ì¬¸Ä±ä£¬Òò´ËÕâÖÖ·½°¸²»¿ÉÐС£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2a502516-5d34-4eef-8f39-916298a60035.png) + +ÒýÈë Price À´·´Ó¦Àà±ðÐÅÏ¢£¬Í¨¹ý×éºÏµÄ·½Ê½ÔÚ Movie ÖмÓÈë Price ¶ÔÏó£¬ÕâÑùÿÖÖÀà±ðµÄ¼Æ·Ñ·½Ê½¶¼·â×°ÔÚ²»Í¬µÄ Price ×ÓÀàÖУ¬²¢ÇÒ Movie ¶ÔÏóÒ²¿ÉÒÔ¶¯Ì¬¸Ä±äÀà±ð¡£ÕâÖÖ·½Ê½¿ÉÒԺܺõØÊÊÓ¦ÉÏÊöÌáµ½µÄ±ä»¯¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c02a83b8-a6b9-4d00-a509-6f0516beaf5e.png) + +ÖØ¹¹ºóµÄʱÐòͼºÍÀàͼ£º + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/95f4559c-3d2a-4176-b365-4fbc46c76cf1.png) + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/293b9326-02fc-4ad8-8c79-b4a7b5ba60d3.png) + +# µÚ¶þÕÂ ÖØ¹¹Ô­Ôò + +ÖØ¹¹ÊǶÔÈí¼þÄÚ²¿½á¹¹µÄÒ»ÖÖµ÷Õû£¬Ä¿µÄÊÇÔÚ²»¸Ä±äÈí¼þ¿É¹Û²ìÐÐΪµÄǰÌáÏ£¬Ìá¸ßÆä¿ÉÀí½âÐÔ£¬½µµÍÆäÐ޸ijɱ¾¡£ + +ÖØ¹¹µÄºÃ´¦£º¸Ä½øÈí¼þÉè¼Æ£»Ê¹Èí¼þ¸üÈÝÒ×Àí½â£»°ïÖúÕÒµ½ bug£»Ìá¸ß±à³ÌËÙ¶È¡£ + +Èý´Î·¨Ôò£ºµÚÒ»´Î×öij¼þÊÂʱֻ¹ÜÈ¥×ö£»µÚ¶þ´Î×öÀàËÆÊÂÇéʱ¿ÉÒÔÈ¥×ö£»µÚÈý´ÎÔÙ×öÀàËÆµÄÊ£¬¾ÍÓ¦¸ÃÖØ¹¹¡£ + +¼ä½Ó²ãÓëÖØ¹¹£º¼ÆËã»ú¿ÆÑ§ÖеĺܶàÎÊÌâ¿ÉÒÔͨ¹ýÔö¼ÓÒ»¸ö¼ä½Ó²ãÀ´½â¾ö£¬¼ä½Ó²ã¾ßÓÐÒÔϼÛÖµ£ºÔÊÐíÂß¼­¹²Ïí£»·Ö¿ª½âÊÍÒâͼºÍʵÏÖ£»¸ôÀë±ä»¯£»·â×°Ìõ¼þÂß¼­¡£Öع¹¿ÉÒÔÀí½âΪÔÚÊʵ±µÄλÖòåÈë¼ä½Ó²ãÒÔ¼°ÔÚ²»ÐèÒªÊ±ÒÆ³ý¼ä½Ó²ã¡£ + +Ð޸Ľӿڣº¿ÉÒÔ±£Áô¾É½Ó¿Ú£¬ÈþɽӿÚÈ¥µ÷ÓÃнӿڣ¬²¢ÇÒʹÓà Java ÌṩµÄ @deprecation ½«¾É½Ó¿Ú±ê¼ÇΪÆúÓᣳý·ÇÕæÓбØÒª£¬²»Òª·¢²¼½Ó¿Ú£¬²¢ÇÒ²»Òª¹ýÔç·¢²¼½Ó¿Ú¡£ + +µ±ÏÖÓдúÂë¹ýÓÚ»ìÂÒʱ£¬Ó¦µ±ÖØÐ´¶ø²»ÊÇÖØ¹¹¡£Ò»¸öÕÛÖеİ취ÊÇ£¬½«´úÂë·â×°³ÉÒ»¸ö¸ö×é¼þ£¬È»ºó¶Ô¸÷¸ö×é¼þ×öÖØÐ´»òÕßÖØ¹¹µÄ¾ö¶¨¡£ + +Èí¼þ¿ª·¢ÎÞ·¨Ô¤ÏÈÉè¼Æ£¬ÒòΪ¿ª·¢¹ý³ÌÓкܶà±ä»¯·¢Éú£¬ÔÚ×ʼ²»¿ÉÄܶ¼°ÑËùÓÐÇé¿ö¿¼ÂǽøÈ¥¡£Öع¹¿ÉÒÔ¼ò»¯Éè¼Æ£¬Öع¹ÔÚÒ»¸ö¼òµ¥µÄÉè¼ÆÉϽøÐÐÐÞÐ޸ĸ쬵±±ä»¯·¢Éúʱ£¬ÒÔÒ»ÖÖÁé»îµÄ·½Ê½È¥Ó¦¶Ô±ä»¯£¬½ø¶ø´øÀ´¸üºÃµÄÉè¼Æ¡£ + +ΪÁËÈí´úÂë¸üÈÝÒ×Àí½â£¬Öع¹¿ÉÄܻᵼÖÂÐÔÄܼõµÍ¡£ÔÚ±àд´úÂëʱ£¬²»ÓöÔÐÔÄܹý¶à¹Ø×¢£¬Ö»ÓÐÔÚ×îºóÐÔÄÜÓÅ»¯½×¶ÎÔÙ¿¼ÂÇÐÔÄÜÎÊÌâ¡£Ó¦µ±Ö»¹Ø×¢¹Ø¼ü´úÂëµÄÐÔÄÜ£¬ÒòΪֻÓÐһС²¿·ÖµÄ´úÂëÊǹؼü´úÂë¡£ + +# µÚÈýÕ ´úÂëµÄ»µÎ¶µÀ + +## 1. Duplicated Code£¨Öظ´´úÂ룩 + +ͬһ¸öÀàµÄÁ½¸öº¯ÊýÓÐÏàͬ±í´ïʽ£¬ÔòÓà Extract Method ÌáÈ¡³öÖØ¸´´úÂ룻 + +Á½¸ö»¥ÎªÐֵܵÄ×ÓÀຬÓÐÏàͬµÄ±í´ïʽ£¬ÏÈʹÓà Extract Method£¬È»ºó°ÑÌáÈ¡³öÀ´µÄº¯Êý Pull Up Method ÍÆÈ볬Àà¡£ + +Èç¹ûÖ»ÊDz¿·ÖÏàͬ£¬Óà Extract Method ·ÖÀë³öÏàËÆ²¿·ÖºÍ²îÒ첿·Ö£¬È»ºóʹÓà Form Template Method ÕâÖÖÄ£°å·½·¨Éè¼ÆÄ£Ê½¡£ + +Èç¹ûÁ½¸öºÁ²»Ïà¹ØµÄÀà³öÏÖÖØ¸´´úÂ룬ÔòʹÓà Extract Class ·½·¨½«Öظ´´úÂëÌáÈ¡µ½Ò»¸ö¶ÀÁ¢ÀàÖС£ + +## 2. Long Method£¨¹ý³¤º¯Êý£© + +¼ä½Ó²ãµÄ¼ÛÖµ£º½âÊÍÄÜÁ¦¡¢¹²ÏíÄÜÁ¦¡¢Ñ¡ÔñÄÜÁ¦£» + +·Ö½âº¯ÊýµÄÔ­Ôò£ºµ±ÐèÒªÓÃ×¢ÊÍÀ´ËµÃ÷Ò»¶Î´úÂëʱ£¬¾ÍÐèÒª°ÑÕⲿ·Ö´úÂëдÈëÒ»¸ö¶ÀÁ¢µÄº¯ÊýÖС£ + +Extract Method »á°ÑºÜ¶à²ÎÊýºÍÁÙʱ±äÁ¿¶¼µ±×ö²ÎÊý£¬¿ÉÒÔÓà Replace Temp with Query Ïû³ýÁÙʱ±äÁ¿£¬Introduce Parameter Object ºÍ Preserve Whole Object ¿ÉÒÔ½«¹ý³¤µÄ²ÎÊýÁбäµÃ¸ü¼ò½à¡£ + +Ìõ¼þºÍÑ­»·ÍùÍùÒ²ÐèÒªÌáÈ¡µ½Ðµĺ¯ÊýÖС£ + +## 3. Large Class£¨¹ý´óµÄÀࣩ + +¹ý´óµÄÀà×öÁ˹ý¶àÊÂÇ飬ÐèҪʹÓà Extract Class »ò Extract Subclass¡£ + +ÏÈÈ·¶¨¿Í»§¶ËÈçºÎʹÓÃËüÃÇ£¬È»ºóÔËÓà Extract Interface ΪÿһÖÖʹÓ÷½Ê½ÌáÈ¡³öÒ»¸ö½Ó¿Ú¡£ + +## 4. Long Parameter List£¨¹ý³¤µÄ²ÎÊýÁУ© + +## 5. Divergent Change£¨·¢É¢Ê½±ä»¯£© + +Ò»¸öÀàÊܵ½¶àÖֱ仯µÄÓ°Ï죻 + +Õë¶ÔijÖÖÔ­ÒòµÄ±ä»¯£¬Ê¹Óà Extract Class ½«ËüÌáÁ¶µ½Ò»¸öÀàÖС£ + +## 6. Shotgun Surgery£¨É¢µ¯Ê½Ð޸ģ© + +Ò»¸ö±ä»¯ÒýÆð¶à¸öÀàÐ޸ģ» + +ʹÓà Move Method ºÍ Move Field °ÑËùÓÐÐèÒªÐ޸ĵشúÂë·Åµ½Í¬Ò»¸öÀàÖС£ + +## 7. Feature Envy£¨ÒÀÁµÇé½á£© + +Ò»¸öº¯Êý¶Ôij¸öÀàµÄÐËȤ¸ßÓÚ¶Ô×Ô¼ºËù´¦ÀàµÄÐËȤ£¬Í¨³£Êǹý¶à·ÃÎÊÆäËüÀàµÄÊý¾Ý¡£ + +ʹÓà Move Method ½«ËüÒÆµ½¸ÃÈ¥µÄµØ·½£¬Èç¹û¶Ô¶à¸öÀà¶¼ÓÐ Feature Envy£¬ÏÈÓà Extract Method ÌáÈ¡³ö¶à¸öº¯Êý¡£ + +## 8. Data Clumps£¨Êý¾ÝÄàÍÅ£© + +ÓÐЩÊý¾Ý¾­³£Ò»Æð³öÏÖ£¬±ÈÈçÁ½¸öÀà¾ßÓÐÏàͬµÄ×ֶΡ¢Ðí¶àº¯ÊýÓÐÏàͬµÄ²ÎÊý¡£Ê¹Óà Extract Class ½«ËüÃÇ·ÅÔÚÒ»Æð¡£ + +## 9. Primitive Obsession£¨»ù±¾ÀàÐÍÆ«Ö´£© + +ʹÓÃÀàÍùÍù±ÈʹÓûù±¾ÀàÐ͸üºÃ£¬Ê¹Óà Replace Data Value with Object ½«Êý¾ÝÖµÌæ»»Îª¶ÔÏó¡£ + +## 10. Switch Statements£¨switch ¾ªã¤ÏÖÉí£© + +## 11. Parallel Inheritance Hierarchies£¨Æ½Ðм̳ÐÌåϵ£© + +ÿµ±ÎªÄ³¸öÀàÔö¼ÓÒ»¸ö×ÓÀ࣬±ØÐëҲΪÁíÒ»¸öÀàÏàÓ¦Ôö¼ÓÒ»¸ö×ÓÀà¡£ + +ÕâÖÖ½á¹û»á´øÀ´Ò»Ð©Öظ´ÐÔ£¬Ïû³ýÖØ¸´ÐÔµÄÒ»°ã²ßÂÔ£ºÈÃÒ»¸ö¼Ì³ÐÌåϵµÄʵÀýÒýÓÃÁíÒ»¸ö¼Ì³ÐÌåϵµÄʵÀý¡£ + +## 12. Lazy Class£¨ÈßÓàÀࣩ + +Èç¹ûÒ»¸öÀàûÓÐ×ö×ã¹»¶àµÄ¹¤×÷£¬¾ÍÓ¦¸ÃÏûʧ¡£ + +## 13. Speculative Generality£¨¿ä¿äÆä̸δÀ´ÐÔ£© + +ÓÐЩÄÚÈÝÊÇÓÃÀ´´¦ÀíδÀ´¿ÉÄÜ·¢ÉúµÄ±ä»¯£¬µ«ÊÇÍùÍù»áÔì³ÉϵͳÄÑÒÔÀí½âºÍά»¤£¬²¢ÇÒÔ¤²âδÀ´¿ÉÄÜ·¢ÉúµÄ¸Ä±äºÜ¿ÉÄܺÍ×ʼµÄÉèÏëÏà·´¡£Òò´Ë£¬Èç¹û²»ÊDZØÒª£¬¾Í²»ÒªÕâô×ö¡£ + +## 14. Temporary Field£¨ÁîÈËÃÔ»óµÄÔÝʱ×ֶΣ© + +ij¸ö×ֶνöΪijÖÖÌØ¶¨Çé¿ö¶øÉ裬ÕâÑùµÄ´úÂë²»Ò×Àí½â£¬ÒòΪͨ³£ÈÏΪ¶ÔÏóÔÚËùÓÐʱºò¶¼ÐèÒªËüµÄËùÓÐ×ֶΡ£ + +°ÑÕâÖÖ×ֶκÍÌØ¶¨Çé¿öµÄ´¦Àí²Ù×÷ʹÓà Extract Class ÌáÁ¶µ½Ò»¸ö¶ÀÁ¢ÀàÖС£ + +## 15. Message Chains£¨¹ý¶ÈñîºÏµÄÏûÏ¢Á´£© + +Ò»¸ö¶ÔÏóÇëÇóÁíÒ»¸ö¶ÔÏó£¬È»ºóÔÙÏòºóÕßÇëÇóÁíÒ»¸ö¶ÔÏó£¬È»ºó...£¬Õâ¾ÍÊÇÏûÏ¢Á´¡£²ÉÓÃÕâÖÖ·½Ê½£¬Òâζ×ſͻ§´úÂ뽫Óë¶ÔÏó¼äµÄ¹ØÏµ½ôÃÜñîºÏ¡£ + +¸ÄÓú¯ÊýÁ´£¬Óú¯ÊýίÍÐÁíÒ»¸ö¶ÔÏóÀ´´¦Àí¡£ + +## 16. Middle Man£¨ÖмäÈË£© + +ÖмäÈ˸ºÔð´¦ÀíίÍиøËüµÄ²Ù×÷£¬Èç¹ûÒ»¸öÀàÖÐÓйý¶àµÄº¯Êý¶¼Î¯ÍиøÆäËüÀ࣬ÄǾÍÊǹý¶ÈÔËÓÃίÍУ¬Ó¦µ± Remove Middle Man£¬Ö±½ÓÓ븺ÔðµÄ¶ÔÏó´ò½»µÀ¡£ + +## 17. Inappropriate Intimacy£¨áòêǹØÏµ£© + +Á½¸öÀà¶àÓÚÇ×ÃÜ£¬»¨·ÑÌ«¶àʱ¼äȥ̽ÌÖ±Ë´ËµÄ private ³É·Ö¡£ + +## 18. Alernative Classes with Different Interfaces£¨ÒìÇúͬ¹¤µÄÀࣩ + +## 19. Incomplete Library Class£¨²»ÍêÃÀµÄÀà¿â£© + +Àà¿âµÄÉè¼ÆÕß²»¿ÉÄÜÉè¼Æ³öÍêÃÀµÄÀà¿â£¬µ±ÎÒÃÇÐèÒª¶ÔÀà¿â½øÐÐһЩÐÞ¸Äʱ£¬¿ÉÒÔʹÓÃÒÔÏÂÁ½ÖÖ·½·¨£ºÈç¹ûÖ»ÊÇÐÞ¸ÄÒ»Á½¸öº¯Êý£¬Ê¹Óà Introduce Foreign Method£»Èç¹ûÒªÌí¼ÓÒ»´ó¶Ñ¶îÍâÐÐΪ£¬Ê¹Óà Introduce Local Extension¡£ + +## 20. Data Class£¨Ó×ÖɵÄÊý¾ÝÀࣩ + +ËüÖ»ÓµÓÐһЩÊý¾Ý×ֶΡ£ + +ÕÒ³ö×Ö¶ÎʹÓõĵط½£¬È»ºó°ÑÏàÓ¦µÄ²Ù×÷ÒÆµ½ Data Class ÖС£ + +## 21. Refused Bequest£¨±»¾Ü¾øµÄÀ¡Ôù£© + +×ÓÀà¼Ì³Ð³¬ÀàµÄËùÓк¯ÊýºÍÊý¾Ý£¬µ«ÊÇËüÖ»ÏëÒªÒ»²¿·Ö¡£ + +Ϊ×ÓÀàн¨Ò»¸öÐÖµÜÀ࣬²»ÐèÒªµÄº¯Êý»òÊý¾ÝʹÓà Push Down Method ºÍ Push Down Field ÏÂÍÆ¸øÄǸöÐֵܡ£ + +## 22. Comments£¨¹ý¶àµÄ×¢ÊÍ£© + +ʹÓà Extract Method ÌáÁ¶³öÐèҪעÊ͵IJ¿·Ö£¬È»ºóÓú¯ÊýÃûÀ´½âÊͺ¯ÊýµÄÐÐΪ¡£ + +# µÚËÄÕ ¹¹Öþ²âÊÔÌåϵ + +Java ¿ÉÒÔʹÓà Junit ½øÐе¥Ôª²âÊÔ¡£ + +µ¥Ôª²âÊԵĶÔÏóÊÇÀàµÄ·½·¨£¬¶ø¹¦ÄܲâÒÔ¿Í»§µÄ½Ç¶È±£Ö¤Èí¼þÕý³£ÔËÐС£ + +Ó¦µ±¼¯ÖвâÊÔ¿ÉÄܳö´íµÄ±ß½çÌõ¼þ¡£ + +# µÚÎåÕÂ ÖØ¹¹Áбí + +С²½Ç°½ø£¬Æµ·±²âÊÔ¡£ + +# µÚÁùÕÂ ÖØÐÂ×éÖ¯º¯Êý + +## 1. Extract Method£¨ÌáÁ¶º¯Êý£© + +½«Õâ¶Î´úÂë·Å½øÒ»¸ö¶ÀÁ¢º¯ÊýÖУ¬²¢Èú¯ÊýÃû³Æ½âÊ͸ú¯ÊýµÄÓÃ;¡£ + +## 2. Inline Method£¨ÄÚÁªº¯Êý£© + +Ò»¸öº¯ÊýµÄ±¾ÌåÓëÃû³ÆÍ¬ÑùÇå³þÒ×¶®¡£ + +ÔÚº¯Êýµ÷Óõã²åÈ뺯Êý±¾Ì壬ȻºóÒÆ³ý¸Ãº¯Êý¡£ + +## 3. Inline Temp£¨ÄÚÁªÁÙʱ±äÁ¿£© + +Ò»¸öÁÙʱ±äÁ¿£¬Ö»±»¼òµ¥±í´ïʽ¸³ÖµÒ»´Î£¬¶øËü·Á°­ÁËÆäËüÖØ¹¹ÊÖ·¨¡£ + +½«ËùÓжԸñäÁ¿µÄÒýÓÃÌæ»»Îª¶ÔËü¸³ÖµµÄÄǸö±í´ïʽ×ÔÉí¡£ + +```java +double basePrice = anOrder.basePrice(); +return basePrice > 1000; +``` + +```java +return anOrder.basePrice() > 1000; +``` + +## 4. Replace Temp with Query£¨ÒÔ²éѯȡ´úÁÙʱ±äÁ¿£© + +ÒÔÁÙʱ±äÁ¿±£´æÄ³Ò»±í´ïʽµÄÔËËã½á¹û£¬½«Õâ¸ö±í´ïʽÌáÁ¶µ½Ò»¸ö¶ÀÁ¢º¯ÊýÖУ¬½«ËùÓжÔÁÙʱ±äÁ¿µÄÒýÓõãÌæ»»Îª¶Ôк¯ÊýµÄµ÷Óá£Replace Temp with Query ÍùÍùÊÇ Extract Method ֮ǰ±Ø²»¿ÉÉÙµÄÒ»¸ö²½Ö裬ÒòΪ¾Ö²¿±äÁ¿»áʹ´úÂëÄÑÒÔÌáÁ¶¡£ + +```java +double basePrice = quantity * itemPrice; +if(basePrice > 1000) + return basePrice * 0.95; +else + return basePrice * 0.98; +``` + +```java +if(basePrice() > 1000) + return basePrice() * 0.95; +else + return basePrice() * 0.98; + +// ... +double basePrice(){ + return quantity * itemPrice; +} +``` + +## 5. Introduce Explaining Variable£¨ÒýÆð½âÊͱäÁ¿£© + +½«¸´ÔÓ±í´ïʽ£¨»òÆäÖÐÒ»²¿·Ö£©µÄ½á¹û·Å½øÒ»¸öÁÙʱ±äÁ¿£¬ÒԴ˱äÁ¿Ãû³ÆÀ´½âÊͱí´ïʽÓÃ;¡£ + +```java +if((platform.toUpperCase().indexOf("MAC") > -1) && + (browser.toUpperCase().indexOf("IE") > -1) && + wasInitialized() && resize > 0) { + // do something +} +``` + +```java +final boolean isMacOS = platform.toUpperCase().indexOf("MAC") > -1; +final boolean isIEBrower = browser.toUpperCase().indexOf("IE") > -1; +final boolean wasResized = resize > 0; + +if(isMacOS && isIEBrower && wasInitialized() && wasResized) { + // do something +} +``` + +## 6. Split Temporary Variable£¨·Ö½âÁÙʱ±äÁ¿£© + +ij¸öÁÙʱ±äÁ¿±»¸³Öµ³¬¹ýÒ»´Î£¬Ëü¼È²»ÊÇÑ­»·±äÁ¿£¬Ò²²»ÊÇÓÃÓÚÊÕ¼¯¼ÆËã½á¹û¡£ + +Õë¶Ôÿ´Î¸³Öµ£¬´´ÔìÒ»¸ö¶ÀÁ¢¡¢¶ÔÓ¦µÄÁÙʱ±äÁ¿£¬Ã¿¸öÁÙʱ±äÁ¿Ö»³Ðµ£Ò»¸öÔðÈΡ£ + +## 7. Remove Assigments to Parameters£¨ÒƳý¶Ô²ÎÊýµÄ¸³Öµ£© + +ÒÔÒ»¸öÁÙʱ±äÁ¿È¡´ú¶Ô¸Ã²ÎÊýµÄ¸³Öµ¡£ + +```java +int discount (int inputVal, int quentity, int yearToDate){ + if (inputVal > 50) inputVal -= 2; +``` + +```java +int discount (int inputVal, int quentity, int yearToDate){ + int result = inputVal; + if (inputVal > 50) result -= 2; +``` + +## 8. Replace Method with Method Object£¨ÒÔº¯Êý¶ÔÏóÈ¡´úº¯Êý£© + +µ±¶ÔÒ»¸ö´óÐͺ¯Êý²ÉÓà Extract Method ʱ£¬ÓÉÓÚ°üº¬Á˾ֲ¿±äÁ¿Ê¹µÃºÜÄѽøÐиòÙ×÷¡£ + +½«Õâ¸öº¯Êý·Å½øÒ»¸öµ¥¶À¶ÔÏóÖУ¬Èç´ËÒ»À´¾Ö²¿±äÁ¿¾Í³ÉÁ˶ÔÏóÄÚµÄ×ֶΡ£È»ºó¿ÉÒÔÔÚͬһ¸ö¶ÔÏóÖн«Õâ¸ö´óÐͺ¯Êý·Ö½âΪ¶à¸öСÐͺ¯Êý¡£ + +## 9. Subsititute Algorithn£¨Ìæ»»Ëã·¨£© + +# µÚÆßÕ ÔÚ¶ÔÏóÖ®¼ä°áÒÆÌØÐÔ + +## 1. Move Method£¨°áÒÆº¯Êý£© + +ÀàÖеÄij¸öº¯ÊýÓëÁíÒ»¸öÀà½øÐиü¶à½»Á÷£ºµ÷ÓúóÕß»òÕß±»ºóÕßµ÷Óᣠ+ +½«Õâ¸öº¯Êý°áÒÆµ½ÁíÒ»¸öÀàÖС£ + +## 2. Move Field£¨°áÒÆ×ֶΣ© + +ÀàÖеÄij¸ö×ֶα»ÁíÒ»¸öÀà¸ü¶àµØÓõ½£¬ÕâÀïµÄÓõ½ÊÇÖ¸µ÷ÓÃȡֵÉèÖµº¯Êý£¬Ó¦µ±°Ñ¸Ã×Ö¶ÎÒÆµ½ÁíÒ»¸öÀàÖС£ + +## 3. Extract Class£¨ÌáÁ¶Àࣩ + +ij¸öÀà×öÁËÓ¦µ±ÓÉÁ½¸öÀà×öµÄÊ¡£ + +Ó¦µ±½¨Á¢Ò»¸öÐÂÀ࣬½«Ïà¹ØµÄ×ֶκͺ¯Êý´Ó¾ÉÀà°áÒÆµ½ÐÂÀà¡£ + +## 4. Inline Class£¨½«ÀàÄÚÁª»¯£© + +Óë Extract Class Ïà·´¡£ + +## 5. Hide Delegate£¨Òþ²Ø¡°Î¯ÍйØÏµ¡±£© + +½¨Á¢ËùÐèµÄº¯Êý£¬Òþ²ØÎ¯ÍйØÏµ¡£ + +```java +class Person{ + Department department; + + public Department getDepartment(){ + return department; + } +} + +class Department{ + private Person manager; + + public Person getManager(){ + return manager; + } +} +``` + +Èç¹û¿Í»§Ï£ÍûÖªµÀijÈ˵ľ­ÀíÊÇË­£¬±ØÐë»ñµÃ Department ¶ÔÏó£¬ÕâÑù¾Í¶Ô¿Í»§½Ò¶ÁË Department µÄ¹¤×÷Ô­Àí¡£ + +```java +Person manager = john.getDepartment().getManager(); +``` + +ͨ¹ýΪ Peron ½¨Á¢Ò»¸öº¯ÊýÀ´Òþ²ØÕâÖÖίÍйØÏµ¡£ + +```java +public Person getManager(){ + return department.getManager(); +} +``` + +## 6. Remove Middle Man£¨ÒƳýÖмäÈË£© + +Óë Hide Delegate Ïà·´£¬±¾·½·¨ÐèÒªÒÆ³ýίÍк¯Êý£¬Èÿͻ§Ö±½Óµ÷ÓÃίÍÐÀà¡£ + +Hide Delegate ÓкܴóºÃ´¦£¬µ«ÊÇËüµÄ´ú¼ÛÊÇ£ºÃ¿µ±¿Í»§ÒªÊ¹ÓÃÊÜÍÐÀàµÄÐÂÌØÐÔʱ£¬¾Í±ØÐëÔÚ·þÎñÆ÷¶ËÌí¼ÓÒ»¸ö¼òµ¥µÄίÍк¯Êý¡£Ëæ×ÅÊÜίÍеÄÌØÐÔÔ½À´Ô½¶à£¬·þÎñÆ÷ÀàÍêÈ«±ä³ÉÁËÒ»¸ö¡°ÖмäÈË¡±¡£ + +## 7. Introduce Foreign Method£¨ÒýÈëÍâ¼Óº¯Êý£© + +ÐèҪΪÌṩ·þÎñµÄÀàÌí¼ÓÒ»¸öº¯Êý£¬µ«ÊÇÎÞ·¨ÐÞ¸ÄÕâ¸öÀà¡£ + +¿ÉÒÔÔÚ¿Í»§ÀàÖн¨Á¢Ò»¸öº¯Êý£¬²¢ÒÔµÚÒ»²ÎÊýÐÎʽ´«ÈëÒ»¸ö·þÎñÀàµÄʵÀý£¬Èÿͻ§Àà×éºÏ·þÎñÆ÷ʵÀý¡£ + +## 8. Introduce Local Extension£¨ÒýÈë±¾µØÀ©Õ¹£© + +ºÍ Introduce Foreign Method Ä¿µÄÒ»Ñù£¬µ«ÊÇ Introduce Local Extension ͨ¹ý½¨Á¢ÐµÄÀàÀ´ÊµÏÖ¡£ÓÐÁ½ÖÖ·½Ê½£º×ÓÀà»òÕß°ü×°À࣬×ÓÀà¾ÍÊÇͨ¹ý¼Ì³ÐʵÏÖ£¬°ü×°Àà¾ÍÊÇͨ¹ý×éºÏʵÏÖ¡£ + +# µÚ°ËÕÂ ÖØÐÂ×éÖ¯Êý¾Ý + +## 1. Self Encapsulate Field£¨×Ô·â×°×ֶΣ© + +Ϊ×ֶν¨Á¢È¡Öµ/ÉèÖµº¯Êý£¬²¢ÓÃÕâЩº¯ÊýÀ´·ÃÎÊ×ֶΡ£Ö»Óе±×ÓÀàÏë·ÃÎʳ¬ÀàµÄÒ»¸ö×ֶΣ¬ÓÖÏëÔÚ×ÓÀàÖн«¶ÔÕâ¸ö×ֶηÃÎʸÄΪһ¸ö¼ÆËãºóµÄÖµ£¬²ÅʹÓÃÕâÖÖ·½Ê½£¬·ñÔòÖ±½Ó·ÃÎÊ×ֶεķ½Ê½¼ò½àÃ÷ÁË¡£ + +## 2. Replace Data Value with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý¾ÝÖµ£© + +ÔÚ¿ª·¢³õÆÚ£¬ÍùÍù»áÓüòµ¥µÄÊý¾ÝÏî±íʾ¼òµ¥µÄÇé¿ö£¬µ«ÊÇËæ×Å¿ª·¢µÄ½øÐУ¬Ò»Ð©¼òµ¥Êý¾ÝÏî»á¾ßÓÐÒ»Ð©ÌØÊâÐÐΪ¡£±ÈÈçÒ»¿ªÊ¼»á°Ñµç»°ºÅÂë´æ³É×Ö·û´®£¬µ«ÊÇËæºó·¢Ïֵ绰ºÅÂëÐèÒª¡°¸ñʽ»¯¡±¡¢¡°³éÈ¡ÇøºÅ¡±Ö®ÀàµÄÌØÊâÐÐΪ¡£ + +## 3. Change Value to Reference£¨½«Öµ¶ÔÏó¸Ä³ÉÒýÓöÔÏó£© + +½«±Ë´ËÏàµÈµÄʵÀýÌæ»»ÎªÍ¬Ò»¸ö¶ÔÏó¡£Õâ¾ÍÒªÓÃÒ»¸ö¹¤³§À´´´½¨ÕâÖÖΨһ¶ÔÏ󣬹¤³§ÀàÖÐÐèÒª±£ÁôÒ»·ÝÒѾ­´´½¨¶ÔÏóµÄÁÐ±í£¬µ±Òª´´½¨Ò»¸ö¶ÔÏóʱ£¬ÏȲéÕÒÕâ·ÝÁбíÖÐÊÇ·ñÒѾ­´æÔڸöÔÏó£¬Èç¹û´æÔÚ£¬Ôò·µ»ØÁбíÖеÄÕâ¸ö¶ÔÏó£»·ñÔò£¬Ð½¨Ò»¸ö¶ÔÏó£¬Ìí¼Óµ½ÁбíÖУ¬²¢·µ»Ø¸Ã¶ÔÏó¡£ + +## 4. Change Reference to value£¨½«ÒýÓöÔÏó¸ÄΪֵ¶ÔÏó£© + +ÒÔ Change Value to Reference Ïà·´¡£Öµ¶ÔÏóÓиö·Ç³£ÖØÒªµÄÌØÐÔ£ºËüÊDz»¿É±äµÄ£¬²»¿É±ä±íʾÈç¹ûÒª¸Ä±äÕâ¸ö¶ÔÏ󣬱ØÐëÓÃÒ»¸öеĶÔÏóÀ´Ìæ»»¾É¶ÔÏ󣬶ø²»ÊÇÐ޸ľɶÔÏó¡£ + +ÐèҪΪֵ¶ÔÏóʵÏÖ equals() ºÍ hashCode() ·½·¨ + +## 5. Replace Array with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý×飩 + +ÓÐÒ»¸öÊý×飬ÆäÖеÄÔªËØ¸÷×Ô´ú±í²»Í¬µÄ¶«Î÷¡£ + +ÒÔ¶ÔÏóÌæ»»Êý×飬¶ÔÓÚÊý×éÖеÄÿ¸öÔªËØ£¬ÒÔÒ»¸ö×Ö¶ÎÀ´±íʾ£¬ÕâÑù·½±ã²Ù×÷£¬Ò²¸üÈÝÒ×Àí½â¡£ + +## 6. Duplicate Observed Data£¨¸³Öµ¡°±»¼àÊÓÊý¾Ý¡±£© + +һЩÁìÓòÊý¾ÝÖÃÉíÓÚ GUI ¿Ø¼þÖУ¬¶øÁìÓòº¯ÊýÐèÒª·ÃÎÊÕâЩÊý¾Ý¡£ + +½«¸ÃÊý¾Ý¸³Öµµ½Ò»¸öÁìÓò¶ÔÏóÖУ¬½¨Á¢Ò»¸ö Oberver ģʽ£¬ÓÃÒÔͬ²½ÁìÓò¶ÔÏóºÍ GUI ¶ÔÏóÄÚµÄÖØ¸´Êý¾Ý¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e024bd7e-fb4e-4239-9451-9a6227f50b00.jpg) + +## 7. Change Unidirectional Association to Bidirectional£¨½«µ¥Ïò¹ØÁª¸ÄΪ˫Ïò¹ØÁª£© + +µ±Á½¸öÀà¶¼ÐèÒª¶Ô·½µÄÌØÐÔʱ£¬¿ÉÒÔʹÓÃË«Ïò¹ØÁª¡£ + +ÓÐÁ½¸öÀ࣬·Ö±ðΪ¶©µ¥ Order ºÍ¿Í»§ Customer£¬Order ÒýÓÃÁË Customer£¬Customer Ò²ÐèÒªÒýÓà Order À´²é¿´ÆäËùÓж©µ¥ÏêÇé¡£ + +```java +class Order{ + private Customer customer; + public void setCustomer(Customer customer){ + if(this.customer != null) + this.customer.removeOrder(this); + this.customer = customer; + this.customer.add(this); + } +} +``` +```java +class Curstomer{ + private Set orders = new HashSet<>(); + public void removeOrder(Order order){ + orders.remove(order); + } + public void addOrder(Order order){ + orders.add(order); + } +} +``` + +×¢Òâµ½£¬ÕâÀïÈà Curstomer ÀàÀ´¿ØÖƹØÁª¹ØÏµ¡£ÓÐÒÔÏÂÔ­ÔòÀ´¾ö¶¨ÄĸöÀàÀ´¿ØÖƹØÁª¹ØÏµ£ºÈç¹ûij¸ö¶ÔÏóÊÇ×é³ÉÁíÒ»¸ö¶ÔÏóµÄ²¿¼þ£¬ÄÇôÓɺóÕ߸ºÔð¿ØÖƹØÁª¹ØÏµ£»Èç¹ûÊÇÒ»¶Ô¶à¹ØÏµ£¬ÔòÓɵ¥Ò»ÒýÓÃÄÇÒ»·½À´¿ØÖƹØÁª¹ØÏµ¡£ + +## 8. Change Bidirectional Association to Unidirectional£¨½«Ë«Ïò¹ØÁª¸ÄΪµ¥Ïò¹ØÁª£© + +ºÍ Change Unidirectional Association to Bidirectiona Ϊ·´²Ù×÷¡£ + +Ë«Ïò¹ØÁªÎ¬»¤³É±¾¸ß£¬²¢ÇÒÒ²²»Ò×ÓÚÀí½â¡£´óÁ¿µÄË«ÏòÁ¬½ÓºÜÈÝÒ×Ôì³É¡°½©Ê¬¶ÔÏó¡±£ºÄ³¸ö¶ÔÏó±¾ÉíÒѾ­ËÀÍöÁË£¬È´±£ÁôÔÚϵͳÖУ¬ÒòΪËüµÄÒýÓû¹Ã»ÓÐÈ«²¿ÍêÈ«Çå³ý¡£ + +## 9. Replace Magic Number with Symbolic Constant£¨ÒÔ×ÖÃæ³£Á¿È¡´úħ·¨Êý£© + +´´½¨Ò»¸ö³£Á¿£¬¸ù¾ÝÆäÒâÒåΪËüÃüÃû£¬²¢½«×ÖÃæ³£Á¿»»Î»Õâ¸ö³£Á¿¡£ + +## 10. Encapsulate Field£¨·â×°×ֶΣ© + +public ×Ö¶ÎÓ¦µ±¸ÄΪ private£¬²¢ÌṩÏàÓ¦µÄ·ÃÎʺ¯Êý¡£ + +## 11. Encapsulate Collection£¨·â×°¼¯ºÏ£© + +º¯Êý·µ»Ø¼¯ºÏµÄÒ»¸öÖ»¶Á¸±±¾£¬²¢ÔÚÕâ¸öÀàÖÐÌṩÌí¼Ó/ÒÆ³ý¼¯ºÏÔªËØµÄº¯Êý¡£Èç¹ûº¯Êý·µ»Ø¼¯ºÏ×ÔÉí£¬»áÈÃÓû§µÃÒÔÐ޸ļ¯ºÏÄÚÈݶø¼¯ºÏÓµÓÐÕßÈ´Ò»ÎÞËùÖª¡£ + +## 12. Replace Record with Data Class£¨ÒÔÊý¾ÝÀàÈ¡´ú¼Ç¼£© + +## 13. Replace Type Code with Class£¨ÒÔÀàÈ¡´úÀàÐÍÂ룩 + +ÀàÖÐÓÐÒ»¸öÊýÖµÀàÐÍÂ룬µ«Ëü²¢²»Ó°ÏìÀàµÄÐÐΪ£¬¾ÍÓÃÒ»¸öÐÂÀàÌæ»»¸ÃÊýÖµÀàÐÍÂë¡£Èç¹ûÀàÐÍÂë³öÏÖÔÚ switch Óï¾äÖУ¬ÐèҪʹÓà Replace Conditional with Polymorphism È¥µô switch£¬Ê×ÏȱØÐëÔËÓà Replace Type Code with Subcalss »ò Replace Type Code with State/Strategy È¥µôÀàÐÍÂë¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/27c2e0b3-8f95-453d-bedc-6398a8566ce9.jpg) + +## 14. Replace Type Code with Subcalsses£¨ÒÔ×ÓÀàÈ¡´úÀàÐÍÂ룩 + +ÓÐÒ»¸ö²»¿É±äµÄÀàÐÍÂ룬Ëü»áÓ°ÏìÀàµÄÐÐΪ£¬ÒÔ×ÓÀàÈ¡´úÕâ¸öÀàÐÍÂë¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c41d3977-e0e7-4ee4-93e1-d84f1ae3e20e.jpg) + +## 15. Replace Type Code with State/Strategy £¨ÒÔ State/Strategy È¡´úÀàÐÍÂ룩 + +ÓÐÒ»¸ö¿É±äµÄÀàÐÍÂ룬Ëü»áÓ°ÏìÀàµÄÐÐΪ£¬ÒÔ״̬¶ÔÏóÈ¡´úÀàÐÍÂë¡£ + +ºÍ Replace Type Code with Subcalsses µÄÇø±ðÊÇ Replace Type Code with State/Strategy µÄÀàÐÍÂëÊǶ¯Ì¬¿É±äµÄ£¬Ç°Õßͨ¹ý¼Ì³ÐµÄ·½Ê½À´ÊµÏÖ£¬ºóÕßͨ¹ý×éºÏµÄ·½Ê½À´ÊµÏÖ¡£ÒòΪÀàÐÍÂë¿É±ä£¬Èç¹ûͨ¹ý¼Ì³ÐµÄ·½Ê½£¬Ò»µ©Ò»¸ö¶ÔÏóµÄÀàÐÍÂë¸Ä±ä£¬ÄÇô¾ÍÒª¸Ä±äÓÃеĶÔÏóÀ´È¡´ú¾É¶ÔÏ󣬶ø¿Í»§¶ËÄÑÒԸıäеĶÔÏó¡£µ«ÊÇͨ¹ý×éºÏµÄ·½Ê½£¬¸Ä±äÒýÓõÄ״̬ÀàÊǺÜÈÝÒ׵ġ£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/81fd1d6f-a3b2-4160-9a0a-1f7cb50ba440.jpg) + +## 16. Replace Subclass with Fields£¨ÒÔ×Ö¶ÎÈ¡´ú×ÓÀࣩ + +¸÷¸ö×ÓÀàµÄΨһ²î±ðÖ»ÔÚ¡°·µ»Ø³£Á¿Êý¾Ý¡±µÄº¯ÊýÉÏ¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f2e0cee9-ecdc-4a96-853f-d9f6a1ad6ad1.jpg) + +# µÚ¾ÅÕ ¼ò»¯Ìõ¼þ±í´ïʽ + +## 1. Decompose Conditional£¨·Ö½âÌõ¼þ±í´ïʽ£© + +¶ÔÓÚÒ»¸ö¸´ÔÓµÄÌõ¼þÓï¾ä£¬¿ÉÒÔ´Ó if¡¢then¡¢else Èý¸ö¶ÎÂäÖзֱðÌáÁ¶³ö¶ÀÁ¢º¯Êý¡£ + +```java +if(data.befor(SUMMER_START) || data.after(SUMMER_END)) + charge = quantity * winterRate + winterServiceCharge; +else charge = quantity * summerRate; +``` + +```java +if(notSummer(date)) + charge = winterCharge(quantity); +else charge = summerCharge(quantity); +``` + +## 2. Consolidate Conditional Expression£¨ºÏ²¢Ìõ¼þ±í´ïʽ£© + +ÓÐһϵÁÐÌõ¼þ²âÊÔ£¬¶¼µÃµ½Ïàͬ½á¹û¡£ + +½«ÕâЩ²âÊԺϲ¢ÎªÒ»¸öÌõ¼þ±í´ïʽ£¬²¢½«Õâ¸öÌõ¼þ±í´ïʽÌáÁ¶³ÉΪһ¸ö¶ÀÁ¢º¯Êý¡£ + +```java +double disabilityAmount(){ + if (seniority < 2) return 0; + if (monthsDisabled > 12 ) return 0; + if (isPartTime) return 0; + // ... +} +``` +```java +double disabilityAmount(){ + if (isNotEligibleForDisability()) return 0; + // ... +} +``` + +## 3. Consolidate Duplicate Conditional Fragments £¨ºÏ²¢Öظ´µÄÌõ¼þƬ¶Î£© + +ÔÚÌõ¼þ±í´ïʽµÄÿ¸ö·ÖÖ§ÉÏÓÐ×ÅÏàͬµÄÒ»¶Î´úÂë¡£ + +½«Õâ¶ÎÖØ¸´´úÂë°áÒÆµ½Ìõ¼þ±í´ïʽ֮Íâ¡£ + +```java +if (isSpecialDeal()){ + total = price * 0.95; + send(); +} else { + total = price * 0.98; + send(); +} +``` + +```java +if (isSpecialDeal()) { + total = price * 0.95; +} else { + total = price * 0.98; +} +send(); +``` + +## 4. Remove Control Flag£¨ÒƳý¿ØÖƱê¼Ç£© + +ÔÚһϵÁв¼¶û±í´ïʽÖУ¬Ä³¸ö±äÁ¿´øÓС°¿ØÖƱê¼Ç¡±µÄ×÷Óᣠ+ +Óà breakÓï ¾ä»ò return Óï¾äÀ´È¡´ú¿ØÖƱê¼Ç¡£ + +## 5. Replace Nested Conditional with Guard Clauses £¨ÒÔÎÀÓï¾äÈ¡´úǶÌ×Ìõ¼þ±í´ïʽ£© + +Èç¹ûij¸öÌõ¼þ¼«Æäº±¼û£¬¾ÍÓ¦¸Ãµ¥¶À¼ì²é¸ÃÌõ¼þ£¬²¢ÔÚ¸ÃÌõ¼þÎªÕæÊ±Á¢¿Ì´Óº¯ÊýÖзµ»Ø£¬ÕâÑùµÄµ¥¶À¼ì²é³£³£±»³ÆÎª¡°ÎÀÓï¾ä¡±£¨guard clauses£©¡£ + +Ìõ¼þ±í´ïʽͨ³£ÓÐÁ½ÖÖ±íÏÖÐÎʽ¡£µÚÒ»ÖÖÐÎʽÊÇ£ºËùÓзÖÖ§¶¼ÊôÓÚÕý³£ÐÐΪ¡£µÚ¶þÖÖÐÎʽÔòÊÇ£ºÌõ¼þ±í´ïʽÌṩµÄ´ð°¸ÖÐÖ»ÓÐÒ»ÖÖÊÇÕý³£ÐÐΪ£¬ÆäËû¶¼ÊDz»³£¼ûµÄÇé¿ö£¬¿ÉÒÔʹÓÃÎÀÓï¾ä±íÏÖËùÓÐÌØÊâÇé¿ö¡£ + +```java +double getPayAmount() { + double result; + if (isDead) result = deadAmount(); + else { + if (isSeparated) result = separatedAmount(); + else { + if (isRetired) result = retiredAmount(); + else result = normalPayAmount(); + }; + } + return result; +}; +``` + +```java +double getPayAmount() { + if (isDead) return deadAmount(); + if (isSeparated) return separatedAmount(); + if (isRetired) return retiredAmount(); + return normalPayAmount(); +}; +``` + +## 6. Replace Conditional with Polymorphism £¨ÒÔ¶à̬ȡ´úÌõ¼þ±í´ïʽ£© + +½«Õâ¸öÌõ¼þ±í´ïʽµÄÿ¸ö·ÖÖ§·Å½øÒ»¸ö×ÓÀàÄڵĸ²Ð´º¯ÊýÖУ¬È»ºó½«Ô­Ê¼º¯ÊýÉùÃ÷Ϊ³éÏóº¯Êý¡£ÐèÒªÏÈʹÓà Replace Type Code with Subclass »ò Replace Type Code with State/Strategy À´½¨Á¢¼Ì³Ð½á¹û¡£ + +```java +double getSpeed() { + switch (type) { + case EUROPEAN: + return getBaseSpeed(); + case AFRICAN: + return getBaseSpeed()- getLoadFactor()* numberOfCoconuts; + case NORWEGIAN_BLUE: + return isNailed ? 0 : getBaseSpeed(voltage); + } + throw new RuntimeException("Should be unreachable"); +} +``` + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1c8432c8-2552-457f-b117-1da36c697221.jpg) + +## 7. Introduce Null Object£¨ÒýÈëNull¶ÔÏó£© + +½« null ÖµÌæ»»Îª null ¶ÔÏó¡£ÕâÑù×öµÄºÃ´¦ÔÚÓÚ£¬²»ÐèҪѯÎʶÔÏóÊÇ·ñΪ¿Õ£¬Ö±½Óµ÷ÓþÍÐС£ + +```java +if (customer == null) plan = BillingPlan.basic(); +else plan = customer.getPlan(); +``` + +## 8. Introduce Assertion£¨ÒýÈë¶ÏÑÔ£© + +ÒÔ¶ÏÑÔÃ÷È·±íÏÖijÖÖ¼ÙÉè¡£¶ÏÑÔÖ»ÄÜÓÃÓÚ¿ª·¢¹ý³ÌÖУ¬²úÆ·´úÂëÖв»»áÓжÏÑÔ¡£ + +```java +double getExpenseLimit() { + // should have either expense limit or a primary project + return (expenseLimit != NULL_EXPENSE) ? expenseLimit : primaryProject.getMemberExpenseLimit(); +} +``` + +```java +double getExpenseLimit() { + Assert.isTrue (expenseLimit != NULL_EXPENSE || primaryProject != null); + return (expenseLimit != NULL_EXPENSE) ? expenseLimit : primaryProject.getMemberExpenseLimit(); +} +``` + +# µÚʮՠ¼ò»¯º¯Êýµ÷Óà + +## 1. Rename Method£¨º¯Êý¸ÄÃû£© + +ʹº¯ÊýÃûÄܽâÊͺ¯ÊýµÄÓÃ;¡£ + +## 2. Add Parameter£¨Ìí¼Ó²ÎÊý£© + +ʹº¯Êý²»ÐèҪͨ¹ýµ÷ÓûñµÃij¸öÐÅÏ¢¡£ + +## 3. Remove Parameter£¨ÒƳý²ÎÊý£© + +Óë Add Parameter Ïà·´£¬¸ÄÓõ÷Óõķ½Ê½À´»ñµÃij¸öÐÅÏ¢¡£ + +## 4. Separate Query from Modifier£¨½«²éѯº¯ÊýºÍÐ޸ĺ¯Êý·ÖÀ룩 + +ij¸öº¯Êý¼´·µ»Ø¶ÔÏó״ֵ̬£¬ÓÖÐ޸ĶÔÏó״̬¡£ + +Ó¦µ±½¨Á¢Á½¸ö²»Í¬µÄº¯Êý£¬ÆäÖÐÒ»¸ö¸ºÔð²éѯ£¬ÁíÒ»¸ö¸ºÔðÐ޸ġ£ÈκÎÓзµ»ØÖµµÄº¯Êý£¬¶¼²»Ó¦¸ÃÓп´µÃµ½µÄ¸±×÷Óᣠ+ +```java +getTotalOutstandingAndSetReadyForSummaries(); +``` + +```java +getTotalOutstanding(); +setReadyForSummaries(); +``` + +## 5. Parameterize Method£¨ÁÊýЯ´ø²ÎÊý£© + +Èô¸Éº¯Êý×öÁËÀàËÆµÄ¹¤×÷£¬µ«ÔÚº¯Êý±¾ÌåÖÐÈ´°üº¬Á˲»Í¬µÄÖµ¡£ + +½¨Á¢µ¥Ò»º¯Êý£¬ÒÔ²ÎÊý±í´ïÄÇЩ²»Í¬µÄÖµ¡£ + +```java +fivePercentRaise(); +tenPercentRaise(); +``` +```java +raise(percentage); +``` + +## 6. Replace Parameter with Explicit Methods£¨ÒÔÃ÷È·º¯ÊýÈ¡´ú²ÎÊý£© + +ÓÐÒ»¸öº¯Êý£¬Íêȫȡ¾öÓÚ²ÎÊýÖµ¶ø²ÉÈ¡²»Í¬ÐÐΪ¡£ + +Õë¶Ô¸Ã²ÎÊýµÄÿһ¸ö¿ÉÄÜÖµ£¬½¨Á¢Ò»¸ö¶ÀÁ¢º¯Êý¡£ + +```java +void setValue(String name, int value){ + if (name.equals("height")){ + height = value; + return; + } + if (name.equals("width")){ + width = value; + return; + } + Assert.shouldNeverReachHere(); +} +``` + +```java +void setHeight(int arg){ + height = arg; +} +void setWidth(int arg){ + width = arg; +} +``` + +## 7. Preserve Whole Object£¨±£³Ö¶ÔÏóÍêÕû£© + +´Óij¸ö¶ÔÏóÖÐÈ¡³öÈô¸ÉÖµ£¬½«ËüÃÇ×÷Ϊijһ´Îº¯Êýµ÷ÓÃʱµÄ²ÎÊý¡£ + +¸ÄΪ´«µÝÕû¸ö¶ÔÏó¡£ + +```java +int low = daysTempRange().getLow(); +int high = daysTempRange().getHigh(); +withinPlan = plan.withinRange(low,high); +``` + +```java +withinPlan = plan.withinRange(daysTempRange()); +``` + +## 8. Replace Parameter with Methods£¨ÒÔº¯ÊýÈ¡´ú²ÎÊý£© + +¶ÔÏóµ÷ÓÃij¸öº¯Êý£¬²¢½«ËùµÃ½á¹û×÷Ϊ²ÎÊý£¬´«µÝ¸øÁíÒ»¸öº¯Êý¡£¶ø½ÓÊܸòÎÊýµÄº¯Êý±¾ÉíÒ²Äܹ»µ÷ÓÃǰһ¸öº¯Êý¡£ + +ÈòÎÊý½ÓÊÕÕßÈ¥³ý¸ÃÏî²ÎÊý£¬¶øÊÇÖ±½Óµ÷ÓÃǰһ¸öº¯Êý¡£ + +```java +int basePrice = _quantity * _itemPrice; +discountLevel = getDiscountLevel(); +double finalPrice = discountedPrice (basePrice, discountLevel); +``` + +```java +int basePrice = _quantity * _itemPrice; +double finalPrice = discountedPrice (basePrice); +``` + +## 9. Introduce Parameter Object£¨ÒýÈë²ÎÊý¶ÔÏó£© + +ijЩ²ÎÊý×ÜÊǺÜ×ÔÈ»µØÍ¬Ê±³öÏÖ£¬ÕâЩ²ÎÊý¾ÍÊÇ Data Clumps¡£ + +ÒÔÒ»¸ö¶ÔÏóÈ¡´úÕâЩ²ÎÊý¡£ + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/08738dd0-ae8e-404a-ba78-a6b1b7d225b3.jpg) + +## 10. Remove Setting Method£¨ÒƳýÉèÖµº¯Êý£© + +ÀàÖеÄij¸ö×Ö¶ÎÓ¦¸ÃÔÚ¶ÔÏó´´½¨Ê±±»ÉèÖµ£¬È»ºó¾Í²»Ôٸı䡣 + +È¥µô¸Ã×ֶεÄËùÓÐÉèÖµº¯Êý£¬²¢½«¸Ã×Ö¶ÎÉèΪ final¡£ + +## 11. Hide Method£¨Òþ²Øº¯Êý£© + +ÓÐÒ»¸öº¯Êý£¬´ÓÀ´Ã»Óб»ÆäËûÈκÎÀàÓõ½¡£ + +½«Õâ¸öº¯ÊýÐÞ¸ÄΪ private¡£ + +## 12. Replace Constructor with Factory Method £¨ÒÔ¹¤³§º¯ÊýÈ¡´ú¹¹Ô캯Êý£© + +Ï£ÍûÔÚ´´½¨¶ÔÏóʱ²»½ö½öÊÇ×ö¼òµ¥µÄ½¨¹¹¶¯×÷¡£ + +½«¹¹Ô캯ÊýÌæ»»Îª¹¤³§º¯Êý¡£ + +## 13. Encapsulate Downcast£¨·â×°ÏòÏÂתÐÍ£© + +ij¸öº¯Êý·µ»ØµÄ¶ÔÏó£¬ÐèÒªÓɺ¯Êýµ÷ÓÃÕßÖ´ÐÐÏòÏÂתÐÍ£¨downcast£©¡£ + +½«ÏòÏÂתÐͶ¯×÷ÒÆµ½º¯ÊýÖС£ + +```java +Object lastReading(){ + return readings.lastElement(); +} +``` +```java +Reading lastReading(){ + return (Reading)readings.lastElement(); +} +``` + +## 14. Replace Error Code with Exception £¨ÒÔÒ쳣ȡ´ú´íÎóÂ룩 + +ij¸öº¯Êý·µ»ØÒ»¸öÌØ¶¨µÄ´úÂ룬ÓÃÒÔ±íʾijÖÖ´íÎóÇé¿ö¡£ + +¸ÄÓÃÒì³££¬Òì³£½«ÆÕͨ³ÌÐòºÍ´íÎó´¦Àí·Ö¿ª£¬Ê¹´úÂë¸üÈÝÒ×Àí½â¡£ + +## 15. Replace Exception with Test£¨ÒÔ²âÊÔÈ¡´úÒì³££© + +Ãæ¶ÔÒ»¸öµ÷ÓÃÕß¿ÉÒÔÔ¤Ïȼì²éµÄÌõ¼þ£¬ÄãÅ׳öÁËÒ»¸öÒì³£¡£ + +Ð޸ĵ÷ÓÃÕߣ¬Ê¹ËüÔÚµ÷Óú¯Êý֮ǰÏÈ×ö¼ì²é¡£ + +```java +double getValueForPeriod(int periodNumber) { + try { + return values[periodNumber]; + } catch (ArrayIndexOutOfBoundsException e) { + return 0; + } +} +``` +```java +double getValueForPeriod(int periodNumber) { + if (periodNumber >= values.length) return 0; + return values[periodNumber]; +``` + +# µÚʮһÕ ´¦Àí¸ÅÀ¨¹ØÏµ + +## 1. Pull Up Field£¨×Ö¶ÎÉÏÒÆ£© + +Á½¸ö×ÓÀàÓµÓÐÏàͬµÄ×ֶΡ£ + +½«¸Ã×Ö¶ÎÒÆÖÁ³¬Àà¡£ + +## 2. Pull Up Method£¨º¯ÊýÉÏÒÆ£© + +ÓÐЩº¯Êý£¬ÔÚ¸÷¸ö×ÓÀàÖвúÉúÍêÈ«ÏàͬµÄ½á¹û¡£ + +½«¸Ãº¯ÊýÒÆÖÁ³¬Àà¡£ + +## 3. Pull Up Constructor Body£¨¹¹Ô캯Êý±¾ÌåÉÏÒÆ£© + +ÄãÔÚ¸÷¸ö×ÓÀàÖÐÓµÓÐһЩ¹¹Ô캯Êý£¬ËüÃǵı¾Ì弸ºõÍêȫһÖ¡£ + +ÔÚ³¬ÀàÖÐн¨Ò»¸ö¹¹Ô캯Êý£¬²¢ÔÚ×ÓÀ๹Ô캯ÊýÖе÷ÓÃËü¡£ + +```java +class Manager extends Employee... + +public Manager(String name, String id, int grade) { + this.name = name; + this.id = id; + this.grade = grade; +} +``` + +```java +public Manager(String name, String id, int grade) { + super(name, id); + this.grade = grade; +} +``` + +## 4. Push Down Method£¨º¯ÊýÏÂÒÆ£© + +³¬ÀàÖеÄij¸öº¯ÊýÖ»Ó벿·Ö×ÓÀàÓйء£ + +½«Õâ¸öº¯ÊýÒÆµ½Ïà¹ØµÄÄÇЩ×ÓÀàÈ¥¡£ + +## 5. Push Down Field£¨×Ö¶ÎÏÂÒÆ£© + +³¬ÀàÖеÄij¸ö×Ö¶ÎÖ»±»²¿·Ö×ÓÀàÓõ½¡£ + +½«Õâ¸ö×Ö¶ÎÒÆµ½ÐèÒªËüµÄÄÇЩ×ÓÀàÈ¥¡£ + +## 6. Extract Subclass£¨ÌáÁ¶×ÓÀࣩ + +ÀàÖеÄÄ³Ð©ÌØÐÔÖ»±»Ä³Ð©ÊµÀýÓõ½¡£ + +н¨Ò»¸ö×ÓÀ࣬½«ÉÏÃæËù˵µÄÄÇÒ»²¿·ÖÌØÐÔÒÆµ½×ÓÀàÖС£ + +## 7. Extract Superclass£¨ÌáÁ¶³¬Àࣩ + +Á½¸öÀàÓÐÏàËÆÌØÐÔ¡£ + +ΪÕâÁ½¸öÀཨÁ¢Ò»¸ö³¬À࣬½«ÏàÍ¬ÌØÐÔÒÆÖÁ³¬Àà¡£ + +## 8. Extract Interface£¨ÌáÁ¶½Ó¿Ú£© + +Èô¸É¿Í»§Ê¹ÓÃÀà½Ó¿ÚÖеÄͬһ×Ó¼¯£¬»òÕßÁ½¸öÀàµÄ½Ó¿ÚÓв¿·ÖÏàͬ¡£ + +½«ÏàͬµÄ×Ó¼¯ÌáÁ¶µ½Ò»¸ö¶ÀÁ¢½Ó¿ÚÖС£ + +## 9. Collapse Hierarchy£¨ÕÛµþ¼Ì³ÐÌåϵ£© + +³¬ÀàºÍ×ÓÀàÖ®¼äÎÞÌ«´óÇø±ð¡£ + +½«ËüÃǺÏΪһÌå¡£ + +## 10. Form Template Method£¨ËÜÔìÄ£°åº¯Êý£© + +ÄãÓÐһЩ×ÓÀ࣬ÆäÖÐÏàÓ¦µÄijЩº¯ÊýÒÔÏàͬ˳ÐòÖ´ÐÐÀàËÆµÄ²Ù×÷£¬µ«¸÷¸ö²Ù×÷µÄϸ½ÚÉÏÓÐËù²»Í¬¡£ + +½«ÕâЩ²Ù×÷·Ö±ð·Å½ø¶ÀÁ¢º¯ÊýÖУ¬²¢±£³ÖËüÃǶ¼ÓÐÏàͬµÄÇ©Ãû£¬ÓÚÊÇÔ­º¯ÊýÒ²¾Í±äµÃÏàͬÁË¡£È»ºó½«Ô­º¯ÊýÉÏÒÆÖÁ³¬Àà¡£(Ä£°å·½·¨Ä£Ê½) + +## 11. Replace Inheritance with Delegation £¨ÒÔίÍÐÈ¡´ú¼Ì³Ð£© + +ij¸ö×ÓÀàֻʹÓó¬Àà½Ó¿ÚÖеÄÒ»²¿·Ö£¬»òÊǸù±¾²»ÐèÒª¼Ì³Ð¶øÀ´µÄÊý¾Ý¡£ + +ÔÚ×ÓÀàÖÐн¨Ò»¸ö×Ö¶ÎÓÃÒÔ±£´æ³¬À࣬µ÷Õû×ÓÀຯÊý£¬ÁîËü¸Ä¶øÎ¯Íг¬À࣬ȻºóÈ¥µôÁ½ÕßÖ®¼äµÄ¼Ì³Ð¹ØÏµ¡£ + +## 12. Replace Delegation with Inheritance £¨ÒԼ̳ÐÈ¡´úίÍУ© + +ÄãÔÚÁ½¸öÀàÖ®¼äʹÓÃίÍйØÏµ£¬²¢¾­³£ÎªÕû¸ö½Ó¿Ú±àдÐí¶à¼«¼òµ¥µÄίÍк¯Êý¡£ + +ÈÃίÍÐÀà¼Ì³ÐÊÜÍÐÀà¡£ diff --git a/notes/黑客与画家.md b/notes/黑客与画家.md new file mode 100644 index 00000000..a50f6453 --- /dev/null +++ b/notes/黑客与画家.md @@ -0,0 +1,135 @@ + +* [ÒëÕßÐò](#ÒëÕßÐò) +* [ΪʲôÊé´ô×Ó²»ÊÜ»¶Ó­](#ΪʲôÊé´ô×Ó²»ÊÜ»¶Ó­) +* [ºÚ¿ÍÓë»­¼Ò](#ºÚ¿ÍÓë»­¼Ò) +* [²»ÄÜ˵µÄ»°](#²»ÄÜ˵µÄ»°) +* [ÁíÒ»Ìõ·](#ÁíÒ»Ìõ·) +* [Éè¼ÆÓëÑо¿](#Éè¼ÆÓëÑо¿) + + +# ÒëÕßÐò + +×÷ÕߣºÃÀ¹ú»¥ÁªÍø´´ÒµÖ®¸¸ + +×ʼ hack Ö¸µÄÊÇÄÑÌâµÄ½â¾ö°ì·¨£¬ÄÇЩ×îÄܸɵÄÈ˱»³ÉΪ hacker¡£ºÚ¿Í°üº¬ÒÔÏÂÈý¸öÌØµã£ººÃÍæ¡¢¸ßÖÇÉÌ¡¢Ì½Ë÷¾«Éñ¡£ºÚ¿ÍµÄºËÐļÛÖµ¹Û£º·ÖÏí¡¢¿ª·Å¡¢ÃñÖ÷¡¢¼ÆËã»úµÄ×ÔÓÉʹÓᢽø²½¡£Òò´ËºÚ¿ÍÖ¸µÄÊÇÄÇЩר¼Ò¼¶³ÌÐòÔ±¡£ + +ÓÉÓںڿͳ£³£ÈëÇÖϵͳ£¬Òò´Ë±»ÓëÄÇÐ©ÆÆ»µ¼ÆËã»úϵͳµÄÈËÁªÏµÆðÀ´¡£È»¶øÆÆ»µ¼ÆËã»úϵͳµÄÈ˳ÆÎªº§¿Í£¬ÕæÕýµÄºÚ¿Í²»Õâô×ö£¬·´¶øÊÇÈÃÊÀ½ç±äµÃ¸üºÃ¡£ + +# ΪʲôÊé´ô×Ó²»ÊÜ»¶Ó­ + +×÷ÕßÈÏΪ£¬¡°Êé´ô×Ó¡±ºÍ¡°¸ßÖÇÉÌ¡±ÕýÏà¹Ø£¬¶ø¡°Êé´ô×Ó¡±ºÍ¡°ÊÜ»¶Ó­¡±¸ºÏà¹Ø¡£ + +Ìá³öÎÊÌ⣺¼ÈÈ»Êé´ô×ÓÖÇÉ̸ߣ¬ÄÇôΪʲô²»Ïë³öÊÜ»¶Ó­µÄ·½·¨£¿ÒòΪҪÏëÊÜ»¶Ó­£¬ÐèҪͶÈëºÜ´óµÄʱ¼ä¾«Á¦È¥ËÜÔì¸öÈË÷ÈÁ¦¡£¶øÊé´ô×ÓûÓÐÄÇô¶àµÄʱ¼äºÍ¾«Á¦£¬Ïà±ÈÓÚÊÜ»¶Ó­£¬ËûÃǸüÔÚºõÆäËü¸üÓÐȤµÄÊ£¬±ÈÈçÉè¼ÆÆæÃîµÄ»ð¼ýµÈ¡£ + +ÆÛ¸ºÊé´ô×ÓµÄÔ­Òò£º + +- ÇàÉÙÄêµÄº¢×Ó¸ü¼Ó²ÐÈÌ£¬Êé´ô×Ó²»ÊÜ»¶Ó­Òâζ×ű»ÆçÊÓºÍÊÜÆÛ¸º¡£ + > 11 ËêÒÔǰ£¬Ð¡º¢µÄÉú»îÓɼҳ¤Ö÷µ¼£¬ÆäËûº¢×ÓµÄÓ°ÏìÓÐÏÞ¡£ º¢×ÓÃDz»ÊDz»¹ØÐÄСѧÀïÆäËûͬѧµÄÏë·¨£¬µ«ÊǺóÕß²»¾ßÓоö¶¨ÐÔÓ°Ï졣Сѧ±ÏÒµÒÔºó£¬ÕâÖÖÇéÐοªÊ¼·¢Éú±ä»¯¡£µ½ÁË 11 Ëê×óÓÒ£¬º¢×ÓÃÇÖ𽥰ѼÒÍ¥Éú»îµ±×÷Ѱ³£ÊÂÁË¡£ ËûÃÇÔÚͬ°éÖпª±ÙÁËÒ»¸öеÄÊÀ½ç£¬²¢ÈÏΪÄǸöÊÀ½ç²ÅÊÇÖØÒªµÄ£¬±È¼ÒÀïµÄÊÀ½ç¸üÖØÒª¡£Êµ¼ÊÉÏ£¬Èç¹ûËûÃÇÔÚ¼ÒÀïÓ븸ĸ·¢Éú³åÍ»£¬ ·´¶øÄÜÔÚÄǸöеÄÊÀ½çÖÐÕõµÃÃæ×Ó£¬¶øËûÃÇҲȷʵ¸üÔÚºõÄǸöÊÀ½ç¡£µ«ÊÇ£¬ÎÊÌâÔÚÓÚ£¬º¢×ÓÃÇ×Ô¼º´´Ôì³öÀ´µÄÊÀ½çÊÇÒ»¸ö·Ç³£Ô­Ê¼µÄÊÀ½ç¡£ÇàÉÙÄêÔÚÐÄÀíÉÏ»¹Ã»ÓаÚÍѶùͯ״̬£¬ Ðí¶àÈ˶¼»á²ÐÈ̵ضԴýËûÈË¡£ËûÃÇÕÛÄ¥Êé´ô×ÓµÄÔ­Òò¾ÍÏñ°ÎµôÒ»ÌõÖ©ÖëÍÈÒ»Ñù£¬¾õµÃºÜºÃÍæ¡£ÔÚÒ»¸öÈ˲úÉúÁ¼ÖªÖ®Ç°£¬ÕÛÄ¥¾ÍÊÇÒ»ÖÖÓéÀÖ¡£ + +- ΪÁË͹ÏÔ×Ô¼º¡£ + > ÔÚÈκÎÉç»áµÈ¼¶ÖƶÈÖУ¬ÄÇЩ¶Ô×Ô¼ºÃ»×ÔÐŵÄÈ˾ͻáͨ¹ýŰ´ýËûÃÇÑÛÖеÄϵÈÈËÀ´Í»ÏÔ×Ô¼ºµÄÉí·Ý¡£ÎÒÒѾ­Òâʶµ½£¬ÕýÊÇÒòΪÕâ¸öÔ­Òò£¬ÔÚÃÀ¹úÉç»áÖеײã°×ÈËÊǶԴýºÚÈË×î²Ð¿áµÄȺÌå¡£×îÊÜ»¶Ó­µÄº¢×Ó²¢²»ÆÛ¸ºÊé´ô×Ó£¬ËûÃDz»ÐèÒª¿¿²ÈÔÚÊé´ô×ÓÉíÉÏÀ´µæ¸ß×Ô¼º¡£´ó²¿·ÖµÄÆÛ¸ºÀ´×Ô´¦ÓÚÏÂÒ»µÈ¼¶µÄѧÉú£¬ÄÇЩ½¹ÂǵÄÖмä²ã¡£ + +- ΪÁ˺ÍÊÜ»¶Ó­µÄÈ˽á³ÉͬÃË¡£ + > ûÓÐʲô±ÈÒ»¸ö¹²Í¬µÄµÐÈ˸üÄÜʹµÃÈËÃÇÍŽáÆðÀ´ÁË¡£Õâ¾ÍºÃ±ÈÒ»¸öÕþ¿Í£¬ËûÏëÈÃÑ¡ÃñÍü¼ÇÔã¸âµÄ¹úÄÚ¾ÖÊÆ£¬·½·¨¾ÍÊÇΪ¹ú¼ÒÕÒ³öÒ»¸öµÐÈË£¬ÄÄŵÐÈ˲¢²»ÕæµÄ´æÔÚ£¬ËûÒ²¿ÉÒÔ´´ÔìÒ»¸ö³öÀ´¡£Ò»ÈºÈËÔÚÒ»Æð£¬Ìô³öÒ»¸öÊé´ô×Ó£¬¾Ó¸ßÁÙÏÂµØÆÛ¸ºËû£¬¾Í»á°Ñ±Ë´ËÁªÏµÆðÀ´¡£Ò»Æð¹¥»÷Ò»¸öÍâÈË£¬ËùÓÐÈËÒò´Ë¾Í¶¼³ÉÁË×Ô¼ºÈË¡£Õâ¾ÍÊÇΪʲô×î¶ñÁÓµÄÒÔÇ¿ÁèÈõµÄʼþ¶¼ÓëÍÅÌåÓйصÄÔ­Òò¡£Ëæ±ãÕÒÒ»¸öÊé´ô×Ó£¬Ëû¶¼»á¸æËßÄ㣬һȺÈ˵ÄŰ´ý±ÈÒ»¸öÈ˵ÄŰ´ý²Ð¿áµÃ¶à¡£ + +ѧУÀÏʦµÄÖ»ÊǰѽÌÊéµ±³É¹¤×÷¡£ +> ¹«Á¢Ñ§Ð£µÄÀÏʦºÜÏñ¼àÓüµÄÓü×ä¡£¿´¹Ü¼àÓüµÄÈËÖ÷Òª¹ØÐĵÄÊÇ·¸È˶¼´ýÔÚ×Ô¼ºÓ¦¸Ã´ýµÄλÖá£È»ºó£¬È÷¸ÈËÓж«Î÷³Ô£¬¾¡¿ÉÄܲ»Òª·¢Éú¶·Å¹ºÍÉ˺¦Ê¼þ£¬Õâ¾Í¿ÉÒÔÁË¡£ + +µ½Éç»áÖ®ºó£¬Êé´ô×ӻᱻÓѺöԴý£¬ÒòΪËûÃÇ×öµÄÊÂÄܹ»²úÉú¸ü¶àµÄÓ°Ï죬¶øÉç»áÕýÐèÒªÕâЩӰÏì¡£ + +³ÉÄêÈ˰Ѻ¢×ÓÔÚѧУÊÜ¿àÊÜÄѹé½áΪÇà´ºÆÚµÄ¼¤ËØÓ°Ï죬µ«ÊÇʵ¼ÊÉÏÕâÊÇѧУÕâÖÖÌåÖÆµÄÎÊÌ⣬ѧУֻÊǰѺ¢×ÓÈ¦ÑøÆðÀ´£¬²»ÈÃËûÃǵ½´¦ÂÒÅÜ£¬È»¶øÑ§Ð£ÄÚ²¿´æÔÚןܶà²ÐÈÌ¡£ + +¹ýÈ¥µÄº¢×Ó¸üÔçͶÈëÉç»á£¬Ò²¸üÄܹ»ÕæÕýѧ»á±¾Áì¡£ +> ¹ýÈ¥µÄÉç»áÖУ¬ÇàÉÙÄê°çÑÝ×ÅÒ»¸ö¸ü»ý¼«µÄ½ÇÉ«¡£¹¤Òµ»¯Ê±´úµ½À´Ç°£¬ÇàÉÙÄê¶¼ÊÇijÖÖÐÎʽµÄѧͽ£¬²»ÊÇÔÚij¸ö×÷·»£¬¾ÍÊÇÔÚij¸öũׯ£¬ÉõÖÁÔÚijËÒ¾ü½¢ÉÏ¡£ËûÃDz»»á±»ÈÓµ½Ò»ÅÔ£¬´´Ôì×Ô¼ºµÄСÉç»á¡£ËûÃÇÊdzÉÄêÈËÉç»áµÄµÍ¼¶³ÉÔ±¡£ÒÔǰµÄÇàÉÙÄêËÆºõÒ²¸ü×ð¾´³ÉÄêÈË£¬ÒòΪ³ÉÄêÈ˶¼ÊÇ¿´µÃ¼ûµÄר¼Ò£¬»á´«ÊÚËûÃÇËùҪѧϰµÄ¼¼ÄÜ¡£Èç½ñµÄ´ó¶àÊýÇàÉÙÄ꣬¶ÔËûÃǵļҳ¤ÔÚÒ£Ô¶µÄ°ì¹«ÊÒËù´ÓÊµĹ¤×÷¼¸ºõÒ»ÎÞËùÖª¡£ËûÃÇ¿´²»µ½Ñ§Ð£×÷ÒµÓëδÀ´×ßÉÏÉç»áºó´ÓÊµĹ¤×÷ÓкÎÁªÏµ¡£ + +ѧУµÄʹÃüÊǽÌÊéÓýÈË£¬¶ø²¢Ã»ÓÐÍâ½çµÄѹÁ¦È¥¼à¶½ËûÃÇÕâô×ö£¬ËùÒÔÀÏʦºÍѧÉúË«·½ÍùÍù¶¼ÊÇ·óÑÜÁËÊ¡£ + +ûÓÐÍâÔڵĶÔÊÖ£¬º¢×ÓÃǾͻ¥Ïà°Ñ¶Ô·½µ±×÷¶ÔÊÖ¡£ + +³ÉÄêÈ˱áµÍÁ˺ܶàÃÀºÃµÄ¶«Î÷£¬±ÈÈç¡°È˸ñ¡±¡£ +> Ðí¶àÊé´ô×Ó¿ÉÄܶ¼ÓëÎÒÒ»Ñù£¬Ö±µ½¸ßÖбÏÒµ¶àÄêºó£¬²ÅÈ¥¶ÁÖÐѧÀïµÄÖ¸¶¨¶ÁÎï¡£µ«ÊÇ£¬ÎÒ´í¹ýµÄ¾ø²»½ö½öÖ»ÊǼ¸±¾Êé¶øÒÑ¡£ÎÒ¶ÔÐí¶àÃÀºÃµÄ×ÖÑÛ¶¼àÍÖ®ÒԱǣ¬±ÈÈç¡°È˸ñ¡±¡¢¡°ÕýÖ±¡±£¬ÒòΪ³ÉÄêÈ˱áµÍÁËÕâЩ´Ê¡£ÔÚËûÃÇ×ìÀÕâЩ´ÊËÆºõ¶¼ÊÇͬһ¸öÒâ˼¡ª¡ª¡°Ìý»°¡±¡£Ò»Ð©º¢×ÓÒòΪ¾ß±¸ËùνµÄ¡°È˸ñ¡±ºÍ¡°ÕýÖ±¡±£¬¶øÊܵ½¿ä½±£¬¿ÉÊÇËûÃDz»ÊÇ´ôµÃÏñһͷ´ó±¿Å££¬¾ÍÊÇÇḡµÃÏñÒ»¸ö²»¶¯ÄÔ½îµÄ´µÅ£Õß¡£Èç¹û¡°È˸ñ¡±ºÍ¡°ÕýÖ±¡±¾ÍÊÇÕâÖÖÑù×Ó£¬ÎÒÄþÔ¸²»ÒªËüÃÇ¡£ + +# ºÚ¿ÍÓë»­¼Ò + +ºÚ¿ÍºÍ»­¼ÒÒ»Ñù£¬¶¼ÊÇÒÕÊõ¼Ò£¬¶¼ÔÚ½øÐд´×÷¡£ + +ºÚ¿Í±È½Ïϲ»¶½Å±¾ÓïÑÔÄÇÖÖ¿ÉÒÔ¶¯Ì¬À©Õ¹£¬²¢ÇÒ¿ÉÒÔÏñǦ±Ê»­»­Ò»ÑùÐÞÐ޸ĸġ£ +> ±à³ÌÓïÑÔÊ×ÒªµÄÌØÐÔÓ¦¸ÃÊÇÔÊÐí¶¯Ì¬À©Õ¹£¨malleable£©¡£±à³ÌÓïÑÔÊÇÓÃÀ´°ïÖú˼¿¼³ÌÐòµÄ£¬¶ø²»ÊÇÓÃÀ´±í´ïÄãÒѾ­ÏëºÃµÄ³ÌÐò¡£ËüÓ¦¸ÃÊÇһ֧Ǧ±Ê£¬¶ø²»ÊÇÒ»Ö§¸Ö±Ê¡£Èç¹û´ó¼Ò¶¼ÏñѧУ½ÌµÄÄÇÑù±à³Ì£¬ÄÇô¾²Ì¬ÀàÐÍ£¨static typing£©ÊÇÒ»¸ö²»´íµÄ¸ÅÄî¡£µ«ÊÇ£¬ÎÒÈÏʶµÄºÚ¿Í£¬Ã»ÓÐÒ»¸öÈËϲ»¶Óþ²Ì¬ÀàÐÍÓïÑÔ±à³Ì¡£ÎÒÃÇÐèÒªµÄÊÇÒ»ÖÖ¿ÉÒÔËæÒâͿĨ¡¢²Á²Á¸Ä¸ÄµÄÓïÑÔ£¬ÎÒÃDz»ÏëÕý½óÎ£×ø£¬°ÑÒ»¸öÊ¢Âú¸÷ÖÖ±äÁ¿ÀàÐ͵IJ豭£¬Ð¡ÐÄÒíÒí·ÅÔÚ×Ô¼ºµÄÏ¥¸ÇÉÏ£¬ÎªÁËÓëһ˿²»¹¶µÄ±àÒëÆ÷´óÉô½»Ì¸£¬Å¬Á¦µØÌôÑ¡´ÊÓȷ±£±äÁ¿ÀàÐÍÆ¥Å䣬ºÃÈÃ×Ô¼ºÏÔµÃÀñòÓÖÖܵ½¡£ + +±àÂë²¢²»ÊÇ¿ÆÑ§Ñо¿£¬Òò´ËÊýѧ¼Ò²»Ò»¶¨Ð´Ò»ÊֺôúÂë¡£ +> ´´×÷Õß²»Í¬ÓÚ¿ÆÑ§¼Ò£¬Ã÷°×ÕâÒ»µãÓкܶàºÃ´¦¡£³ýÁ˲»ÓÃΪ¾²Ì¬ÀàÐÍ·³ÄÕÒÔÍ⣬»¹¿ÉÒÔÃâÈ¥ÁíÒ»¸öÕÛÄ¥¿ÆÑ§¼ÒµÄÄÑÌ⣬ÄǾÍÊÇ¡°¶ÔÊýѧµÄ¶Ê¼É¡±¡£¿ÆÑ§½çµÄÿһ¸öÈË£¬°µµØÀï¶¼ÏàÐÅÊýѧ¼Ò±È×Ô¼º´ÏÃ÷¡£ÎÒ¾õµÃ£¬Êýѧ¼Ò×Ô¼ºÒ²ÏàÐÅÕâÒ»µã¡£×îºóµÄ½á¹û¾ÍÊÇ¿ÆÑ§¼ÒÍùÍù»á°Ñ×Ô¼ºµÄ¹¤×÷¾¡¿ÉÄÜŪµÃ¿´ÉÏÈ¥ÏñÊýѧ¡£¶ÔÓÚÎïÀíѧÕâÑùµÄÁìÓò£¬Õâ¿ÉÄܲ»»áÓÐÌ«´ó²»Á¼Ó°Ïì¡£µ«ÊÇ£¬ÄãÔ½Íù×ÔÈ»¿ÆÑ§µÄ·½Ïò·¢Õ¹£¬Ëü¾ÍÔ½³ÉΪһ¸öÑÏÖØµÄÎÊÌâ¡£ + +ºÚ¿ÍΪÁËÄÜ×ö×Ô¼ºÏ²»¶×öµÄʲ¢ÇÒ¿ÉÒÔÑø»î×Ô¼º£¬ÍùÍù°×Ì칤×÷ÍíÉÏ×ö×Ô¼ºµÄÊ¡£ + +ÈȰ®±à³ÌµÄÈ˲»¿É±ÜÃâµÄ»á¿ª·¢×Ô¼ºµÄÏîÄ¿¡£ +> ÎÒÃÇÃæÊÔ³ÌÐòÔ±µÄʱºò£¬Ö÷Òª¹Ø×¢µÄÊÂÇé¾ÍÊÇÒµÓàʱ¼äËûÃÇдÁËʲôÈí¼þ¡£ÒòΪÈç¹ûÄã²»°®Ò»¼þÊ£¬Äã²»¿ÉÄܰÑËü×öµÃÕæÕýÓÅÐ㣬ҪÊÇÄãºÜÈȰ®±à³Ì£¬Äã¾Í²»¿É±ÜÃâµØ»á¿ª·¢Äã×Ô¼ºµÄÏîÄ¿¡£ + +ºÚ¿Í²»ÊÇ»úе¹¤×÷µÄ¼¼Êõ¹¤ÈË£¬¶øÊÇһλ´´×÷Õß¡£ +> Èç¹ûºÚ¿ÍÖ»ÊÇÒ»¸ö¸ºÔðʵÏÖÁìµ¼ÒâÖ¾µÄ¼¼Êõ¹¤ÈË£¬Ö°Ôð¾ÍÊǸù¾Ý¹æ¸ñ˵Ã÷Êéд³ö´úÂ룬ÄÇôËûÆäʵÓëÒ»¸öÍÚË®¹µµÄ¹¤ÈËÊÇÒ»ÑùµÄ£¬´ÓÕâÍ·ÍÚµ½ÄÇÍ·£¬½ö´Ë¶øÒÑ¡£µ«ÊÇ£¬Èç¹ûºÚ¿ÍÊÇÒ»¸ö´´×÷Õߣ¬Ëû´ÓʵľͲ»ÊÇ»úеÐԵŤ×÷£¬Ëû±ØÐë¾ß±¸Áé¸Ð¡£ + +# ²»ÄÜ˵µÄ»° + +Á÷ÐеĵÀµÂ¹ÛÄîËäÈ»ÔÚºóÊÀ¿´À´»áÊǻĵ®µÄ£¬µ«ÊÇÈç¹ûÔÚÏÖ½ñȥΥ±³ÕâЩµÀµÂ¹ÛÄ˵һЩ²»ºÏÊʵÄÑÔÂÛ£¬»áÈÃ×Ô¼º´¦ÓÚÂé·³Ö®ÖС£ + +×Ô¼º»áÉîÉîÔÞͬ×Ô¼ºµÄ¹Ûµã£¬²¢ÇÒÈ·ÐÅ»áµÃµ½±ðÈ˵ÄÈÏͬ£¬ºÜ¿ÉÄÜÊÇ£¬ÕâЩ¹ÛµãÊDZðÈ˸ø×Ô¼º¹àÊäµÄ£¬±ðÈË˵ʲô£¬×Ô¼º¾ÍÏàÐÅʲô¡£ + +²»ÄÜ˵µÄ»°ÍùÍùÊÇÕýÈ·µÄ»°£¬ÒòΪ¾ßÓÐÕùÒéÐÔ£¬»áÈÃijЩÈ˱©ÌøÈçÀס£ + +ÄÇЩ²»Ò»¶¨ÕýÈ·£¬¼«¸»ÕùÒéÐÔµÄÑÔÂÛ±»³ÉΪ¡°Òì¶Ëа˵¡°£¬ÈËÃdz£³£»á¸øËüÃǼÓÉϱêÇ©£¬Ä¿µÄÊÇΪÁË·âɱËüÃÇ¡£ +> ÙôäÂÉñÃ÷¡¢Ã°·¸Ê¥Áé¡¢Òì¶Ë¶¼ÊÇÎ÷·½ÀúÊ·Éϳ£¼ûµÄ±êÇ©£¬µ±´úµÄ±êÇ©ÔòÊÇÓÐÉ˷绯¡¢²»µÃÌå¡¢ÆÆ»µ¹ú¼ÒÀûÒæµÈ¡£ + +½û¼ÉµÄÍÆ³çÕßÊÇÄÇЩ´¦ÓÚÖеȽײãµÄÈË£¬ËûÃDz»Ïñ¸ßµÈ½×²ãÄÇÑùÓÐ×ã¹»×ÔÐű£»¤×Ô¼ºµÄÀûÒæ£¬ÓÖ²»Í¬Óڵ͵Ƚײ㣬ËûÃÇÓÐʵÁ¦È¥ÍÆÐС£ + +Á÷Ðй۵ãµÄµÚÒ»Åú×·ÖðÕßÊÇΪÁËÈÃ×Ô¼ºÓëÖÚ²»Í¬£¬¶øµÚ¶þÅúÔòÊÇÅÂ×Ô¼ºÓëÖÚ²»Í¬¡£ + +¿ÆÑ§¼ÒÍùÍùÐèÒª´òÆÆÁ÷Ðй۵㣬´Ó¶øÈ¡µÃÍ»ÆÆ¡£ + +Èç¹ûÒòΪ˵ÁËijЩ»°¶øÈøÉÈÅÁË×Ô¼ºµÄÉú»î£¬×îºÃ»¹ÊDZð˵¡£ +> ÕâʱÄãÒªÃ÷°×£¬×ÔÓÉ˼¿¼±È³©ËùÓûÑÔ¸üÖØÒª¡£Èç¹ûÄã¸Ðµ½Ò»¶¨Òª¸úÄÇЩÈ˱ç¸öÃ÷°×£¬¾ø²»ÑÊÏÂÕâ¿ÚÆø£¬Ò»¶¨Òª°Ñ»°ËµÇå³þ£¬½á¹ûºÜ¿ÉÄÜÊÇ´Ó´ËÄãÔÙÒ²ÎÞ·¨×ÔÓÉÀíÐÔµØË¼¿¼ÁË¡£ÎÒÈÏΪÕâÑù×ö²»¿ÉÈ¡£¬¸üºÃµÄ·½·¨ÊÇÔÚ˼ÏëºÍÑÔÂÛÖ®¼ä»®Ò»ÌõÃ÷È·µÄ½çÏß¡£ÔÚÐÄÀïÎÞËù²»Ï룬µ«ÊDz»Ò»¶¨ÒªËµ³öÀ´¡£ÎҾ͹ÄÀø×Ô¼ºÔÚÐÄÀïĬĬ˼¿¼ÄÇЩ×îÎÞ·¨ÎÞÌìµÄÏë·¨¡£ÄãµÄ˼ÏëÊÇÒ»¸öµØÏÂ×éÖ¯£¬¾ø²»Òª°ÑÄÇÀï·¢ÉúµÄÊÂÇéÒ»¹ÉÄÔ˵¸øÍâÈËÌý¡£¡°¸ñ¶·¾ãÀÖ²¿¡±µÄµÚÒ»Ìõ¹æÔò£¬¾ÍÊDz»ÒªÌáµ½¸ñ¶·¾ãÀÖ²¿¡£ + +µ±¿ñÈÈ·Ö×ÓÖÊÎÊÄãµÄ¹Ûµãʱ£¬×îºÃÊÇ˵×Ô¼º»¹Ã»ÏëºÃ¡£ + +ÈËÃÇ»áÎóÈÏΪ×Ô¼ºË¼Ï뿪·Å£¬µ«ÊÇËûÃÇÐÄÀïÔç¾ÍÓÐÒ»¸ù½çÏÞ£¬ÈÏΪʲôÊÇÕýÈ·µÄʲôÊÇ´íÎóµÄ¡£ + +¸üÉîÈëµÄÈÏʶ×Ô¼º¡£ +> ¶ùͯ¾«Æ£Á¦½ßʱ£¬¿ÉÄÜ»á´ó·¢Æ¢Æø£¬ÒòΪËû²»ÖªµÀΪÁËʲô£»³ÉÄêÈËÔò»áÁ˽âÊǸöÈ˵ÄÉíÌå×´¿öÎÊÌ⣬ÓëÍâ½çÎ޹أ¬ËµÒ»¾ä¡°Ã»¹ØÏµ£¬ÎÒÖ»ÊÇÀÛÁË¡±¡£ + +# ÁíÒ»Ìõ· + +»¥ÁªÍøÈí¼þµÄÓŵã + +1. ²»ÐèÒªÓû§À´¹ÜÀíϵͳ£¬Òò´Ë²»ÐèҪרÃŵļÆËã»ú֪ʶ£¬Ê¹ÓÃä¯ÀÀÆ÷¼´¿ÉʹÓã» +2. ÐèÒªµÄÓ²¼þ×ÊÔ´ºÜÉÙ£¬Ö»ÐèÒªÄÜÔËÐÐä¯ÀÀÆ÷²¢ÇÒÁªÍøµÄÉ豸¾ÍÐУ» +3. ¸ü·½±ã£¬ËæÊ±ËæµØ¾Í¿ÉÒÔʹÓã» +4. ²»Óõ£ÐÄÊý¾Ý¶ªÊ§£¬ÒòΪÊý¾Ý±£´æÔÚÔÆ¶Ë£» +5. Ò×ÓÚ¶ÔÈí¼þ½øÐÐÉý¼¶£¬¶øÓû§¿ÉÒÔÔÚÍêÈ«²»ÖªÇéµÄÇé¿öϼÌÐøÊ¹Óã» +6. ¸üÈÝÒ×µÄ bug ·¢ÏÖ£¬¸ü¿ìµÄ bug Ð޸ģ» +7. ÓÐרÃŵļ¼ÊõÈËÔ±¹ÜÀí·þÎñÆ÷£¬ÒòΪ¸ü¼Ó°²È«£» + + +bug Ô½¿ì·¢ÏÖÔ½ºÃ£¬¶ø»¥ÁªÍøÈí¼þÒòΪ·¢²¼ÖÜÆÚ¶Ì£¬Óû§·´À¡¿ì£¬Òò´Ë bug µÄ·¢ÏÖÒ²¸ü¿ì¡£ + +¸ß¼¶Óû§ºÜÀÖÒâ°ïÖúѰÕÒ bug¡£ +> ÒòΪÈí¼þ·¢²¼ÒԺ󣬴ó¶àÊý bug ¶¼ÊǺ±¼ûÇé¿öϲŻᷢÉúµÄ¸ö°¸£¬Êܵ½Ó°ÏìµÄÓû§ÍùÍù¶¼ÊǸ߼¶Ê¹ÓÃÕߣ¬ËûÃÇϲ»¶ÊÔÑéÄÇЩ²»³£Óõġ¢ÄѶȴóµÄ²Ù×÷¡£¸ß¼¶Ê¹ÓÃÕß¶Ô bug µÄÈÝÈ̶ȱȽϸߣ¬ÓÈÆäÈç¹ûÕâЩ bug ÊÇÔÚ¿ª·¢Ð¹¦ÄܵĹý³ÌÖÐÒýÈëµÄ£¬¶øÕâЩй¦ÄÜÓÖÕýÊÇËûÃÇËùÐèÒªµÄ£¬ËûÃǾ͸üÄÜÀí½âÁË¡£ÊÂʵÉÏ£¬ÒòΪ bug ²»¶à£¬ÄãÖ»Óо­¹ýһЩ¸´ÔӵĹý³ÌÒÔºó²Å»áÓöµ½ËüÃÇ£¬ËùÒԸ߼¶Ê¹ÓÃÕßÍùÍùÒòΪ·¢ÏÖÁË bug ¸Ðµ½ºÜµÃÒâ¡£ËûÃÇ´òµç»°¸ø¿Í·þʱ£¬¶à°ëÊÇÒ»¸±Ê¤ÀûÕߵĿÚÎÇ£¬¶ø²»ÊÇÅ­Æø³å³åµÄÑù×Ó£¬ºÃÏñËûÃÇ»÷°ÜÎÒÃǵ÷ÖÁËÒ»Ñù¡£ + +ºÃµÄ¼¼ÊõÖ§³ÖÊÇ£º¿Í·þÈËÔ±ºÍ¼¼ÊõÈËÔ±ÀëµÃºÜ½ü£¬²¢ÇÒµ±³¡ÐÞ¸´ bug¡£ + +Ò»¸öºÃµÄÏë·¨ÔÚʵÏÖ¹ý³ÌÖÐÄÜÒýÆð¸ü¶àÏë·¨£¬Òò´Ë¾¡ÔçȥʵÏÖËü±È½«ËüÊøÖ®¸ß¸óÄܹ»´øÀ´¸ü¶àºÃ´¦¡£ + +²»»á¹ºÂòÈí¼þµÄÓû§Ê¹ÓÃÁ˵Á°æÈí¼þÄܹ»ÈÃÈí¼þ¸ü¾ßÓÐÊг¡Ó°ÏìÁ¦¡£ +> Ò»¶¨ÊýÁ¿µÄµÁ°æ¶ÔÈí¼þ¹«Ë¾ÊÇÓкô¦µÄ¡£²»¹ÜÄãµÄÈí¼þ¶¨¼Û¶àÉÙ£¬ÓÐЩÓû§ÓÀÔ¶¶¼²»»á¹ºÂò¡£Èç¹ûÕâÑùµÄÓû§Ê¹ÓõÁ°æ£¬Ä㲢ûÓÐÈκÎËðʧ¡£ÊÂʵÉÏ£¬Äã·´¶ø×¬µ½ÁË£¬ÒòΪÄãµÄÈí¼þÏÖÔÚ¶àÁËÒ»¸öÓû§£¬Êг¡Ó°ÏìÁ¦¾Í¸ü´óÁËһЩ£¬¶øÕâ¸öÓû§¿ÉÄܱÏÒµÒÔºó¾Í»á³öÇ®¹ºÂòÄãµÄÈí¼þ¡£ + +# Éè¼ÆÓëÑо¿ + +Éè¼Æ×·ÇóµÄÊǺ㬶øÑо¿×·ÇóµÄÊÇС£ + +Óû§ÒªÇóºÍÓû§ÐèÇóÓÐÇø±ð£¬Óû§¿ÉÄܲ¢²»Á˽â×Ô¼ºÒªÊ²Ã´£¬ËùÒÔÓû§ÒªÇóµÄÄÚÈÝÍùÍù²»ÊÇÓû§ÕæÕýÐèÇóµÄ¶«Î÷¡£ + +ÒÕÊõÉè¼ÆÓëÈËΪ±¾£¬¶ø¿ÆÑ§Ñо¿×·Çó¼ò½àÕýÈ·¡£±ÈÈçÊýѧ¼Ò²»»áΪÁËÈöÁÕ߸üÈÝÒ×¶®¶ø²ÉÓÃÒ»ÖÖ¸üÂé·³µÄÖ¤Ã÷£¬¶øÊÇ»áÑ¡Ôñ×îÖ±½Ó¼ò½àµÄÖ¤Ã÷¡£±à³ÌÓïÑÔÒ²ÊÇÓëÈËΪ±¾µÄ£¬Òò´Ë±à³ÌÓïÑÔÒ²ÊÇͨ¹ýÉè¼Æ²úÉúµÄ¡£ + +´óÀíʯ×ö³öµÄ¶«Î÷ƯÁÁ£¬µ«ÊÇÖÆ×÷¹ý³ÌÈ´ºÜÄÑ£¬ÎÞ·¨²»¶ÏµÄ½øÐеñ×Á¡£±à³ÌÓïÑÔÒ²ÐèÒªÕâÖÖµñ×Á¹ý³Ì£¬Èç¹ûÒ»ÖÖ±à³ÌÓïÑÔÏñ´óÀíʯһÑù£¬Ö»Êǽá¹ûºÃ¿´£¬ÄÇôËü¾Í²»ÊÇÒ»Öֺõıà³ÌÓïÑÔ¡£ + +Éè¼ÆÈí¼þÓ¦µ±¾¡¿ìÄóöÔ­ÐÍÀ´¡£¾ÍÏñ»­»­Ò»Ñù£¬ÊÇÏÈÓü¸¸ùÏß»­³öÒ»¸ö´óÖÂ׼ȷµÄÂÖÀª£¬È»ºóÔÙÖð²½¼Ó¹¤¡£ +> »¹ÓÐÁíÒ»ÖÖÈí¼þÉè¼ÆË¼Ï룬ҲÐí¿ÉÒÔ±»³ÆÎª¡°Ê¥Ä¸ÂêÀöÑÇ¡±Ä£Ê½¡£Ëü²»ÒªÇ󾡿ìÄóöÔ­ÐÍ£¬È»ºóÔÙÖð²½ÓÅ»¯£¬ËüµÄ¹ÛµãÊÇÄãÓ¦¸ÃµÈµ½ÍêÕûµÄ³ÉÆ·³öÀ´ÒÔºóÔÙÒ»ÏÂ×ÓÂ¡ÖØµØÍÆÏòÊг¡£¬¾ÍÏñʥĸÂêÀöÑǽµÁÙÒ»Ñù£¬ÄÄÅÂÕû¸ö¹ý³ÌÂþ³¤µÃÏñéÏé­ÇòÔ˶¯Ô±³¤Í¾±¼Ï®Ò²Ã»ÓйØÏµ¡£ÔÚ»¥ÁªÍøÅÝĭʱÆÚ£¬ÎÞÊý´´Òµ¹«Ë¾ÒòΪÏàÐÅÁËÕâÖÖģʽ¶ø×Ô»Ùǰ³Ì¡£ + +Èç¹û¾õµÃ×öij¼þʺܷ¦Î¶£¬ÄÇô×ö³öÀ´µÄ¶«Î÷¾Í»áºÜ·¦Î¶¡£¿ìËÙµÄÔ­ÐÍÄܹ»ÈóÌÐòÔ±Óиü¸ßµÄÊ¿Æø£¬´Ó¶øÈÃËûÃǸüÓÐÐËȤȥʵÏÖ¡£Ò²¿ÉÒÔÀí½âΪ¿ìËÙ·´À¡ºÜÖØÒª¡£