Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
´úÂëÖØ¹¹Ö®µÀ
 
  4211  次浏览      27
 2018-10-25
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ¼òµ¥£¬±¾Îļòµ¥½éÉÜÁËÔÚ±£³ÖǰÆÚÁ¼ºÃÉè¼ÆºÍ¹æ»®Ö®ÉÏ£¬ÔËÓÃÒÔÉϽéÉܵĻùÓÚº¯Êý£¬À࣬±í´ïʽµÈµÄÖØ¹¹·½·¨£¬Ö𲽸ÄÉÆµ±Ç°ÏµÍ³µÄ´úÂëÖÊÁ¿£¬Î¬³ÖÔ­ÓÐϵͳµÄÁ¼ºÃÉè¼Æ¡£

1. ʲôÊÇÖØ¹¹

1.1 ÖØ¹¹(Refactoring)

¡°Öع¹¡±Õâ¸ö¸ÅÄî¶ÔÓÚµ±´úµÄ¿ª·¢ÈËÔ±À´ËµÒѾ­²»Ä°Éú£¬Ëü×îÔçÀ´×ÔsmalltalkȦ×Ó£¬Ö®ºó·ÇÕýʽµÄʹÓÃÁ˺ܶàÄ꣬¶øÖ±µ½1993Ä꣬William OpdykeÔÚËûµÄ²©Ê¿ÂÛÎÄ·¢±íÁ˵ÚÒ»ÆªÖøÃûµÄ¹ØÓÚÖØ¹¹µÄÎÄÕ£¬ÏµÍ³µÄÌá³öÁËÖØ¹¹µÄÀíÂÛÒÔ¼°ÆäÑо¿³É¹û¡£

¶¨Òå

Ãû´Ê£º

¶ÔÈí¼þÄÚ²¿½á¹¹µÄÒ»ÖÖµ÷Õû£¬Ä¿µÄÊÇÔÚ²»¸Ä±äÈí¼þ¿É¹Û²ìÐÐΪµÄǰÌáÏ£¬Ìá¸ßÆä¿ÉÀí½âÐÔ£¬½µµÍÆäÐ޸ijɱ¾

¶¯´Ê£º

ʹÓÃһϵÁÐÖØ¹¹ÊÖ·¨£¬ÔÚ²»¸Ä±äÈí¼þ¿É¹Û²ìÐÐΪµÄǰÌáÏ£¬µ÷ÕûÆä½á¹¹

1.2 ÖØ¹¹ÓëÉè¼ÆÄ£Ê½µÄ¹ØÏµ

Éè¼ÆÄ£Ê½ÊÇÀíÏëÖ÷Òå

ΪÀíÏëµÄÈí¼þÉè¼ÆÌṩĿ±ê£¬µ«ÊÇ´ïµ½Õâ¸öÄ¿±êͨ³£ºÜÀ§ÄÑ£¬ºÜÓпÉÄÜ´æÔÚ¹ý¶ÈÉè¼Æ

ÖØ¹¹ÊÇʵÓÃÖ÷Òå

Âú×㵱ǰÐèÇóÉè¼ÆÍ¬Ê±£¬ÔÚ°æ±¾µü´úÖв»¶Ï¸Ä½øµ±Ç°µÄÉè¼Æ£¬¾¡Á¿¿¿½üÉè¼ÆÄ£Ê½µÄÀíÏë¹ú¶È

ÏศÏà³ÉµÄ¹ØÏµ£¬Éè¼ÆÄ£Ê½ÎªÖØ¹¹ÌṩĿ±ê£¬ÔÚ²»¶ÏµÄÖØ¹¹ÖдﵽÀíÏë״̬

2. ÖØ¹¹µÄÐÄ̬

2.1 ²»Ô¸ÒâÖØ¹¹

´ó¶àÊýÈ˶¼²»Ï²»¶Öع¹£¬¾ÍÏñûÓÐÈËÔ¸Òâ¸ø±ðÈË¡°²Áƨ¹É¡±Ò»Ñù£¬ÌرðÊǶÔÓÚÐÂÊÖÀ´ËµÐèÒª¿Ë·þ²»ÉÙÕϰ­£¬Ö÷ÒªÊÇÒÔϼ¸µãÊÇÎÒÃÇËùµ£Óǵģº

²»ÖªµÀÈçºÎÖØ¹¹£¬È±·¦Öع¹µÄ¾­Ñé

ºÜÄÑ¿´µ½¶ÌÆÚÊÕÒæ£¬Èç¹ûÕâЩÀûÒæÊdz¤Ô¶µÄ£¬ºÎ±ØÏÖÔھ͸¶³öÕâЩŬÁ¦ÄØ£¿³¤Ô¶¿´À´£¬Ëµ²»¶¨µ±ÏîÄ¿ÊÕ»ñÕâЩÀûÒæÊ±£¬ÄãÒѾ­²»ÔÚְλÉÏ

´úÂëÖØ¹¹ÊÇÒ»Ïî¶îÍ⹤×÷£¬Àϰ帶Ǯ¸øÄ㣬Ö÷ÒªÊÇÈÃÄã±àдй¦ÄÜ£¬ÊµÏÖÐÂÐèÇó

ÖØ¹¹¿ÉÄÜÆÆ»µÏÖÓгÌÐò£¬´øÀ´Ô¤Ïë²»µ½µÄbug

2.2 ¹ý¶ÈÖØ¹¹(ÖØÐ´)

ÔÚÈí¼þ¿ª·¢µÄ³õʼ½×¶Î£¬Ã»ÓÐÈËÄܹ»ÏêϸԤ²â½«À´µÄÐèÇó±ä»¯£¬ËùÒÔ×î³õµÄÈí¼þÉè¼Æ¿Ï¶¨»áÓп¼ÂDz»ÖÜ»òÕß²»È«ÃæµÄµØ·½¡£¶øÒ»¸öÏîÄ¿¼¸ºõ²»¿ÉÄÜÒ»¸öÈË´Óͷдµ½Î²£¬ÔÚ½ÓÊÖ±ðÈË´úÂëµÄʱºò£¬ÍùÍù¿ÉÄÜÃæ¶ÔÀ©Õ¹ÄÑ£¬ÊµÏÖÄÑ¡£ÉõÖÁ¶ÔÓÚ²»¶Ï¶ÑÆö¶øÐγɵÄÔã¸â´úÂ룬ÍùÍù²»Öª¸ÃÈçºÎÏÂÊÖ¡£Õâʱ¶ÔÓÚ¼ÌÈÎÕßÀ´Ëµ£¬³£³£ÓÐÒ»¹É³¹µ×ÍÆµ¹Öؽ¨µÄ³å¶¯£¬ÌرðÊǶÔÓÚÓдúÂë½àñ±µÄ³ÌÐòÔ±À´Ëµ¸ü²»ÄÜÈÌÊÜ¡£Ãæ¶ÔÕâÖÖÇé¿ö£¬Æäʵ¸üÓ¦¸ÃÒÖÖÆÕâ¹É³å¶¯£¬Àä¾²ÏÂÀ´ÏëÒ»Ï룬ÓÐûÓиüºÃµÄ·½°¸¿ÉÒÔÑ­Ðò½¥½øµÄ¸ÄÉÆÏÖÓдúÂëµÄÉè¼Æ£¬ÒòΪÖ÷ÒªÓм¸µãÄãÓ¦¸Ã¿¼ÂÇ£º

