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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
´úÂëÕû½à vs ´úÂë°¹Ôà
 
×÷Õß±ÊÃû £º ÄàɳשÍß½¬Ä¾½³
  3254  次浏览      27
 2019-10-12
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Ҫͨ¹ý½éÉÜ´úÂëÃüÃû¡¢×¢ÊÍ¡¢º¯ÊýÒÔ¼°²âÊÔÚ¹ÊÍʲôÊÇÕû½à´úÂ룬ʲôÊǰ¹Ôà´úÂ룬ϣÍû±¾ÎĶÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þÌÒ×ӱ༭¡¢ÍƼö¡£

д³öÕû½àµÄ´úÂ룬ÊÇÿ¸ö³ÌÐòÔ±µÄ×·Ç󡣡¶clean code¡·Ö¸³ö£¬ÒªÏëд³öºÃµÄ´úÂ룬Ê×ÏȵÃÖªµÀʲôÊǰ¹Ôà´úÂ롢ʲôÊÇÕû½à´úÂ룻Ȼºóͨ¹ý´óÁ¿µÄ¿ÌÒâÁ·Ï°£¬²ÅÄÜÕæÕýд³öÕû½àµÄ´úÂë¡£

WTF/minÊǺâÁ¿´úÂëÖÊÁ¿µÄΨһ±ê×¼£¬Uncle BobÔÚÊéÖгÆÔã¸âµÄ´úÂëΪÕÓÔó£¨wading£©£¬Õâֻͻ³öÁËÎÒÃÇÊÇÔã¸â´úÂëµÄÊܺ¦Õß¡£¹úÄÚÓÐÒ»¸ö¸üÊʺϵĴʻ㣺ʺɽ£¬ËäÈ»²»ÊǺÜÎÄÑŵ«ÊǸü¼Ó¿Í¹Û£¬³ÌÐòÔ±¼ÈÊÇÊܺ¦ÕßÒ²ÊǼӺ¦Õß¡£

¶ÔÓÚʲôÊÇÕû½àµÄ´úÂ룬ÊéÖиø³öÁË´óʦÃǵÄ×ܽ᣺

Bjarne Stroustrup£ºÓÅÑÅÇÒ¸ßЧ£»Ö±½ØÁ˵±£»¼õÉÙÒÀÀµ£»Ö»×öºÃÒ»¼þÊÂ

Grady booch£º¼òµ¥Ö±½Ó

Dave thomas£º¿É¶Á£¬¿Éά»¤£¬µ¥Ôª²âÊÔ

Ron Jeffries£º²»ÒªÖظ´¡¢µ¥Ò»Ö°Ô𣬱í´ïÁ¦£¨Expressiveness£©

ÆäÖУ¬ÎÒ×îϲ»¶µÄÊDZí´ïÁ¦£¨Expressiveness£©Õâ¸öÃèÊö£¬Õâ¸ö´ÊËÆºõµÀ³öÁ˺ôúÂëµÄÕæÚУºÓüòµ¥Ö±½ÓµÄ·½Ê½Ãè»æ³ö´úÂëµÄ¹¦ÄÜ£¬²»¶àÒ²²»ÉÙ¡£

±¾ÎļǼÔĶÁ¡¶clean code¡·Ö®ºó¸öÈË¡°ÉîÓÐͬ¸Ð¡±»òÕß¡°õ®õ­¹à¶¥¡±µÄһЩ¹Ûµã¡£

Ò»¡¢ÃüÃûµÄÒÕÊõ

̹°×µÄ˵£¬ÃüÃûÊÇÒ»¼þÀ§ÄѵÄÊÂÇ飬ҪÏë³öÒ»¸öÇ¡µ½ºÃ´¦µÄÃüÃûÐèÒªÒ»·¬¹¦·ò£¬ÓÈÆäÎÒÃǵÄĸÓﻹ²»ÊDZà³ÌÓïÑÔËùͨÓõÄÓ¢Óï¡£²»¹ýÕâÒ»Çж¼ÊÇÖµµÃÁË£¬ºÃµÄÃüÃûÈÃÄãµÄ´úÂë¸üÖ±¹Û£¬¸üÓбí´ïÁ¦¡£

