±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ¼òµ¥£¬±¾Îļòµ¥½éÉÜÁËÔÚ±£³ÖǰÆÚÁ¼ºÃÉè¼ÆºÍ¹æ»®Ö®ÉÏ£¬ÔËÓÃÒÔÉϽéÉܵĻùÓÚº¯Êý£¬À࣬±í´ïʽµÈµÄÖØ¹¹·½·¨£¬Ö𲽸ÄÉÆµ±Ç°ÏµÍ³µÄ´úÂëÖÊÁ¿£¬Î¬³ÖÔÓÐϵͳµÄÁ¼ºÃÉè¼Æ¡£ |
|
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£¬´Ó¶ø±£Ö¤Öع¹Ö®ºóµÄ´úÂëÖÊÁ¿
×ܽá
ÖØ¹¹ÊÇÔÚ²»Ó°ÏìÔÓÐÐÐΪµÄ»ù´¡Ö®ÉÏ£¬¶ÔÔÓй¦ÄÜ»òÕßÄ£¿é½øÐдúÂëµ÷Õû£¬Ôö¼ÓÆä¿É¶ÁÐÔºÍÀ©Õ¹ÐÔ£¬×îÖÕ¸ÄÉÆµ±Ç°µÄ´úÂëÉè¼ÆÒÔ¼°ÖÊÁ¿¡£¶øÖع¹´ÓÀ´¶¼²»ÊÇÒ»õí¶ø¾Í£¬±ØÐë¾¹ýÈÕ»ýÔÂÀÛ£¬Ç§´¸°ÙÁ¶£¬ÑÐò½¥½øÍê³ÉµÄ¡£¶ø±È½Ï´óÐ͵Äϵͳ»òÕßÄ£¿éµÄÖØ¹¹£¬Í¨³£²»ÊÇÒ»¸öÈËÄܹ»Íê³ÉµÄ£¬±ØÐëÒÀÀµÍŶӵÄÁ¦Á¿¡£
|