ÖØÐ´ºÄʱºÄÁ¦£¬²âµ×ÅׯúÁËԭʼ»ýÀÛ

ÀíÏëµÄ״̬ÓпÉÄÜÁ¢Âí¸ÄÉÆÏÖÓдúÂëÉè¼Æ£¬È´Ò²»áÒýÈë²»ÉÙbug£¬»òÕßµôÈë¿ÓÀï

±È½Ï»µµÄÇé¿öÏ£¬ÎªÁ˼æÈݸ÷¸öʱÆÚµÄÒµÎñÐèÇó£¬ÖØÐ´Ö®ºóµÄÕûÌåÉè¼Æ²»Ò»¶¨»á±ÈÔ­ÓÐÉè¼ÆºÃ

Ô­ÓÐÉè¼ÆÖÁÉÙÔÚ¶àÂÖ»òÕß³ÖÐøÇ¿¶ÈQA²âÊÔ»·¾³ÏÂÄܹ»Îȶ¨ÔËÐУ¬ÍêÈ«ÍÆµ¹Öؽ¨ÊÇ·ñÄܱ£³ÖÔ­ÓдúÂëµÄÎȶ¨ÐÔ

3.ÖØ¹¹µÄÒâÒå

3.1±£³ÖÁ¼ºÃµÄ´úÂëÉè¼Æ

Äܹ»±£³ÖÁ¼ºÃµÄÉè¼Æ£¬²»½ö¿ÉÒÔ¾­Àú³¤ÆÚµÄ°æ±¾µü´úºÍ²»Í¬¿ª·¢ÕßµÄÏ´Àñ£¬¸üÄܹ»Ç¿»¯Ô­ÓÐÉè¼Æ

3.2 ¸ÄÉÆÔ­ÓдúÂëÖÊÁ¿

Äܹ»½«Ô­ÓÐÔã¸â»òÕß»ìÂҵĴúÂ룬Ö𽥸ÄÉÆÎªÉè¼ÆÁ¼ºÃµÄ´úÂ룬Ìá¸ßÆä¿É¶ÁÐÔ£¬¸üÒ×ÓÚÀ©Õ¹

3.3 ¼õÉÙ°ü´óС

Äܹ»È¥³ýÖØ¸´´úÂ룬¼õÉÙ°ü´óС£¬ÌرðÊǶÔÓÚSDKÀ´ËµÒâÒåÖØ´ó£¬¸üÒ×ÓÚµÚÈý·½½ÓÈë

4. ʲôʱºò¸Ã¿ªÊ¼Öع¹

ʲôʱºò¸Ã¿ªÊ¼Öع¹£¿µ±Îŵ½´úÂëµÄ¡°»µÎ¶µÀ¡±£¬±ã¿ÉÒÔ¿ªÊ¼Öع¹¡£¶ø¾ßÌåµÄ¿ªÊ¼Ê±¼ä²¢Ã»ÓÐÍêÈ«µÄ±ê×¼¿ÉÒÔºâÁ¿£¬ÕâÍêȫȡ¾öÓÚÄã×Ô¼º£¬¿ÉÒÔËæÊ±ËæµØ£¬»òÕßÊǽ«À´µÄijһ¸öʱ¼ä¡£Öع¹²»·Ö´óС£¬Ð¡µ½ÐÞ¸ÄÒ»¸öº¯ÊýÃû×Ö£¬Ò²ÊǺܺõÄÒ»¸ö¿ªÊ¼ ¡£

´úÂë¡°»µÎ¶µÀ¡±µÄ³£¼ûÐÎʽ£º

4.1 ÖØ¸´´úÂë

ÖØ¸´´úÂëÊÇ¿ª·¢¹ý³ÌÖÐ×î³£¼û×îÃ÷ÏԵġ°Ðźš±£¬µ±·¢ÏÖ¹¤³ÌÀïÃæÓÐÁ½´¦ÍêȫһÑù»òÕßÏàËÆµÄ´úÂë¾ÍÒª¿¼ÂÇÊÇ·ñÐèÒªÕûºÏ£¬µ±·¢ÏÖÈý´¦¼°ÒÔÉϵÄÖØ¸´´úÂëʱ£¬¾ÍÓ¦¸ÃºÁ²»ÓÌÔ¥µÄ½øÐÐÖØ¹¹¡£

´æÔÚ¶à´¦µÄÖØ¸´´úÂë

4.2 ¸´ÔÓµÄÂß¼­Ç¶Ì×

¸´ÔÓµÄÂß¼­Ç¶Ì×£¬×î³£¼ûιýÓÚif elseÕâ¶ÔÐֵܣ¬Í¨³£¶àÓÚÈý²ãÒÔÉϵÄifǶÌ×£¬¾Í»á¿ªÊ¼Ó°Ïì´úÂëµÄ¿É¶ÁÐÔ£¬ÉõÖÁÈÃÔĶÁÕßÃÔʧÔÚÎÞ¾¡Ç¶Ì׵ĴÔÁÖÀï¡£

¸´ÔÓµÄÂß¼­Ç¶Ì×

4.3 ³¬³¤µÄº¯Êý

³¬³¤µÄº¯ÊýÍùÍùÒâζ×ÅÂß¼­¸´ÔÓ£¬º¯ÊýÔ½³¤£¬´úÂëµÄ¿É¶ÁÐÔºÍÀ©Õ¹ÐÔÔ½²î¡£¶ÔÓÚÕý³£µÄ³ÌÐòÔ±À´Ëµ£¬¿´µ½ÓÖ³ôÓÖ³¤µÄº¯ÊýÒ»°ã¶¼Óеִ¥¸Ð£¬ÔÚÐÄÀíÉÏÊ×ÏȲúÉúĪÃûµÄ¿Ö¾å¡£¶øÐ¡¶øÃÀµÄº¯ÊýÔòÄܹ»Á¢ÂíÈÃÈËÐÄ¿õÉñâù£¬ÉõÖÁ²»ÐèҪעÊÍ£¬Ò²Äܹ»ºÁÎÞÕϰ­µÄ¿ìËÙÀí½âÉè¼ÆÕßµÄÒâͼ¡£

 

