<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無(wú)為

    無(wú)為則可為,無(wú)為則至深!

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

    有許多標(biāo)準(zhǔn)和實(shí)踐準(zhǔn)則可適用于Java開(kāi)發(fā)者,但此處要說(shuō)的,是每個(gè)Java開(kāi)發(fā)者需堅(jiān)守的基本原則。

       
    一、為代碼加注釋。雖然每個(gè)人都知道這點(diǎn),但有時(shí)卻不自覺(jué)忘了履行,今天你“忘了”加注釋了嗎?雖然注釋對(duì)程序的功能沒(méi)什么“貢獻(xiàn)”,但過(guò)一段時(shí)間,比如說(shuō)兩星期之后或者更長(zhǎng),回過(guò)頭來(lái)看看自己的代碼,說(shuō)不定已經(jīng)記不住它是干什么的了。如果這些代碼是你個(gè)人的,那還算是走運(yùn)了,不幸的是,當(dāng)然了,大多數(shù)時(shí)候都是別人的不幸,很多時(shí)候大家都是在為公司寫(xiě)代碼,寫(xiě)代碼的人也許早已經(jīng)離開(kāi)了公司,但別忘了一句古話,有來(lái)有往嘛,為他人,也為我們自己,請(qǐng)為你的代碼加上注釋。

       二、不要讓事情復(fù)雜化。程序員有時(shí)候總是對(duì)簡(jiǎn)單問(wèn)題想出復(fù)雜的解決方案,比如說(shuō),在只有五個(gè)用戶的程序中引入EJB、對(duì)程序?qū)崿F(xiàn)了并不需要的框架(framework),之類(lèi)的還有屬性文件、面向?qū)ο蠼鉀Q方案、多線程等等。為什么要這樣做呢?也許我們并不知道是否這樣會(huì)更好,但這樣做也許可以學(xué)到一些新東西,或者讓自己更感興趣一些。如果是不知道為什么這樣做,建議多請(qǐng)教經(jīng)驗(yàn)豐富的程序員,如果是為了個(gè)人的目的,麻煩讓自己更專業(yè)一點(diǎn)。

       
    三、始終牢記——“少即是好(Less is more)并不總是對(duì)的”。代碼效率雖然很重要,但在許多解決方案中,編寫(xiě)更少的代碼并不能改善這些代碼的效率,請(qǐng)看下面這個(gè)簡(jiǎn)單的例子:

    if(newStatusCode.equals("SD") && (sellOffDate == null || todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null && todayDate.compareTo(lastUsedDate)>0)) || (newStatusCode.equals("OBS") && (OBSDate == null || todayDate.compareTo(OBSDate)<0))){ newStatusCode = "NYP"; }

    能看明白if條件語(yǔ)句是干什么的嗎?能想出來(lái)是誰(shuí)寫(xiě)的這段代碼嗎?如果把它分成兩段獨(dú)立的if語(yǔ)句,是不是更容易理解呢,下面是修改后的代碼:

    if(newStatusCode.equals("SD") && (sellOffDate == null || todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null && todayDate.compareTo(lastUsedDate)>0))){ newStatusCode = "NYP"; }else if(newStatusCode.equals("OBS") && (OBSDate == null || todayDate.compareTo(OBSDate)<0)) { newStatusCode = "NYP"; }

    是不是讀起來(lái)容易多了呢,在此只是多加了一個(gè)if和兩個(gè)花括號(hào),但代碼的可讀性與可理解性就一下子提高了一大截。

       四、請(qǐng)不要硬編碼。開(kāi)發(fā)者經(jīng)常有意“忘記”或忽略掉這點(diǎn),因?yàn)橛行r(shí)候開(kāi)發(fā)日程逼得實(shí)在太緊。其實(shí),多寫(xiě)一行定義靜態(tài)變量的代碼能花多少時(shí)間呢?

    public class A { public static final String S_CONSTANT_ABC = "ABC"; public boolean methodA(String sParam1){ if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){ return true; } return false; } }

    現(xiàn)在,每次需要將“ABC”與其他變量進(jìn)行比較時(shí),不必記住實(shí)際代碼,直接引用A.S_CONSTANT_ABC就行了,而且在今后需要進(jìn)行修改時(shí),也可在一處修改,不會(huì)翻遍整個(gè)源代碼逐個(gè)修改了。

     五、不要“創(chuàng)造”自己的框架(framework)。確切來(lái)說(shuō),有數(shù)以千計(jì)的各種框架存在,而且大多數(shù)是開(kāi)源的,這些框架都是優(yōu)秀的解決方案,可用于日常程序開(kāi)發(fā)中,我們只需使用這些框架的最新版本就行了,至少表面上要跟上形勢(shì)吧。被大家廣為接受的最為明顯的一個(gè)例子就是Struts了,這個(gè)開(kāi)源web框架非常適合用在基于web的應(yīng)用程序中。是不是想開(kāi)發(fā)出自己的Struts呢,還是省點(diǎn)力氣吧,回頭看看第二條——不要讓事情復(fù)雜化。另外,如果正在開(kāi)發(fā)的程序只有3個(gè)窗口,就不要使用Struts了,對(duì)這種程序來(lái)說(shuō),不需要那么多的“控制”。

       六、不要使用println及字符串連接。通常為了調(diào)試方便,開(kāi)發(fā)者喜歡在可能的所有地方都加上System.out.println,也許還會(huì)提醒自己回過(guò)頭來(lái)再來(lái)刪除,但有些時(shí)候,經(jīng)常會(huì)忘了刪除或者不愿意刪除它們。既然使用System.out.println是為了測(cè)試,那么測(cè)試完之后,為什么還要留著它們呢,因?yàn)樵趧h除時(shí),很可能會(huì)刪除掉真正有用的代碼,所以不能低估System.out.println危害啊,請(qǐng)看下面的代碼:

    public class BadCode { public static void calculationWithPrint(){ double someValue = 0D; for (int i = 0; i < 10000; i++) { System.out.println(someValue = someValue + i); } } public static void calculationWithOutPrint(){ double someValue = 0D; for (int i = 0; i < 10000; i++) { someValue = someValue + i; } } public static void main(String [] n) { BadCode.calculationWithPrint(); BadCode.calculationWithOutPrint(); } }

    從測(cè)試中可以發(fā)現(xiàn),方法calculationWithOutPrint()執(zhí)行用了0.001204秒,作為對(duì)比,方法calculationWithPrint()執(zhí)行可是用了10.52秒。

    要避免浪費(fèi)CPU時(shí)間,最好的方法是引入像如下的包裝方法:

    public class BadCode { public static final int DEBUG_MODE = 1; public static final int PRODUCTION_MODE = 2; public static void calculationWithPrint(int logMode){ double someValue = 0D; for (int i = 0; i < 10000; i++) { someValue = someValue + i; myPrintMethod(logMode, someValue); } } public static void myPrintMethod(int logMode, double value) { if (logMode > BadCode.DEBUG_MODE) { return; } System.out.println(value); } public static void main(String [] n) { BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE); } }

    另外,字符串連接也是浪費(fèi)CPU時(shí)間的一個(gè)大頭,請(qǐng)看下面的示例代碼:

    public static void concatenateStrings(String startingString) { for (int i = 0; i < 20; i++) { startingString = startingString + startingString; } } public static void concatenateStringsUsingStringBuffer(String startingString) { StringBuffer sb = new StringBuffer(); sb.append(startingString); for (int i = 0; i < 20; i++) { sb.append(sb.toString()); } }

    在測(cè)試中可發(fā)現(xiàn),使用StringBuffer的方法只用了0.01秒執(zhí)行完畢,而使用連接的方法則用了0.08秒,選擇顯而易見(jiàn)了。

    七、多關(guān)注GUI(用戶界面)。再三強(qiáng)調(diào),GUI對(duì)商業(yè)客戶來(lái)說(shuō),與程序的功能及效率同等重要,GUI是一個(gè)成功程序的最基本部分,而很多IT經(jīng)理往往都沒(méi)注意到GUI的重要性。在現(xiàn)實(shí)生活中,許多公司可能為了節(jié)省開(kāi)支,沒(méi)有雇用那些有著設(shè)計(jì)“用戶友好”界面豐富經(jīng)驗(yàn)的網(wǎng)頁(yè)設(shè)計(jì)者,此時(shí)Java開(kāi)發(fā)者只能依賴他們自身的HTML基本功及在此領(lǐng)域有限的知識(shí),結(jié)果,很多開(kāi)發(fā)出來(lái)的程序都是“計(jì)算機(jī)友好”甚于“用戶友好”。很少有開(kāi)發(fā)者同時(shí)精通軟件開(kāi)發(fā)及GUI設(shè)計(jì),如果你在公司“不幸”被分配負(fù)責(zé)程序界面,就應(yīng)該遵守下面三條原則:

    1、 不要再發(fā)明一次輪子,即不做無(wú)用功。現(xiàn)有的程序可能會(huì)有類(lèi)似的界面需求。
    2、 先創(chuàng)建一個(gè)原型。這是非常重要一步,用戶一般想看到他們將使用的東西,而且可以先利用這個(gè)原型征求用戶的意見(jiàn),再慢慢修改成用戶想要的樣子。
    3、 學(xué)會(huì)換位思考。換句話來(lái)說(shuō),就是從用戶的角度來(lái)審查程序的需求。舉例來(lái)講,一個(gè)匯總的窗口可以跨頁(yè)或者不跨頁(yè),作為一個(gè)軟件開(kāi)發(fā)者,可能會(huì)傾向于不跨頁(yè),因?yàn)檫@樣簡(jiǎn)單一些。但是,從用戶的角度來(lái)看,可能不希望看到上百行數(shù)據(jù)都擠在同一頁(yè)上。

       八、文檔需求不放松。每個(gè)商業(yè)需求都必須記錄在案,這可能聽(tīng)上去像童話,似乎在現(xiàn)實(shí)生活中很難實(shí)現(xiàn)。而我們要做的是,不管開(kāi)發(fā)時(shí)間多緊迫,不管最終期限多臨近,對(duì)每個(gè)商業(yè)需求都必須記錄在案。

       九、單元測(cè)試、單元測(cè)試、單元測(cè)試。關(guān)于什么是單元測(cè)試的最好方法,在此不便細(xì)說(shuō),只是強(qiáng)調(diào),單元測(cè)試一定要完成,這也是編程中最基本的原則。當(dāng)然了,如果有人幫你做單元測(cè)試自然是最好,如果沒(méi)有,就自己來(lái)做吧,當(dāng)創(chuàng)建一個(gè)單元測(cè)試計(jì)劃時(shí),請(qǐng)遵守以下三條最基本的原則:

    1、 先于編寫(xiě)類(lèi)代碼之前編寫(xiě)單元測(cè)試。
    2、 記錄單元測(cè)試中的代碼注釋。
    3、 測(cè)試所有執(zhí)行關(guān)鍵功能的公有方法,這里不是指set和get方法,除非它們是以自己獨(dú)特方式執(zhí)行set和get方法。

       十、質(zhì)量,而不是數(shù)量。有些時(shí)候因?yàn)楫a(chǎn)品問(wèn)題、期限緊迫、或一些預(yù)料之外的事情,導(dǎo)致常常不能按時(shí)下班,但一般而言,公司不會(huì)因?yàn)楣蛦T經(jīng)常加班而對(duì)之表?yè)P(yáng)和獎(jiǎng)勵(lì),公司只看重高質(zhì)量的工作。如果遵守了前九條原則,你會(huì)發(fā)現(xiàn)自己寫(xiě)出的代碼bug少且可維護(hù)性高,無(wú)形中質(zhì)量提高了一大步。



    凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
    、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。

    posted on 2009-09-29 19:52 草兒 閱讀(1202) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): JAVA WEB應(yīng)用關(guān)注OSGi

    Feedback

    # re: Java開(kāi)發(fā)者需堅(jiān)守的十大基本準(zhǔn)則 2009-11-01 21:16 井上之蛙
    ↑  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 久久久久久久99精品免费| 青青草97国产精品免费观看| 国产成人无码区免费网站| 国产成人亚洲精品影院| kk4kk免费视频毛片| 亚洲人成人网站在线观看| 新最免费影视大全在线播放| 国产一区视频在线免费观看| 在线视频亚洲一区| 免费A级毛片无码久久版| 日韩大片在线永久免费观看网站| 四虎影在线永久免费观看| 免费看内射乌克兰女| 亚洲综合图色40p| 久久成人免费电影| 亚洲视频一区网站| 九九九精品成人免费视频| 亚洲男人的天堂网站| 国产精品va无码免费麻豆| 乱淫片免费影院观看| 最新亚洲成av人免费看| 日本免费污片中国特一级| 亚洲视频在线观看网址| 女人张开腿等男人桶免费视频 | 在线观看免费大黄网站| 激情小说亚洲图片| 亚洲中文字幕久久精品无码APP | 99在线视频免费| 国产精品亚洲精品青青青| 伊在人亚洲香蕉精品区麻豆| 亚洲国产免费综合| 激情内射亚洲一区二区三区| 高清国语自产拍免费视频国产| 免费大片黄在线观看| 亚洲国产AV无码专区亚洲AV| 成人无码区免费A片视频WWW | 99在线免费视频| jlzzjlzz亚洲jzjzjz| 国产又大又粗又硬又长免费| 日韩精品无码免费专区网站| 亚洲w码欧洲s码免费|