ºÃµÄÃüÃûÓ¦¸ÃÓÐÏÂÃæµÄÌØÕ÷£º

1.1 Ãû¸±Æäʵ

ºÃµÄ±äÁ¿Ãû¸æËßÄ㣺ÊÇʲô¶«Î÷£¬ÎªÊ²Ã´´æÔÚ£¬¸ÃÔõôʹÓÃ

Èç¹ûÐèҪͨ¹ý×¢ÊÍÀ´½âÊͱäÁ¿£¬ÄÇô¾ÍÏȵò»ÄÇôÃû¸±ÆäʵÁË¡£

ÏÂÃæÊÇÊéÖеÄÒ»¸öʾÀý´úÂ룬չʾÁËÃüÃû¶Ô´úÂëÖÊÁ¿µÄÌáÉý

# bad code
def getItem(theList):
ret = []
for x in theList:
if x[0] == 4:
ret.append(x)
return ret
# good code
def getFlaggedCell(gameBoard):
'''ɨÀ×ÓÎÏ·£¬flagged£º ·­×ª'''
flaggedCells = []
for cell in gameBoard:
if cell.IsFlagged():
flaggedCells.append(cell)
return flaggedCells

1.2 ±ÜÃâÎóµ¼

²»Òª¹ÒÑòÍ·Âô¹·Èâ

²»Òª¸²¸Ç¹ßÓÃËõÂÔÓï

ÕâÀï²»µÃ²»Í²ÛǰÁ½Ìì²Å¿´µ½µÄÒ»·Ý´úÂ룬¾ÓȻʹÓÃÁË l ×÷Ϊ±äÁ¿Ãû£»¶øÇÒ£¬user¾ÓÈ»ÊÇÒ»¸ölist£¨µ¥¸´Êý¶¼Ã»Ñ§ºÃ£¡£¡£©

1.3 ÓÐÒâÒåµÄÇø·Ö

´úÂëÊÇд¸ø»úÆ÷Ö´ÐУ¬Ò²ÊǸøÈËÔĶÁµÄ£¬ËùÒÔ¸ÅÄîÒ»¶¨ÒªÓÐÇø·Ö¶È¡£

# bad
def copy(a_list, b_list):
pass

# good
def copy(source, destination):
pass

1.4 ʹÓöÁµÄ³öÀ´µÄµ¥´Ê

Èç¹ûÃû³Æ¶Á²»³öÀ´£¬ÄÇôÌÖÂÛµÄʱºò¾Í»áÏñ¸öɵÄñ

1.5 ʹÓ÷½±ãËÑË÷µÄÃüÃû

Ãû×Ö³¤¶ÌÓ¦ÓëÆä×÷ÓÃÓò´óСÏà¶ÔÓ¦

1.6 ±ÜÃâ˼άӳÉä

±ÈÈçÔÚ´úÂëÖÐдһ¸ötemp£¬ÄÇô¶ÁÕ߾͵Ãÿ´Î¿´µ½Õâ¸öµ¥´ÊµÄʱºò·­Òë³ÉÆäÕæÕýµÄÒâÒå

¶þ¡¢×¢ÊÍ

Óбí´ïÁ¦µÄ´úÂëÊÇÎÞÐè×¢Ê͵ģºThe proper use of comments is to compensate for our failure to express ourself in code.

×¢Ê͵ÄÊʵ±×÷ÓÃÔÚÓÚÃÖ²¹ÎÒÃÇÓôúÂë±í´ïÒâͼʱÓöµ½µÄʧ°Ü£¬ÕâÌýÆðÀ´ÈÃÈ˾ÚÉ¥£¬µ«ÊÂʵȷʵÈç´Ë¡£The truth is in the code, ×¢ÊÍÖ»ÊǶþÊÖÐÅÏ¢£¬¶þÕߵIJ»Í¬²½»òÕß²»µÈ¼ÛÊÇ×¢Ê͵Ä×î´óÎÊÌâ¡£