4.4 ³¬¼¶Àà

³¬¼¶Ààͨ³£¹¹ÔìÅÓ´ó£¬Âß¼­¸´ÔÓ£¬¼ç¸ºµÄÖ°ÔðÖڶ࣬Ë׳ơ°God Class¡±£¬¶ø²»¹ÜÊÇ´óÐÍ»òÕßÊÇСÐÍÏîÄ¿£¬¶¼»á´æÔÚÀàËÆµÄ³¬¼¶Àà¡£ÕâÖÖ³¬¼¶ÀàÖ±½Óµ¼Öµĺó¹ûÊǿɶÁÐԲñîºÏ¶È¸ß£¬·â×°ÐÔÈõ£¬ÄÑÓÚά»¤£¬ËùÒÔ³¬¼¶ÀàÒ²ÊÇÖØ¹¹µÄÇ¿ÁÒÐźš£

 

4.5 ¹ý³¤µÄ²ÎÊýÁбí

¹ý³¤µÄ²ÎÊýÁбíÖ¸µÄÊǺ¯ÊýÌ嶨ÒåÁ˹ý¶àµÄ²ÎÊý£¬Ê¹µÃÍⲿµ÷Óøú¯Êýʱ£¬±äµÄÄÑÒÔʹÓá£ÒòΪ̫³¤µÄ²ÎÊýÁбí»á±äµÃÄÑÒÔÀí½â£¬Ì«¶àµÄ²ÎÊýÈÝÒ×Ôì³Éǰºó²»Ò»Ö£¬²¢ÇÒ²»Ò×ʹÓá£ÔÚÃæÏò¶ÔÏó±à³ÌÖУ¬¿ÉÒÔʹÓóÉÔ±±äÁ¿ºÍ¶ÔÏóµÄÐÎʽ¼õÉÙ²ÎÊýµÄ´«µÝ£¬Ò²Äܹ»±ÜÃâÓÉÓÚ²ÎÊýµÄ±ä»¯£¬¶øÆµ·±Ð޸ĺ¯ÊýµÄ¶¨Òå¡£

´Ë´¦ÊäÈëͼƬµÄÃèÊö

4.6 ÆäËûµÄ»µÎ¶µÀ

Ç°ÃæÁоÙÁ˼¸ÖֱȽϳ£¼ûµÄ´úÂë¡°»µÎ¶µÀ¡±£¬Êµ¼Ê¿ª·¢Öе±È»»¹»á´æÔÚÆäËûµÄһЩ¡°»µÎ¶µÀ¡±£¬±ÈÈç´úÂë»ìÂÒ£¬Âß¼­²»ÇåÎú£¬Àà¹ØÏµ´í×Û¸´ÔÓ£¬µ±Îŵ½ÕâЩ²»Í¬µÄ¡°»µÎ¶µÀ¡±Ê±£¬¶¼Ó¦¸Ã³¢ÊÔÈ¥ÖØ¹¹¡£

5. ÖØ¹¹µÄ²½Öè

´Ë´¦ÊäÈëͼƬµÄÃèÊö

5.1 Ö÷¶¯Ä£Ê½

Ö÷¶¯Ä£Ê½£¬Í¨¹ýÔĶÁÏîÄ¿´úÂ룬»òÕßÒÀÀµÒ»Ð©×Ô¶¯»¯µÄ´úÂë¼ì²â¹¤¾ß£¬ÍÚ¾òÖØ¹¹Ä¿±ê£»

5.2 ±»¶¯Ä£Ê½

±»¶¯Ä£Ê½£¬ÔÚÏîÄ¿¿ª·¢ÖУ¬ÎªÁËÂú×ãÏÖÓÐÐèÇó£¬Öع¹µ±Ç°Ä£¿é£¬¸ÄÉÆÔ­ÓдúÂëÉè¼Æ£»

5.3 ÕûÌåÆÀ¹À

Ö÷Òª°üÀ¨Õâô¼¸¸ö·½Ã棺

1.Ã÷È·ÖØ¹¹µÄ×îÖÕÄ¿±ê£¬×öµ½¶ÔÖØ¹¹µÄÕû¸ö·½ÏòÐÄÀïÓÐÊý

2.Íê³ÉÕâ¸öÄ¿±êÐèÒª»¨¶àÉÙʱ¼äÒÔ¼°ÈËÁ¦³É±¾

3.ÖØ¹¹Ö®ºó¿ÉÒÔ´øÀ´ÄÄЩÊÕÒæ£¬±ÈÈç¸ÄÉÆ´úÂëÖÊÁ¿£¬¼õÉÙbugÂʵÈ

4.ÖØ¹¹Ö®ºó»á´øÀ´ÄÄЩ·çÏÕ£¬¶ÔÔ­Óй¦ÄÜ»òÕ߯äËûÄ£¿éÊÇ·ñ»áÔì³ÉÓ°Ïì

5.×ۺϿ¼ÂÇʱ¼äÓëÈËÁ¦³É±¾£¬ÆÀ¹À·çÏÕÊÕÒæ±Èºó£¬×ö³ö×îÖյľö²ß

5.4 Áгö·Ö½×¶ÎµÄÄ¿±êºÍÁбí

Áгöµ±Ç°µÄÖØ¹¹Ä¿±ê£¬Öع¹ÁÐ±í£¬·Ö½×¶Î£¬Ð¡²½·¥µÄ½øÐÐÖØ¹¹£¬×îÖÕ´ï³ÉÀíÏëµÄ״̬£»

5.5 ¹¹Ôì²âÊÔ»·¾³

¹¹Ôì²âÊÔ»·¾³£¬±àд²âÊÔÓÃÀýºÍµ¥Ôª²âÊÔ£¬·Ö½×¶ÎµÄ¶ÔÖØ¹¹³É¹û½øÐвâÊÔ£¬È·ÈÏûÓÐÎÊÌâÖ®ºóÔÙ½øÐÐÏÂÒ»½×¶ÎµÄÖØ¹¹£»

5.6 ÍŶÓЭÖú

ÍŶÓЭ×÷£¬×îºÃÊÇÄܹ»½á¶ÔÖØ¹¹£¬½øÐÐcode review£¬ÓÐÆäËû³ÉÔ±»¥Ïà¼à¶½ºÍ°Ñ¿ØÕû¸ö¹ý³ÌºÍ½á¹û£»

