日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

改善程序代码质量的一些技巧

發(fā)布時(shí)間:2025/6/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 改善程序代码质量的一些技巧 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有很多理由都能說(shuō)明為什么我們應(yīng)該寫出清晰、可讀性好的程序。最重要的一點(diǎn),程序你只寫一次,但以后會(huì)無(wú)數(shù)次的閱讀。當(dāng)你第二天回頭來(lái)看你的代碼 時(shí),你就要開(kāi)始閱讀它了。當(dāng)你把代碼拿給其他人看時(shí),他必須閱讀你的代碼。因此,在編寫時(shí)多花一點(diǎn)時(shí)間,你會(huì)在閱讀它時(shí)節(jié)省大量的時(shí)間。

讓我們看一些基本的編程技巧:

不要將參數(shù)作為變量使用

Java代碼??
  • int?Sample(?int?inputVal?)?{??
  • inputVal?=?inputVal?*?CurrentMultiplier(?inputVal?);??
  • inputVal?=?inputVal?+?CurrentAdder(?inputVal?);??
  • ...??
  • return?inputVal;?<--?1??
  • }??
  • 在這個(gè)例子中,我們可以看到,inputVal是一個(gè)參數(shù),我們通過(guò)這個(gè)輸入?yún)?shù)計(jì)算出需要返回的結(jié)果。但是方法中又將inputVal作為一個(gè)變量使用,對(duì)inputVal的值進(jìn)行了修改。這樣做會(huì)有什么害處呢?假設(shè)我們經(jīng)過(guò)一段時(shí)間后需要對(duì)方法的代碼進(jìn)行修改,我們需要利用inputVal的值去做其他的一些計(jì)算工作。根據(jù)參數(shù)的定義,我們很可能直接就使用inputVal的值,但是事實(shí)上這個(gè)inputVal已經(jīng)作為變量使用,它的值已經(jīng)不是當(dāng)初傳遞給這個(gè)方法的值了,這樣就會(huì)導(dǎo)致錯(cuò)誤。我們可以這樣解決這個(gè)問(wèn)題:

    Java代碼??
  • int?Sample(?int?inputVal?)?{??
  • int?workingVal?=?inputVal;??
  • workingVal?=?workingVal?*?CurrentMultiplier(?workingVal?);??
  • workingVal?=?workingVal?+?CurrentAdder(?workingVal?);??
  • ...??
  • return?workingVal;<--?1??
  • }??
  • ?

    好的代碼里只要一個(gè)return語(yǔ)句

    別再這樣寫了:?

    Java代碼??
  • public?function?foo()?{??
  • ????if?(true)?{??
  • ????????return?true;??
  • ????}?else?{??
  • ????????return?false;??
  • ????}??
  • }??
  • 每次當(dāng)我深入某個(gè)開(kāi)源項(xiàng)目,看到大概是某個(gè)專家寫的、并被有經(jīng)驗(yàn)的專業(yè)人士審查過(guò)的這樣的代碼,我都會(huì)驚訝不已,竟然沒(méi)有人去阻止這個(gè)開(kāi)發(fā)者在這個(gè)方法里胡亂的放置返回語(yǔ)句。
    請(qǐng)告訴我,把代碼寫成下面的樣子很難嗎?

    Java代碼??
  • public?function?foo()?{??
  • ????$flag?=?true;??
  • ????if?(true)?{??
  • ????????$flag?=?true;??
  • ????}?else?{??
  • ????????$flag?=?false;??
  • ????}??
  • ????return?$flag;??
  • }??
  • 盡量保持方法簡(jiǎn)短?
    ??? 盡管很多人都遵循這個(gè)規(guī)則,但它仍然非常的重要。你寫的方法要始終能在一個(gè)屏幕里放得下。如果你需要去滾動(dòng)屏幕,這會(huì)分散你的注意力,而且你看不到 整個(gè)的上下文。最佳長(zhǎng)度是5-20行,這根據(jù)你的情況而定。當(dāng)然,getters/setters 通常是一行代碼的方法,但與其說(shuō)它們是真正的方法,不如說(shuō)它們只是存取工具。
    ??? 永遠(yuǎn)永遠(yuǎn)不要把同一個(gè)變量用于多個(gè)不同的目的
    ??? 一個(gè)變量應(yīng)該始終只為一個(gè)目的服務(wù)。通過(guò)使變量常量化(C++里的const,?Java里的final),使得編譯器能夠優(yōu)化編譯,而且使你的代碼醒目表達(dá)這個(gè)變量是不能改變的,你的程序的可讀性會(huì)變得更好。
    使用自描述的變量名和方法名?
    ??? 你的代碼應(yīng)該,對(duì)于任何人來(lái)說(shuō),只要看一眼就能知道是干嘛的。盡量不要用簡(jiǎn)寫方式,除非有特殊的習(xí)慣,就像下面的:

    Java代碼??
  • src?-?source??
  • pos?-?position??
  • prev?-?previous??
  • ???? 如果你認(rèn)為描述性的名稱并不是那么有價(jià)值,請(qǐng)對(duì)比一下n, ns, nsisd 和 numTeamMembers, seatCount, numSeatsInStadium。
    盡可能的把變量定義在靠近使用它的地方?
    ??? 蓋房子時(shí),你可不希望把錘子放到別人的院子里。你希望把它們放的離手頭越近越好。定義變量也是同樣的道理?。

    Java代碼??
  • int?foo?=?3;??
  • int?bar?=?5;??
  • //?一大段使用"bar"的代碼,??
  • //?但沒(méi)用到"foo"??
  • //?...?????
  • baz(foo);??
  • ?這段代碼可以簡(jiǎn)單的重構(gòu)成

    Java代碼??
  • int?bar?=?5;??
  • //?一大段使用"bar"的代碼,??
  • //?但沒(méi)用到"foo"??
  • //?...?????????
  • int?foo?=?3;??
  • baz(foo);??
  • ?? 當(dāng)你把變量的聲明和第一次用到它的地方間隔太遠(yuǎn)時(shí)(距離超過(guò)一個(gè)屏幕),這確實(shí)會(huì)成為一個(gè)問(wèn)題。記住上下文關(guān)系會(huì)變得困難,你需要滾動(dòng)屏幕去找哪來(lái)的這個(gè)變量。

    ?

    讓代碼更少?
    如果你發(fā)現(xiàn)寫了大量的代碼來(lái)解決一個(gè)簡(jiǎn)單的問(wèn)題,你很可能做錯(cuò)了。下面的boolean用法是一個(gè)很好的例子:

    Java代碼??
  • if?(numMines?>?0)?{?enabled=true;?}?else?{?enabled=false;?}??
  • 這時(shí)你應(yīng)該寫成這樣:

    Java代碼??
  • enabled?=?numMines?>?0;??
  • 代碼越少越好。這會(huì)使bug更少,重構(gòu)可能性更小,出錯(cuò)的幾率更小。要適度。可讀性同等重要,你可不能這樣做而使代碼喪失可讀性。?

    ?

    我個(gè)人的 PHP 編程經(jīng)驗(yàn)中,遞歸調(diào)用常常與靜態(tài)變量使用。靜態(tài)變量的含義可以參考 PHP 手冊(cè)。希望下面的代碼,會(huì)更有利于對(duì)遞歸以及靜態(tài)變量的理解

    Java代碼??
  • header("Content-type:?text/plain");??
  • function?static_function?()?{??
  • ????static?$i?=?0;??
  • ????if?($i++?<?10)?{??
  • ????????echo?$i?.?"\n";??
  • ????????static_function();??
  • ????}??
  • }??
  • static_function();這段代碼會(huì)如數(shù)輸出 1 到 10 的數(shù)字。在 static_function 函數(shù)第二次運(yùn)行時(shí),變量 i 由于是靜態(tài)變量,所以仍被保留不被釋放,進(jìn)而可以得到自增的值。

    ?

    這個(gè)問(wèn)題不單單出現(xiàn)在PHP中,你可以在其他語(yǔ)言的代碼中經(jīng)常看到:?
    差:for($i=0;$i<count($array);$i++){...}?
    好:$count=count($array);for($i=0;$i<$count;$i++){...}?
    這因該很好解釋,但許多人就是想少寫一行代碼而浪費(fèi)了系統(tǒng)資源。如果在循環(huán)聲明中使用了count函數(shù),那每次循環(huán)都會(huì)調(diào)用一次。如果你的循環(huán)次數(shù)很多,那就會(huì)浪費(fèi)非常多的時(shí)間。


    拒絕神秘?cái)?shù)字

    Java代碼??
  • defined?("GREAT_THAN_MAX",1);??
  • defined("NORMAL",0);??
  • defined("LESS_THAN_MIN",-1);??
  • ??
  • switch($type){??
  • ????case?GREAT_THAN_MAX:??
  • ????????...??
  • ????????break;??
  • ????case?NORMAL:??
  • ????????...??
  • ????????break;??
  • ????case?LESS_THAN_MIN:??
  • ????????...??
  • ????????break;??
  • ????default:??
  • ????????doSomething();??
  • ????????break;??
  • }??
  • ?

    友好的對(duì)待你的語(yǔ)言

    學(xué)習(xí)新語(yǔ)言是一種很有樂(lè)趣的事情,你能學(xué)到一種新的完成任務(wù)的途徑。當(dāng)一個(gè)對(duì)一種語(yǔ)言已經(jīng)很專業(yè)的人去學(xué)習(xí)另一種語(yǔ)言時(shí),會(huì)出現(xiàn)一種很大的負(fù)面效應(yīng)。比如說(shuō)你是一個(gè)Java開(kāi)發(fā)者,試圖去學(xué)習(xí)Ruby。你應(yīng)該學(xué)會(huì)用Ruby的方式解決問(wèn)題,而不是沿用Java的解決問(wèn)題的思想。
    當(dāng)你需要重復(fù)5遍"Hello world!"時(shí),在Java里,你可能會(huì)這樣做:
    for (int i = 0; i < 5; i++) {
    ??? System.out.println("Hello world!");
    }
    在Ruby里,你也許會(huì)禁不住這樣寫:
    for i in (0..5)
    ? puts "Hello world!"
    end
    這樣看起來(lái)沒(méi)問(wèn)題,但有一個(gè)更好的方式:
    5.times { puts "Hello world!" }

    不要逆常規(guī)而行?
    每種語(yǔ)言都有自己不同的習(xí)俗約定。一般來(lái)說(shuō),人們聽(tīng)的最多的是Java的編碼規(guī)范。讓我們看看其中的一些習(xí)俗規(guī)范:
    方法名應(yīng)該小寫字母開(kāi)頭,其后用字母大寫的單詞連接(veryLongVariableName)
    類名應(yīng)該都使用首字母大寫的單詞連接而成
    常量名應(yīng)該全部大寫,用下劃線連接(MY_CONSTANT)
    左大括號(hào)應(yīng)該跟 if 語(yǔ)句在同一行

    只有在有必要的理由時(shí)才去打破這些常規(guī),不要輕易的因?yàn)槟悴桓吲d就違反它。如果你只是在團(tuán)隊(duì)里改變一些這樣的習(xí)慣,那也沒(méi)問(wèn)題,但當(dāng)把你代碼拿出來(lái)和其他的沒(méi)有這些思想準(zhǔn)備的程序員共享時(shí),問(wèn)題就會(huì)來(lái)了。
    警惕過(guò)早優(yōu)化?
    過(guò)早優(yōu)化是所有問(wèn)題的根源,至少電視上是這么說(shuō)的 … 你第一應(yīng)該關(guān)心的事情是寫出易于理解的代碼。起初寫的程序不要求快。除非你的程序很慢,否則談優(yōu)化都是為時(shí)太早。如果你想優(yōu)化什么東西,你首先需要知道問(wèn)題出在哪。這就是我們需要profilers這個(gè)工具的原因。
    在沒(méi)有知道問(wèn)題在哪的情況下試圖對(duì)程序進(jìn)行優(yōu)化,其結(jié)果必然是把程序能壞,至少你的代碼會(huì)喪失可讀性。如果你覺(jué)得有些地方很慢,不要盲目的重寫代碼,你應(yīng)先找到慢的證據(jù)。不要傻乎乎的去解決根本不存在的問(wèn)題。
    積極重構(gòu)測(cè)試過(guò)的程序?
    沒(méi)有任何東西會(huì)是完美的。即使你感覺(jué)你真正寫出了一段完美的代碼,幾個(gè)月后回頭再看看,你可能會(huì)驚訝道"怎么會(huì)這樣傻?"
    改進(jìn)程序的一個(gè)好方法就是重構(gòu),但要等程序測(cè)試通過(guò)之后。你首先要確保程序是好的可運(yùn)行的,你可以通過(guò)自動(dòng)化測(cè)試或手工測(cè)試完成這個(gè)工作。
    之初,你需要的是程序可用。不要期望在第一次就寫出完美的程序,你只需要把它寫出來(lái),可用。然后重構(gòu)它,使之完美。對(duì)于你們當(dāng)中知道測(cè)試驅(qū)動(dòng)開(kāi)發(fā) (TDD)的人來(lái)說(shuō),對(duì)這個(gè)會(huì)很熟悉。這里的關(guān)鍵就在于你要習(xí)慣于重構(gòu)這種事情。如果你使用的是像IntelliJ IDEA這樣強(qiáng)大的集成開(kāi)發(fā)工具的話,重構(gòu)的工作會(huì)變得簡(jiǎn)單的多。
    重構(gòu)之后,你也許會(huì)弄出一些Bug,導(dǎo)致某些功能出問(wèn)題。這就是為什么說(shuō)寫自動(dòng)化測(cè)試的原因。不論何時(shí)重構(gòu)后,只要運(yùn)行一下所有的測(cè)試用例,你就能準(zhǔn)確的知道什么地方出了問(wèn)題。
    不要過(guò)度沉迷于技巧?
    當(dāng)我第一次讀到有關(guān)設(shè)計(jì)模式的知識(shí)時(shí),我覺(jué)得我找到了圣杯。這些精心設(shè)計(jì)的思想作用顯著,它能使你的設(shè)計(jì)易于理解,因?yàn)槟憧梢院?jiǎn)單的說(shuō)"我使用的是 '觀察器模式'",而不用從頭到尾的解釋一遍。那么,有問(wèn)題嗎?一切看起來(lái)都這么自然、簡(jiǎn)單,你開(kāi)始不論在哪都使用設(shè)計(jì)模式。為什么不把這個(gè)類做成 singleton呢?干嘛不去再創(chuàng)建一些工廠類呢?
    于是一個(gè)80行就能寫完的腳本,你最終使用了10個(gè)類,15個(gè)接口,外加一大堆范式和標(biāo)記符。97%的代碼不做任何事情。設(shè)計(jì)模式是一種十分有用的用來(lái)簡(jiǎn)化你的設(shè)計(jì)的工具,但這不意味著你該在所有能用到的地方都用它。你應(yīng)該用它們,但不能濫用。
    通過(guò)習(xí)例學(xué)習(xí)新知?
    編程是一種學(xué)習(xí)新知的過(guò)程。當(dāng)你學(xué)到了新的程序庫(kù)或新語(yǔ)言,你可能會(huì)迫不及待的丟掉舊的代碼,用你新學(xué)到的東西重新寫一遍。有很多的理由都能說(shuō)明你不該這么做。
    往現(xiàn)有的應(yīng)用里增加新的類庫(kù)或框架同屬于這種情況。就說(shuō)你寫了一個(gè)JavaScript的web應(yīng)用,期間,你發(fā)現(xiàn)了jQuery。現(xiàn)在你突然急切的想丟到你的Javascript程序,重新用jQuery寫,盡管你還從來(lái)沒(méi)用過(guò)它。
    最好的方式是你先用jQuery寫一些簡(jiǎn)單的例子,通過(guò)這種方式把你在應(yīng)用里將要用到的知識(shí)都學(xué)會(huì)。需要AJAX?在你的項(xiàng)目之外做一些小例子,當(dāng)完全弄懂了后,丟掉例子,應(yīng)用到你的產(chǎn)品里。
    如果你非常關(guān)注編程技術(shù),我強(qiáng)烈的推薦你閱讀Steve McConnell寫的 《代碼大全》 一書(shū)。它會(huì)永遠(yuǎn)的改變你對(duì)編程的認(rèn)識(shí)。:)

    總結(jié)

    以上是生活随笔為你收集整理的改善程序代码质量的一些技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。