ÊéÖиø³öÁËÒ»¸ö·Ç³£ÐÎÏóµÄÀý×ÓÀ´Õ¹Ê¾£ºÓôúÂëÀ´²ûÊö£¬¶ø·Ç×¢ÊÍ

bad
// check to see if the employee is eligible for full benefit
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))
good
if (employee.isEligibleForFullBenefits())

Òò´Ë£¬µ±ÏëÒªÌí¼Ó×¢Ê͵Äʱºò£¬¿ÉÒÔÏëÏëÊÇ·ñ¿ÉÒÔͨ¹ýÐÞ¸ÄÃüÃû£¬»òÕßÐ޸ĺ¯Êý£¨´úÂ룩µÄ³éÏó²ã¼¶À´Õ¹Ê¾´úÂëµÄÒâͼ¡£

µ±È»£¬Ò²²»ÄÜÒòÒ­·Ïʳ£¬ÊéÖÐÖ¸³öÁËÒÔÏÂһЩÇé¿öÊôÓںõÄ×¢ÊÍ

1.·¨ÎñÐÅÏ¢

2.¶ÔÒâͼµÄ×¢ÊÍ£¬ÎªÊ²Ã´ÒªÕâô×ö

3.¾¯Ê¾

4.TODO×¢ÊÍ

5.·Å´ó¿´ËƲ»ºÏÀíÖ®ÎïµÄÖØÒªÐÔ

ÆäÖиöÈË×îÔÞͬµÄÊǵÚ2µãºÍµÚ5µã£¬×öʲôºÜÈÝÒ×ͨ¹ýÃüÃû±í´ï£¬µ«ÎªÊ²Ã´ÒªÕâô×öÔò²¢²»Ö±¹Û£¬ÌرðÉæ¼°µ½×¨ÒµÖªÊ¶¡¢Ëã·¨µÄʱºò¡£ÁíÍ⣬ÓÐЩµÚÒ»¸Ð¾õ¡°²»ÄÇôÓÅÑÅ¡±µÄ´úÂ룬ҲÐíÓÐÆäÌØÊâÔ¸Ò⣬ÄÇôÕâÑùµÄ´úÂë¾ÍÓ¦¸Ã¼ÓÉÏ×¢ÊÍ£¬ËµÃ÷ΪʲôҪÕâÑù£¬±ÈÈçΪÁËÌáÉý¹Ø¼ü·¾¶µÄÐÔÄÜ£¬¿ÉÄÜ»áÎþÉü²¿·Ö´úÂëµÄ¿É¶ÁÐÔ¡£

×µÄ×¢Ê;ÍÊǹýʱ»òÕß´íÎóµÄ×¢ÊÍ£¬Õâ¶ÔÓÚ´úÂëµÄά»¤Õߣ¨Ò²Ðí¾ÍÊǼ¸¸öÔºóµÄ×Ô¼º£©ÊǾ޴óµÄÉ˺¦£¬¿Éϧ³ýÁËcode review£¬²¢Ã»Óмòµ¥Ò×Ðеķ½·¨À´±£Ö¤´úÂëÓë×¢Ê͵Äͬ²½¡£

Èý¡¢º¯Êý

3.1 º¯ÊýµÄµ¥Ò»Ö°Ôð

Ò»¸öº¯ÊýÓ¦¸ÃÖ»×öÒ»¼þÊ£¬Õâ¼þÊÂÓ¦¸ÃÄÜͨ¹ýº¯ÊýÃû¾ÍÄÜÇåÎúµÄչʾ¡£ÅжϷ½·¨ºÜ¼òµ¥£º¿´¿´º¯ÊýÊÇ·ñ»¹ÄÜÔÙ²ð³öÒ»¸öº¯Êý¡£

º¯ÊýҪô×öʲôdo_sth, Ҫô²éѯʲôquery_sth¡£×î¶ñÐĵľÍÊǺ¯ÊýÃû±íʾֻ»áquery_sth, µ«ÊÂʵÉÏÈ´»ádo_sth, ÕâʹµÃº¯Êý²úÉúÁ˸±×÷ÓᣱÈÈçÊéÖеÄÀý×Ó