6. ÖØ¹¹·½·¨

6.1 ÖØÐÂ×éÖ¯º¯Êý

º¯ÊýÊdzÌÐòÉè¼ÆµÄ»ù±¾µ¥Ôª£¬ËùÒÔÖØ¹¹ºÜ´óÒ»²¿·ÖÊǶԺ¯Êý½øÐÐÕûÀí£¬¸ÄÉÆÕû¸öº¯ÊýµÄ×éÖ¯ÐÎʽ£¬ÌرðÊÇÕë¶ÔÇ°ÃæÌáµ½µÄ³¬³¤º¯Êý¡£

ÏÂÃæ½éÉܼ¸ÖֱȽϳ£¼ûµÄÕë¶Ôº¯ÊýµÄÖØ¹¹·½Ê½:

(1). Ð޸ĺ¯ÊýÃû´Ê

ÈËͨ¹ýÃû×Ö¿ÉÒÔ·Ö±æ±Ë´Ë£¬²»»áÒòΪÕÅÈýÕÒµ½ÀîËÄ¡£Í¬ÑùÒ»¸öºÃµÄº¯ÊýÃû×ÖҲͬµÈÖØÒª£¬Í¨¹ýÃû×Ö±ãÄÜÖªµÀº¯ÊýµÄ»ù±¾ÓÃÒ⣬²»Ðè½èÖú¹ý¶àµÄ×¢ÊÍ£¬ËùÒÔÖØ¹¹ºÜÖØÒªµÄÒ»µã¾ÍÊÇÈ¡Ãû×Ö£º£©

(2). ¼ò»¯²ÎÊý

Ö÷ÒªÓÐÁ½¸ö·½Ã棬һ¸öÊÇÈ¥³ý¶àÓàµÄ²ÎÊý£¬ÓÐЩ²ÎÊý¿ÉÄÜÊÇÀúÊ·ÒÅÁô»òÕßÊÇΪ½«À´Ô¤ÁôµÄ£¬¶ÔÓÚÕâÖÖĿǰÅɲ»ÉÏÓ󡣬¹û¶ÏÏÈÈ¥µô¡£µÚ¶þÖÖÊÇȷʵº¯ÊýÐèÒª£¬µ«Êǵ¼Ö²ÎÊýÁбí¹ý³¤µÄÇé¿ö£¬¿ÉÒÔ¿¼ÂÇÔö¼Ó¶ÔÏó»òÕß³ÉÔ±±äÁ¿µÄ·½Ê½È¥³ý¹ý¶àµÄ²ÎÊý¡£

(3). ÌáÁ¶º¯Êý

½«¸´Ôӵĺ¯Êý£¬µ¥¶ÀÌáÁ¶³öÈô¸É¸öÁ£¶È¸üСµÄº¯Êý£¬²¢¸³ÓèÌåÏÖµ¥Ò»¹¦Äܵĺ¯ÊýÃû×Ö

- (void)handleUrl:(NSURL *)url fromViewController:(UIViewController *)sourceViewController withUserInfo:(NSDictionary *)userInfo
{
NSString *host = [url host];
NSString *path = [url path];
if (![host isEqualToString:@"www.meituan.com"]) {
return;
}
if ([path isEqualToString:@"/chat"]) {
[self launchToChat];
} else if ([path isEqualToString:@"/placard"]) {
[self launchToPlacard];
} else if ([path isEqualToString:@"/help"]) {
[self launchToHelp];
} else if ([path isEqualToString:@"/pan/action"]) {
[self launchToPanAction];
} else if ([path isEqualToString:@"/receipt"]) {
[self launchToReceipt];
} else if ([path isEqualToString:@"/invokeForwardMessageView"]){
[self launchToInvokeForward];
} else if ([path isEqualToString:@"/microapp/calendar/profile"]){
[self launchToProfile];
} else if ([path isEqualToString:@"/rps/api/take"]){
[self launchToRps];
} else if ([path isEqualToString:@"/co/edit"]) {
[self launchToEdit];
} else {
}
}

(4). Ïû³ý¶àÓàµÄÁÙʱ±äÁ¿

ÓÐЩº¯ÊýÖеÄÁÙʱ±äÁ¿£¬Ö»ÊǼòµ¥µÄ»ñÈ¡º¯ÊýµÄ·µ»ØÖµ£¬¿ÉÒÔ¿¼ÂÇÖ±½ÓÈ¥³ý£¬²»½ö½ÚÊ¡´úÂë¿Õ¼ä£¬Ò²ÓÐÀûÓÚÖ®ºóµÄÖØ¹¹¡£µ«ÊÇҪעÒâÓÐÐ©ÌØÊâÇé¿ö¿ÉÄܲ¢²»Êʺϣ¬±ÈÈ纯Êý·µ»ØÖµµÄ»ñÈ¡±È½ÏºÄʱ£¬¶øº¯ÊýGetµÄ´ÎÊý±È½Ï¶à¡£

uint64_t myuid = [UISDKManager sharedManager].myUid;
NSString *ck = [UISDKManager sharedManager].xsid;
NSDictionary *userInfo = @{@"u" : @(myuid), @"ck" : ck};

ÖØ¹¹ºó

NSDictionary *userInfo = @{@"u" : @([UISDKManager sharedManager].myUid), @"ck" : [UISDKManager sharedManager].xsid};

(5). ¼ÓÈë½âÊÍÐÔµÄÁÙʱ±äÁ¿

½«¸´ÔÓ±í´ïʽµÄ½á¹û·Å½øÒ»¸öÁÙʱ±äÁ¿£¬ÒԴ˱í´ïʽµÄÃû³ÆÀ´½âÊͱí´ïʽµÄ×÷Óᣱí´ïʽÓпÉÄܷdz£¸´ÔÓ¶øÄÑÒÔÀí½â£¬ÕâÖÖÇé¿öÏÂÁÙʱ±äÁ¿¿ÉÒÔ°ïÖúÄ㽫±í´ïʽ·Ö½âΪ±È½ÏÈÝÒ×¹ÜÀíµÄÐÎʽ¡£

ÏÂÃæÊÇÒ»¶Î¹ã¸æÏÔʾµÄÂß¼­´úÂ룺

DXAdvertisementModel *adModel = [[DXAdvertisementManager sharedInstance] getNeedShowAdvertisement];
if (adModel && ![DXGuideViewController shouldShow] && [UISDKManager sharedManager].connectStatus == UIConnectStatusLogined && [UISDKManager sharedManager].callSDK.getCallStatus == DXCallStatusIdle) {
// ʵÏÖ´úÂë......
}

ÖØ¹¹ºó

DXAdvertisementModel *showModel = [[DXAdvertisementManager sharedInstance] getNeedShowAdvertisement];
BOOL showADEnabled = ![DXGuideViewController shouldShow];
BOOL isLogined = [UISDKManager sharedManager].connectStatus == UIConnectStatusLogined;
BOOL callIdle = [UISDKManager sharedManager].callSDK.getCallStatus == DXCallStatusIdle;
BOOL meetingIdle = [UISDKManager sharedManager].callMeetingSDK.getCallStatus == DXCallStatusIdle;
if (showADModel && showEnabled && isLogined && callIdle && meetingIdle) {
// ʵÏÖ´úÂë......
}

(6). ½«²éѯºÍÐ޸ķÖÀë

ÔÚ¿ª·¢Öкܳ£¼ûµÄÒ»ÖÖº¯ÊýÊDz»½ö·µ»ØÒ»¸ö¶ÔÏóÖµ£¬ÄÚ²¿ÓÖ´æÔÚ¶Ô״̬µÄÐ޸ġ£ÏÔÈ»Íâ½çÖ»ÊÇÏëGet£¬È·ÓÖ²úÉúÁËһЩSetµÄ¡±¸±×÷Óá±£¬¶ÔÓÚÕâÖÖÇé¿öÎÒÃǵÄ×ö·¨ÊÇ¶ÔÆä½øÐзÖÀë¡£

- (NSString *)loginURLString
{
NSString *deviceId = [MTDXLoginMyInfo instance].deviceId;
if (deviceId == nil) {
[MTDXLoginMyInfo instance].deviceId = [[NSUUID UUID] UUIDString];
deviceId = [MTDXLoginMyInfo instance].deviceId;
}

NSString *urlString = kProdLoginURL;
if (DX_Dev) {
urlString = kDevLoginURL;
}
urlString = [urlString stringByAppendingFormat:@"&redirect_uri=%@&tenant=%@&uuid=%@", kRedirectURI, @"meituan.com",deviceId];
return urlString;
}

ÖØ¹¹ºó

- (NSString *)getDeviceId
{
NSString *deviceId = [MTDXLoginMyInfo instance].deviceId;
if (deviceId == nil) {
[MTDXLoginMyInfo instance].deviceId = [[NSUUID UUID] UUIDString];
deviceId = [MTDXLoginMyInfo instance].deviceId;
}
return deviceId;
}
- (NSString *)loginURLString:(NSString *)deviceId
{
NSString *urlString = kProdLoginURL;
if (DX_Dev) {
urlString = kDevLoginURL;
}
urlString = [urlString stringByAppendingFormat:@"&redirect_uri=%@&tenant=%@&uuid=%@", kRedirectURI, @"meituan.com",deviceId];
return urlString;
}

6.2 ÀàµÄ´¦Àí

(1). °áÒÆº¯Êý

Ç°ÃæÓнéÉܹýº¯ÊýÊdzÌÐò´¦ÀíµÄ»ù±¾µ¥Ôª£¬¶ø¶ÔÓÚ¸÷¸öÀàÖ®¼äº¯ÊýµÄÇ¨ÒÆÒ²ÊÇÖØ¹¹µÄ³£ÓÃÊֶΡ£Ò»¸öÀàÈç¹ûÓÐÌ«¶àµÄÐÐΪ£¬»òÕßÀàÓëÀàÖ®¼äÓÐÌ«¶àµÄñîºÏ£¬Õâ¸öʱºò¾Í¿ÉÒÔ¿¼ÂǽøÐÐÏ໥¼äº¯ÊýµÄ°áÒÆ¡£×îÖÕÄ¿±êÊÇʹÀà±äµÄ¸ü¼Ó¼òµ¥£¬Ëù¼ç¸ºµÄÖ°Ôð¸ü¼ÓÇåÎú¡£¶ÔÓÚÕâ¸öÖØ¹¹·½·¨£¬±È½Ï³£¼ûµÄ¾ÍÊÇ×ÓÀàÓë×ÓÀàÖ®¼ä£¬×ÓÀàÓ븸ÀàÖ®¼äÏ໥º¯ÊýµÄ°áÒÆ¡£

@interface Employee : NSObject
- (void)fire:(NSString *)name;
@end
@interface Manager : Employee
- (void)setName:(NSString *)name;
@end
@interface Sale : Employee
- (void)setName:(NSString *)name;
@end

ÖØ¹¹ºó

@interface Employee : NSObject
- (void)setName:(NSString *)name;
@end

@interface Manager : Employee
- (void)fire:(NSString *)name;
@end

(2). °áÒÆ×Ö¶Î

Ò»¸öÀàµÄij¸ö×ֶΣ¬¿ÉÄܸü¶àµÄ±»ÆäËûµÄÀàʹÓ㬻òÕßÔÚÖØ¹¹Ò»¸öеÄÀàʱ£¬Õâ¸ö×ֶοÉÄܸü¶àµÄ¸øÐµÄÀàʹÓã¬Õâ¸öʱºò¾Í¿ÉÒÔ¿¼ÂÇÊÇ·ñÐèÒª°áÒÆ×Ö¶Î

@interface DXCallManager : NSObject
@property (nonatomic, assign) DXCallType callType;
@end

ÖØ¹¹ºó

@interface DXCallSession : NSObject
// ......
@property (nonatomic, assign) DXCallType callType;
@end

(3). ÀàµÄ²ð½â

ÀàµÄ²ð½â£¬Ö¸µÄÊÇÒ»¸öÀàÌ«¹ý¸´ÔÓ£¬¿ÉÒÔ½«ÆäÒ»²¿·Öº¯ÊýºÍ×Ö¶ÎÌáÁ¶³öÒ»¸öеÄÀ࣬ʹԭÀ´µÄÀྡ¿ÉÄܼòµ¥£¬Âú×ãÀàµÄµ¥Ò»Ö°ÔðµÄÔ­Ôò

@interface Employee : NSObject
- (void)fire:(NSString *)name;
- (void)program;
@end

ÖØ¹¹ºó

@interface Manager : Employee
- (void)fire:(NSString *)name;
@end

@interface Engineer : Employee
- (void)program;
@end

(4). ÀàµÄÕûºÏ