public class UserValidator {
private Cryptographer cryptographer;
public boolean checkPassword(String userName, String password) {
User user = UserGateway.findByName(userName);
if (user != User.NULL) {
String codedPhrase = user.getPhraseEncodedByPassword();
String phrase = cryptographer.decrypt(codedPhrase, password);
if ("Valid Password".equals(phrase)) {
Session.initialize();
return true;
}
}
return false;
}
}

3.2 º¯ÊýµÄ³éÏó²ã¼¶

ÿ¸öº¯ÊýÒ»¸ö³éÏó²ã´Î£¬º¯ÊýÖеÄÓï¾ä¶¼ÒªÔÚͬһ¸ö³éÏó²ã¼¶£¬²»Í¬µÄ³éÏó²ã¼¶²»ÄÜ·ÅÔÚÒ»Æð¡£±ÈÈçÎÒÃÇÏë°Ñ´óÏó·Å½ø±ùÏ䣬Ӧ¸ÃÊÇÕâ¸öÑù×ӵģº

def pushElephantIntoRefrige():
openRefrige()
pushElephant()
closeRefrige()

º¯ÊýÀïÃæµÄÈý¾ä´úÂëÔÚͬһ¸ö²ã¼¶£¨¸ß¶È£©ÃèÊöÁËÒªÍê³É°Ñ´óÏó·Å½ø±ùÏäÕâ¼þÊÂ˳ÐòÏà¹ØµÄÈý¸ö²½Öè¡£ÏÔÈ»£¬pushElephantÕâ¸ö²½ÖèÓÖ¿ÉÄܰüº¬ºÜ¶à×Ó²½Ö裬µ«ÊÇÔÚpushElephantIntoRefrigeÕâ¸ö²ã¼¶£¬ÊÇÎÞÐèÖªµÀÌ«¶àϸ½ÚµÄ¡£

µ±ÎÒÃÇÏëͨ¹ýÔĶÁ´úÂëµÄ·½Ê½À´Á˽âÒ»¸öеÄÏîĿʱ£¬Ò»°ã¶¼ÊDzÉÈ¡¹ã¶ÈÓÅÏȵIJßÂÔ£¬×ÔÉ϶øÏµÄÔĶÁ´úÂ룬ÏÈÁ˽âÕûÌå½á¹¹£¬È»ºóÔÙÉîÈë¸ÐÐËȤµÄϸ½Ú¡£Èç¹ûûÓжÔʵÏÖϸ½Ú½øÐÐÁ¼ºÃµÄ³éÏ󣨲¢ÄýÁ·³öÒ»¸öÃû¸±ÆäʵµÄº¯Êý£©£¬ÄÇôÔĶÁÕß¾ÍÈÝÒ×ÃÔʧÔÚϸ½ÚµÄÍôÑóÀï¡£

ijÖ̶ֳȿ´À´£¬Õâ¸ö¸ú½ð×ÖËþÔ­ÀíÒ²ºÜÏñ

ÿһ¸ö²ã¼¶¶¼ÊÇΪÁËÂÛÖ¤ÆäÉÏÒ»²ã¼¶µÄ¹Ûµã£¬Í¬Ê±Ò²ÐèÒªÏÂÒ»²ã¼¶µÄÖ§³Ö£»Í¬Ò»²ã¼¶Ö®¼äµÄ¶à¸öÂÛµãÓÖÐèÒªÒÔijÖÖÂß¼­¹ØÏµÅÅÐò¡£pushElephantIntoRefrige¾ÍÊÇÖÐÐÄÂ۵㣬ÐèÒª¶à¸ö×Ó²½ÖèµÄÖ§³Ö£¬Í¬Ê±ÕâЩ×Ó²½ÖèÖ®¼äÒ²ÓÐÂß¼­ÏȺó˳Ðò¡£

3.3 º¯Êý²ÎÊý