ÀàµÄÕûºÏºÍÀàµÄ²ð½âÓеãÏà·´£¬¼´Á½¸öÀàÖ®¼ä²¢ÎÞÌ«´óÇø±ð£¬´æÔڱȽ϶àµÄÖØ¸´´úÂ룬±ÈÈç×ÓÀàºÍ¸¸ÀಢÎÞÌ«´óÇø±ð£¬¿ÉÖØ¹¹ÎªÍ¬Ò»¸öÀ༴¿É

(5). ÌáÁ¶¸¸Àà

ÌáÁ¶¸¸À࣬Ö÷ÒªÖ¸µÄÊÇÁ½¸öÀàÖ®¼ä´æÔڱȽ϶๲ͬµÄÐÐΪ»òÕßÖØ¸´µÄ´úÂ룬¿ÉÒÔ¿¼ÂÇÌáÁ¶³ÉÒ»¸ö¹²Í¬µÄ¸¸Àà

@interface DXCallVoiceViewModel : NSObject
@property (nonatomic, assign) uint64_t peerUid;
@property (nonatomic, strong) NSString *nickName;
@property (nonatomic, assign) DXCallRoleType role;
@property (nonatomic, assign) DXCallVoiceViewProcess viewProcess;
- (instancetype)initWithPeerUid:(uint64_t)peerUid role:(DXCallRoleType)role;
- (void)answerIncomingCall:(DXCallAction)callAction;
- (void)hangup;
- (void)stopRing;
- (void)setRecordAudioEnabled:(BOOL)enabled result:(void (^)(BOOL))block;
- (BOOL)isAudioRecording;
- (void)setSpeakerEnabled:(BOOL)enabled;
- (BOOL)getPhoneSpeakerState;
- (NSString *)getCurrentSessionID;
@end
@interface DXCallMeetingVoiceViewModel : NSObject
@property (nonatomic, strong) NSMutableArray<DXCallUserItem *> *meetingMembers;
@property (nonatomic, strong) NSMutableArray<DXCallUserItem *> *invitees;
@property (nonatomic, strong) DXCallUserItem *inviter;
@property (nonatomic, assign) DXCallRoleType role;
@property (nonatomic, assign) DXCallVoiceViewProcess viewProcess;
@property (nonatomic, assign) uint64_t gid;
- (instancetype)initWithInvitees:(NSArray<DXCallUserItem *> *)invitees inviter:(DXCallUserItem *)inviter gid:(uint64_t)gid role:(DXCallRoleType)role viewProcess:(DXCallVoiceViewProcess)viewProcess;
- (void)answerIncomingCall:(DXCallAction)callAction;
- (void)hangup;
- (void)callHalfwayInvite:(NSArray<DXCallUserItem *> *)invitees;
- (void)stopRing;
- (void)setRecordAudioEnabled:(BOOL)enabled result:(void (^)(BOOL))block;
- (BOOL)isAudioRecording;
- (void)setSpeakerEnabled:(BOOL)enabled;
- (BOOL)getPhoneSpeakerState;
- (NSString *)getCurrentSessionID;
@end

ÖØ¹¹ºó

@interface DXCallBaseViewModel : NSObject
@property (nonatomic, assign) DXCallRoleType role;
@property (nonatomic, assign) DXCallVoiceViewProcess viewProcess;
- (void)answerIncomingCall:(DXCallAction)callAction;
- (void)hangup;
- (void)stopRing;
- (void)setRecordAudioEnabled:(BOOL)enabled result:(void (^)(BOOL))block;
- (BOOL)isAudioRecording;
- (void)setSpeakerEnabled:(BOOL)enabled;
- (BOOL)getPhoneSpeakerState;
- (NSString *)getCurrentSessionID;
@end

@interface DXCallVoiceViewModel : DXCallBaseViewModel
@property (nonatomic, assign) uint64_t peerUid;
@property (nonatomic, strong) NSString *nickName;
- (instancetype)initWithPeerUid:(uint64_t)peerUid role:(DXCallRoleType)role;
@end
@interface DXCallMeetingVoiceViewModel : DXCallBaseViewModel
@property (nonatomic, strong) NSMutableArray<DXCallUserItem *> *meetingMembers;
@property (nonatomic, strong) NSMutableArray<DXCallUserItem *> *invitees;
@property (nonatomic, strong) DXCallUserItem *inviter;
@property (nonatomic, assign) uint64_t gid;
- (instancetype)initWithInvitees:(NSArray<DXCallUserItem *> *)invitees inviter:(DXCallUserItem *)inviter gid:(uint64_t)gid role:(DXCallRoleType)role viewProcess:(DXCallVoiceViewProcess)viewProcess;
- (void)callHalfwayInvite:(NSArray<DXCallUserItem *> *)invitees;
@end

(6). ÌáÁ¶º¯Êý

Ó뺯ÊýÒ»½ÚÖÐÀàËÆ£¬½«ÀàÖйýÓÚ¸´Ôӵĺ¯Êý½øÐÐÌáÁ¶ÒÔ¼°·â×°£¬µ¥¶ÀÌáÁ¶³öÈô¸É¸öÁ£¶È¸üСµÄº¯Êý

6.3 Ìõ¼þ±í´ïʽµÄ´¦Àí

(1). ·Ö½âÌõ¼þ±í´ïʽ

Ç°ÃæÓнéÉܹý´óÐͺ¯Êýͨ³£»áʹ´úÂëµÄ¿É¶ÁÐÔ´ó·ùϽµ£¬¶ø¸´ÔÓµÄÌõ¼þ±í´ïʽÔò»á±äµÄ¸üÄÑÒÔÔĶÁ£¬Í¨³£Ò²ÊÇ´úÂ븴ÔÓ¶ÈÉÏÉýµÄÔªÐ×Ö®Ò»¡£¸ú·Ö½âº¯ÊýÒ»Ñù£¬·Ö½âÌõ¼þ±í´ïʽҲÊÇ×î³£ÓúÍÓÐÁ¦µÄÊÖ¶Î

if (![SDVersion versionLessThanOrEqualTo:@"10.0.2"] && !TARGET_IPHONE_SIMULATOR && audioAuthorizationStatus == AVAuthorizationStatusAuthorized) {
[[UISDKManager sharedManager].callSDK setCallKitEnabled:YES];
[[UISDKManager sharedManager].callMeetingSDK setCallkitEnabled:YES];
} else {
[[UISDKManager sharedManager].callSDK setCallKitEnabled:NO];
[[UISDKManager sharedManager].callMeetingSDK setCallkitEnabled:NO];
}
¡£

ÖØ¹¹ºó