º¯ÊýµÄ²ÎÊýÔ½¶à£¬×éºÏ³öµÄÊäÈëÇé¿ö¾ÍÓú¶à£¬ÐèÒªµÄ²âÊÔÓÃÀýÒ²¾ÍÔ½¶à£¬Ò²¾ÍÔ½ÈÝÒ׳öÎÊÌâ¡£

Êä³ö²ÎÊýÏà±È·µ»ØÖµÄÑÒÔÀí½â£¬ÕâµãÉîÓÐͬ¸Ð£¬Êä³ö²ÎÊýʵÔÚÊǺܲ»Ö±¹Û¡£´Óº¯Êýµ÷ÓÃÕߵĽǶȣ¬Ò»ÑÛ¾ÍÄÜ¿´³ö·µ»ØÖµ£¬¶øºÜÄÑʶ±ðÊä³ö²ÎÊý¡£Êä³ö²ÎÊýͨ³£±ÆÆÈµ÷ÓÃÕßÈ¥¼ì²éº¯ÊýÇ©Ãû£¬Õâ¸öʵÔÚ²»ÓѺá£

Ïòº¯Êý´«ÈëBoolean£¨ÊéÖгÆÖ®Îª Flag Argument£©Í¨³£²»ÊǺÃÖ÷Òâ¡£ÓÈÆäÊÇ´«ÈëTrue or FalseºóµÄÐÐΪ²¢²»ÊÇÒ»¼þÊÂÇéµÄÁ½Ã棬¶øÊÇÁ½¼þ²»Í¬µÄÊÂÇéʱ¡£ÕâºÜÃ÷ÏÔÎ¥±³Á˺¯ÊýµÄµ¥Ò»Ö°ÔðÔ¼Êø£¬½â¾ö°ì·¨ºÜ¼òµ¥£¬ÄǾÍÊÇÓÃÁ½¸öº¯Êý¡£

3.4 Dont repear yourself

ÔÚº¯ÊýÕâ¸ö²ã¼¶£¬ÊÇ×îÈÝÒס¢×îÖ±¹ÛʵÏÖ¸´Óõģ¬ºÜ¶àIDEÒ²ÄѰïÖúÎÒÃǽ²Ò»¶Î´úÂëÖØ¹¹³öÒ»¸öº¯Êý¡£

²»¹ýÔÚʵ¼ùÖУ¬Ò²»á³öÏÖÕâÑùÒ»ÖÖÇé¿ö£ºÒ»¶Î´úÂëÔÚ¶à¸ö·½·¨Öж¼ÓÐʹÓ㬵«ÊÇÓÖ²»ÍêȫһÑù£¬Èç¹û³éÏó³ÉÒ»¸öͨÓú¯Êý£¬ÄÇô¾ÍÐèÒª¼Ó²ÎÊý¡¢¼Óif elseÇø±ð¡£ÕâÑù¾ÍÓеãÞÏÞΣ¬Ã²ËÆ¿ÉÒÔÖØ¹¹£¬µ«ÓÖ²»ÊǺÜÍêÃÀ¡£

Ôì³ÉÉÏÊöÎÊÌâµÄijÖÖÇé¿öÊÇÒòΪ£¬Õâ¶Î´úÂëҲΥ±³Á˵¥Ò»Ö°ÔðÔ­Ôò£¬×öÁ˲»Ö»Ò»¼þÊÂÇ飬Õâ²Åµ¼Ö²»ºÃ¸´Ó㬽â¾ö°ì·¨ÊǽøÐз½·¨µÄϸ·Ö£¬²ÅÄܸüºÃ¸´Óá£Ò²¿ÉÒÔ¿¼ÂÇtemplate methodÀ´´¦Àí²îÒìµÄ²¿·Ö¡£

ËÄ¡¢²âÊÔ

·Ç³£²ÑÀ¢µÄÊÇ£¬ÔÚÎÒ¾­ÀúµÄÏîÄ¿ÖУ¬²âÊÔ£¨ÓÈÆäÊǵ¥Ôª²âÊÔ£©Ò»Ö±¶¼Ã»Óеõ½×ã¹»µÄÖØÊÓ£¬Ò²Ã»ÓÐÊÔÐйýTDD¡£ÕýÒòΪȱʧ£¬²Å¸ü¸ÐÁ¼ºÃ²âÊÔµÄÕä¹ó¡£