if ([self shouldOpenCallKit]) {
[[UISDKManager sharedManager].callSDK setCallKitEnabled:YES];
[[UISDKManager sharedManager].callMeetingSDK setCallkitEnabled:YES];
} else {
[[UISDKManager sharedManager].callSDK setCallKitEnabled:NO];
[[UISDKManager sharedManager].callMeetingSDK setCallkitEnabled:NO];
}
- (BOOL)shouldOpenCallKit
{
return ![SDVersion versionLessThanOrEqualTo:@"10.0.2"] && !TARGET_IPHONE_SIMULATOR && audioAuthorizationStatus == AVAuthorizationStatusAuthorized;
}

(2.) ºÏ²¢Öظ´µÄ´úÂëÆ¬¶Î

ÔÚÌõ¼þ±í´ïʽµÄÿ¸ö·ÖÖ§ÉÏ´æÔÚÏàͬµÄÒ»¶Î´úÂ룬Õâʱ¿ÉÒÔ¿¼Âǽ«Õâ¶ÎÖØ¸´µÄ´úÂëÒÆµ½Ìõ¼þ±í´ïʽ֮Í⣬ÕâÑù²»½ö½ÚÊ¡ÁË´úÂë¿Õ¼ä£¬¶øÇÒÄܹ»Çå³þµÄ±í´ïÄÄЩ¶«Î÷ÊDZ仯µÄ£¬ÄÄЩÊDz»±äµÄ

if ([DXAPPConfig isReleaseVersion]) {
NSString *appName = [DXAPPConfig appName];
[[SCRCrashReporter sharedReporter] startWithAppName:appName];
NSString *uid = [[NSUserDefaults standardUserDefaults] valueForKey:@"uid"];
[[SCRCrashReporter sharedReporter] configureCurrentReport:^(SCRCrashReport *report) {
report.uid = uid;
report.uuid = [MTDXLoginMyInfo instance].deviceId;
}];
} else {
NSString *appName = @"xm_ios_test";
[[SCRCrashReporter sharedReporter] startWithAppName:appName];
NSString *uid = [[NSUserDefaults standardUserDefaults] valueForKey:@"uid"];
[[SCRCrashReporter sharedReporter] configureCurrentReport:^(SCRCrashReport *report) {
report.uid = uid;
report.uuid = [MTDXLoginMyInfo instance].deviceId;
}];
}

ÖØ¹¹ºó

NSString *appName;
NSString *uid;
if ([DXAPPConfig isReleaseVersion]) {
appName = [DXAPPConfig appName];
uid = [[NSUserDefaults standardUserDefaults] valueForKey:@"uid"];
} else {
appName = @"xm_ios_test";
uid = [[NSUserDefaults standardUserDefaults] valueForKey:@"uid"];
}
[[SCRCrashReporter sharedReporter] startWithAppName:appName];
[[SCRCrashReporter sharedReporter] configureCurrentReport:^(SCRCrashReport *report) {
report.uid = uid;
report.uuid = [MTDXLoginMyInfo instance].deviceId;
}];

(3). ÒÆ³ýÁÙʱÐԵĿØÖƱê¼Ç±äÁ¿

ÔÚÑ­ÐòÌõ¼þ±í´ïʽÓï¾äÖУ¬³£³£»á³öÏÖÁÙʱÐԵĿØÖƱê¼Ç±äÁ¿£¬ÕâʱÔÚÖØ¹¹µÄʱºò¿ÉÒÔ¿¼ÂÇÒÆ³ýÕâЩÁÙʱÐԵĿØÖƱäÁ¿£¬ÇÉÓÃbreak£¬continue£¬»òÕßreturn´ïµ½ÏàͬµÄÄ¿µÄ£¬Ê¹ÎÒÃǵĴúÂëÂß¼­¸ü¼ÓÇåÎú£¬¿É¶ÁÐÔ¸üÇ¿

- (void)checkSecurity:(NSArray *)peoples
{
BOOL found;
for (int i; i < peoples.count; i++) {
if (!found) {
if ([peoples[i] isEqualToString:@"Don"]) {
sendAlert();
found = YES;
}
if ([peoples[i] isEqualToString:@"John"]) {
sendAlert();
found = YES;
}
}
}
}

ÖØ¹¹ºó

- (void)checkSecurity:(NSArray *)peoples
{
for (int i; i < peoples.count; i++) {
if ([peoples[i] isEqualToString:@"Don"]) {
sendAlert();
break;
}
if ([peoples[i] isEqualToString:@"John"]) {
sendAlert();
break;
}
}
}

(3). ÒÔ¶à̬ȡ´úÌõ¼þ±í´ïʽ

¶à̬ÊÇÃæÏò¶ÔÏó±à³ÌµÄÒ»´óÌØµã£¬¶ÔÓÚÓÐЩÌõ¼þ±í´ïʽ£¬ÆäÖ÷Òª×÷ÓÃÊǸù¾Ý²»Í¬µÄÀàÐͽøÐв»Í¬µÄÐÐΪ¡£Õâʱ»¹¿ÉÒÔÔËÓöàֱ̬½ÓÈ¡´úÕâЩÌõ¼þ±í´ïʽ£¬ÒÔÃæÏò¶ÔÏó˼ÏëÖØÐ·â×°ÆäÌØÕ÷ºÍÐÐΪ£¬Ìá¸ß´úÂëµÄ¿É¶ÁÐÔÒÔ¼°À©Õ¹ÐÔ¡£

- (double)getSalary:(int)type
{
switch (type) {
case MANAGER:
// .....
// һϵÁкܸ´ÔÓµÄÔËËã,»ù±¾¹¤×Ê+½±½ð+³é³É
return basic * bonus * commission;
case SALE:
// .....
return basic * commission;
break;
case ENGINEER:
// ͨ³£±È½Ï¼òµ¥
return basic;
break;
default:
break;
}
}

ÖØ¹¹ºó

- (double)getSalary:(Employee *)employee
{
return [employee getSalary];
}

7.ÖØ¹¹¹¤¾ß

7.1 ´úÂë¼ì²â¹¤¾ß-ѰÕÒÖØ¹¹µÄÄ¿±ê

7.1.1 ´úÂëÖÊÁ¿¹ÜÀí¹¤¾ß

Sonar£¬È«Ãû¡°SonarQube¡±ÊÇÒ»¸ö¿ªÔ´µÄ´úÂëÖÊÁ¿¹ÜÀí·ÖÎö¹¤¾ß£¬¿É¼ì²â³öÏîÄ¿´úÂëµÄ©¶´ºÍDZÔÚµÄÂß¼­ÎÊÌâ¡£ËüµÄ¹¦ÄÜÇ¿´ó£¬¶ÔÍâÌṩÁ˷ḻµÄ²å¼þ£¬¼æÈÝÐÔÇ¿£¬¿ÉÖ§³Ö¶àÖÖÓïÑԵļì²â£¬ ÈçObjective-C¡¢Java¡¢C¡¢C++¡¢PythonµÈ¼¸Ê®ÖÖ±à³ÌÓïÑÔ¡£ËüÖ÷ÒªµÄºËÐļÛÖµÌåÏÖÔÚÈçϼ¸¸ö·½Ã棺