ÎÒÃdz£Ëµ£¬ºÃµÄ´úÂëÐèÒªÓпɶÁÐÔ¡¢¿Éά»¤ÐÔ¡¢¿ÉÀ©Õ¹ÐÔ£¬ºÃµÄ´úÂë¡¢¼Ü¹¹ÐèÒª²»Í£µÄÖØ¹¹¡¢µü´ú£¬µ«×Ô¶¯»¯²âÊÔÊDZ£Ö¤ÕâÒ»ÇеĻù´¡£¬Ã»Óи߸²¸ÇÂʵġ¢×Ô¶¯»¯µÄµ¥Ôª²âÊÔ¡¢»Ø¹é²âÊÔ£¬Ë­¶¼²»¸ÒÈ¥Ð޸ĴúÂ룬ֻÄÜÈÎÆä¸¯Àá£

¼´Ê¹Õë¶ÔºËÐÄÄ£¿éдÁ˵¥Ôª²âÊÔ£¬Ò»°ãÒ²ºÜËæÒ⣬ÈÏΪÕâÖ»ÊDzâÊÔ´úÂ룬Åä²»ÉÏÉú²ú´úÂëµÄµØÎ»£¬ÒÔΪֻҪÄÜÅÜͨ¾ÍÐÐÁË¡£Õâ¾Íµ¼Ö²âÊÔ´úÂëµÄ¿É¶ÁÐÔ¡¢¿Éά»¤ÐԷdz£²î£¬È»ºóµ¼Ö²âÊÔ´úÂëºÜÄѸúËæÉú²ú´úÂëÒ»Æð¸üС¢ÑÝ»¯£¬×îºóµ¼Ö²âÊÔ´úÂëʧЧ¡£ËùÒÔ˵£¬Ôà²âÊÔ - µÈͬÓÚ - û²âÊÔ¡£

Òò´Ë£¬²âÊÔ´úÂëµÄÈýÒªËØ£º¿É¶ÁÐÔ£¬¿É¶ÁÐÔ£¬¿É¶ÁÐÔ¡£

¶ÔÓÚ²âÊÔµÄÔ­Ôò¡¢×¼ÔòÈçÏ£º

1.You are not allowed to write any production code unless it is to make a failing unit test pass. ûÓвâÊÔ֮ǰ²»ÒªÐ´Èκι¦ÄÜ´úÂë

2.You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. Ö»±àдǡºÃÄܹ»ÌåÏÖÒ»¸öʧ°ÜÇé¿öµÄ²âÊÔ´úÂë

3.You are not allowed to write any more production code than is sufficient to pass the one failing unit test. Ö»±àдǡºÃÄÜͨ¹ý²âÊԵŦÄÜ´úÂë

²âÊÔµÄFIRST×¼Ôò£º

1.¿ìËÙ£¨Fast£©²âÊÔÓ¦¸Ã¹»¿ì£¬¾¡Á¿×Ô¶¯»¯¡£

2.¶ÀÁ¢£¨Independent£© ²âÊÔÓ¦¸ÃÓ¦¸Ã¶ÀÁ¢¡£²»ÒªÏ໥ÒÀÀµ

3.¿ÉÖØ¸´£¨Repeatable£© ²âÊÔÓ¦¸ÃÔÚÈκλ·¾³É϶¼ÄÜÖØ¸´Í¨¹ý¡£

4.×ÔÎÒÑéÖ¤£¨Self-Validating£© ²âÊÔÓ¦¸ÃÓÐboolÊä³ö¡£²»ÒªÍ¨¹ý²é¿´ÈÕÖ¾ÕâÖÖµÍЧÂÊ·½Ê½À´ÅжϲâÊÔÊÇ·ñͨ¹ý

5.¼°Ê±£¨Timely£© ²âÊÔÓ¦¸Ã¼°Ê±±àд£¬ÔÚÆä¶ÔÓ¦µÄÉú²ú´úÂë֮ǰ±àд

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

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

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

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