±àÂëÔ¼Êø¼ì²â£ºÍ¨¹ýÒ»¶¨µÄ¼ì²âÂß¼­£¬±¨¸æ´úÂëµ±ÖÐÒì³£ºÍ²»°²È«µÄÐÐΪ£¬Ò²¿ÉÒÔ¼ì²é´úÂëÊÇ·ñ×ñÑ­±à³Ì±ê×¼£¬ÈçÃüÃû¹æ·¶£¬±àдµÄ¹æ·¶µÈ

¼ì²âDZÔÚÉè¼Æ»òÕß´úÂëȱÏÝ£ºÍ¨¹ý²å¼þFindbugs¡¢CheckstyleµÈ¹¤¾ß¼ì²â´úÂë´æÔÚµÄȱÏÝ

¼ì²âÖØ¸´´úÂëÁ¿£º¿ÉÒÔ¼ì²âÏîÄ¿ÖеĴúÂëÖØ¸´Á¿£¬±ÈÈç´æÔڵĴóÁ¿¸´ÖÆÕ³ÌùµÄ´úÂë

¼ì²â´úÂëÖаü¡¢ÀàÖ®¼äµÄ¹ØÏµ£º·ÖÎöÀàÖ®¼äµÄ¹ØÏµÊÇ·ñºÏÀí£¬¸´ÔÓ¶ÈÇé¿ö

¼ì²â´úÂëÖÐ×¢Ê͵ij̶ȣºÔ´Âë×¢Ê͹ý¶à»òÕßÌ«ÉÙ¶¼²»ºÃ£¬Ó°Ïì³ÌÐòµÄ¿É¶ÁÐÔ

7.1.2 ÖØ¸´´úÂë¼ì²â¹¤¾ß

Simian£¬PMD

7.2 ÖØ¹¹¹¤¾ß-Ìá¸ßÖØ¹¹µÄЧÂÊ

7.2.1 Xcode

XcodeÔ­ÉúÌṩÁËÒ»Ð©ÖØ¹¹¹¤¾ß¿É¹©ÎÒÃÇʹÓã¬Ö÷ÒªÓÐÁ½¸öÈë¿Ú£¬Ò»¸öÊDz˵¥À¸--Editor--Refactor--ϼ¶²Ëµ¥£¬»òÕßÊó±êÓÒ¼üÑ¡ÔñRefactor--ϼ¶²Ëµ¥¡£

ÆäÌṩµÄÖØ¹¹¹¤¾ßÓÐÄÇô¼¸Àࣺ

Rename£ºÖØÃüÃû£¬¶ÔÀàÃû»òÕߺ¯ÊýÃûµÈ½øÐÐÖØÃüÃû£¬Ö»ÐèҪѡÔñÒ»¸ö·ûºÅÃû£¬µã»÷Rename±ã»á×Ô¶¯¹ØÁª´¦ÀíÏà¹ØµÄ·ûºÅÐÅÏ¢

Extract Function£ºÌáÁ¶º¯Êý£¬Ñ¡È¡Ä³Ò»¶Î´úÂ룬×Ô¶¯ÌáÁ¶Éú³ÉÒ»¸öеÄC·ç¸ñµÄº¯Êý

Extract Method£ºÌáÁ¶º¯Êý£¬Ñ¡È¡Ä³Ò»¶Î´úÂ룬×Ô¶¯ÌáÁ¶Éú³ÉÒ»¸öеÄObjective-C·ç¸ñµÄº¯Êý

Extract Variable£ºÌáÁ¶²ÎÊý

Extract All Occurrences£º

´Ë´¦ÊäÈëͼƬµÄÃèÊö

7.2.2 Android Studio

×÷Ϊ°²×¿µÄÔ­Éú¿ª·¢¹¤¾ß£¬Android StudioÒ²ÌṩÁ˺ܷḻµÄÖØ¹¹¹¤¾ß£¬¸úXcodeÀàËÆÒ²Ö÷ÒªÓÐÁ½¸öÈë¿Ú£¬Ò»¸öÊDz˵¥À¸--Refactor--ϼ¶²Ëµ¥£¬»òÕßÊó±êÓÒ¼üÑ¡ÔñRefactor--ϼ¶²Ëµ¥

´Ë´¦ÊäÈëͼƬµÄÃèÊö

7.3 ×Ô¶¯»¯²âÊÔ¹¤¾ß-±£Ö¤Öع¹Ö®ºóµÄÖÊÁ¿

ÔËÓÃ×Ô¶¯»¯µÄ²âÊÔ¹¤¾ß£¬±ÈÈç´úÂëÂß¼­£¬UIµÈ×Ô¶¯»¯µÄ²âÊÔ¹¤¾ß£¬ÑéÊÕÖØ¹¹µÄ³É¹û£¬·¢ÏÖÖØ¹¹ÒýÆðµÄbug£¬´Ó¶ø±£Ö¤Öع¹Ö®ºóµÄ´úÂëÖÊÁ¿

×ܽá

ÖØ¹¹ÊÇÔÚ²»Ó°ÏìÔ­ÓÐÐÐΪµÄ»ù´¡Ö®ÉÏ£¬¶ÔÔ­Óй¦ÄÜ»òÕßÄ£¿é½øÐдúÂëµ÷Õû£¬Ôö¼ÓÆä¿É¶ÁÐÔºÍÀ©Õ¹ÐÔ£¬×îÖÕ¸ÄÉÆµ±Ç°µÄ´úÂëÉè¼ÆÒÔ¼°ÖÊÁ¿¡£¶øÖع¹´ÓÀ´¶¼²»ÊÇÒ»õí¶ø¾Í£¬±ØÐë¾­¹ýÈÕ»ýÔÂÀÛ£¬Ç§´¸°ÙÁ¶£¬Ñ­Ðò½¥½øÍê³ÉµÄ¡£¶ø±È½Ï´óÐ͵Äϵͳ»òÕßÄ£¿éµÄÖØ¹¹£¬Í¨³£²»ÊÇÒ»¸öÈËÄܹ»Íê³ÉµÄ£¬±ØÐëÒÀÀµÍŶӵÄÁ¦Á¿¡£

 

   
4211 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì