編程對(duì)你來(lái)說(shuō)有什么樂(lè)趣?
和大家分享一些寫(xiě)好代碼的習(xí)慣:
一.良好的編碼規(guī)范
編碼規(guī)范我認(rèn)為是考量程序員是否合格的一個(gè)重要因素,因?yàn)閷?xiě)代碼不規(guī)范真的會(huì)讓團(tuán)隊(duì)的整體效率都降低。好的編碼規(guī)范可以指導(dǎo)開(kāi)發(fā)人員更加高效、高質(zhì)量地進(jìn)行開(kāi)發(fā),呈現(xiàn)給用戶體驗(yàn)好、性能優(yōu)、穩(wěn)定性佳、安全性高的產(chǎn)品。那么說(shuō)起代碼規(guī)范,代碼規(guī)范具體都指哪些方面的規(guī)范呢?1.命名規(guī)范
文件、資源、方法、接口、屬性、變量所有涉及到需要自己定義的部分都需要按照規(guī)范來(lái)命名,不然整個(gè)項(xiàng)目長(zhǎng)期堆下來(lái)就是一團(tuán)糟,維護(hù)起來(lái)相當(dāng)?shù)睦щy。2.格式規(guī)范
縮進(jìn)排版規(guī)范,我給大家推薦一個(gè)工具,checkStyle(AS和Idea都有這個(gè)工具)。AS checkStyle 插件可以通過(guò)自定義配置文件來(lái)統(tǒng)一團(tuán)隊(duì)的代碼風(fēng)格和代碼規(guī)范,降低團(tuán)隊(duì)的交流成本,一般配合 save actions Reborn 使用更佳。關(guān)于checkStyle的配置文件網(wǎng)上也不少,大家自行去網(wǎng)上搜索,不單獨(dú)贅述了。3.邏輯規(guī)范
如:相同方法要抽取到工具類中以供全局調(diào)用、一個(gè)方法不要寫(xiě)幾千行,方法過(guò)于復(fù)雜就要再單獨(dú)抽離方法等。4.注釋規(guī)范
注釋這部分內(nèi)容文章第二章節(jié)會(huì)單獨(dú)說(shuō)明。5.其他規(guī)范
如:一行聲明一個(gè)變量、所有的變量必須在聲明時(shí)初始化、for循環(huán)不要調(diào)用線程、項(xiàng)目中禁止使用過(guò)多的靜態(tài)變量等等示例:我自己寫(xiě)項(xiàng)目遵循的開(kāi)發(fā)規(guī)范(去華為云開(kāi)發(fā)者社區(qū)、csdn等優(yōu)秀社區(qū)都可以搜索相關(guān)的開(kāi)發(fā)規(guī)范)1)工程包命名
工程包名com. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).activity 放工程的主Activity 以及BaseActivitycom. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).activity.list 在activity下面建一個(gè)文件夾list放所有的ListActivitycom. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).adapter 放和主activity對(duì)應(yīng)的adapter 以及通用adaptercom. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).adapter.item 放和listAcitivity對(duì)應(yīng)的Adaptercom. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).bean 放javabean類com. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).util 放各種工具類 (圖片,字符,時(shí)間,dalog 等)com. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).net 放和服務(wù)器交互的類com. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).view 放 自定義view的類com. 公司名稱簡(jiǎn)寫(xiě).應(yīng)用名稱簡(jiǎn)寫(xiě)(拼音或者英文).db 放 本地?cái)?shù)據(jù)庫(kù)操作相關(guān)的類當(dāng)然 上面的公司名稱可以換成別的 ,盡量用簡(jiǎn)寫(xiě)或者英文 比如qq: 就可以寫(xiě)成 com.tencent.qq.activity,大家明白這個(gè)意思就好。2)類文件命名
1. activityactivity 我習(xí)慣分為兩種考慮, 一種是列表數(shù)據(jù)的, 第二種是普通的activity 。這么分有個(gè)好處就是找這個(gè)類的時(shí)候方便。當(dāng)你看到這個(gè)界面時(shí)列表數(shù)據(jù)的時(shí)候 直接搜索listActivity就能過(guò)濾掉一大部分,然后再篩選會(huì)簡(jiǎn)單很多。這個(gè)大家從上面我定義的包名中就看出來(lái)了。所以 activity的命名是 : 功能簡(jiǎn)寫(xiě)+Activity功能簡(jiǎn)寫(xiě)+ListActivity登錄:LoginActivity用戶列表:UserListActivity2. layout xml全部小寫(xiě),用_隔開(kāi) xml命名 分為幾種主Activity用到的xml : activity_activity名稱簡(jiǎn)寫(xiě).xml activity_login.xmlinclude的xml:include_功能簡(jiǎn)寫(xiě).xml include_top_search.xmladapter中用到的xml:item_adapter名稱簡(jiǎn)寫(xiě).xml item_user_list.xmldialog用到的xml:dialog_功能簡(jiǎn)寫(xiě).xml dialog_show_tips.xml自定義view用的xml :view_view名稱簡(jiǎn)寫(xiě).xmlview_header.xml 這個(gè)就是共用的view 也可以用common_view名稱簡(jiǎn)寫(xiě).xml替換xml中 控件id命名:模塊名稱_view的邏輯名稱_view縮寫(xiě)用戶名EditText : login_username_et登錄確認(rèn)Button: login_confirm_btnLayoutView lvRelativeView rvEditText etTextView tvButton btnImageButton imgBtnImageView ivCheckBox cbxRadioButton rbtn其他的類似,不一一列舉了。這些都不是規(guī)定死的 ,大家自己定義,前提能區(qū)分開(kāi)不同的控件并且能讓別人看懂。3.工具類等工具類功能簡(jiǎn)寫(xiě)+Util : DialogUtil.java 、 TextUtil.java3). 圖片等資源文件命名
背景圖片: bg_功能_說(shuō)明 bg_login_commit圖標(biāo)圖片: icon_功能_說(shuō)明 icon_tab_set功能也可以換為 acvitiy名稱簡(jiǎn)寫(xiě)共用的圖片 前面都加 common4).程序中變量 常量命名
在說(shuō)這個(gè)之前要給大家補(bǔ)充一下 標(biāo)識(shí)符命名。就是變量和常量名字我一般就用兩種:1 駝峰(Camel)命名法:又稱小駝峰命名法,除首單詞外,其余所有單詞的第一個(gè)字母大寫(xiě)。protected TextView mWatchCountInfoTv;protected TextView mNicknameTv;protected TextView mLocationTv;protected TextView mVideoTopicTv;protected TextView mVideoTitleTv;2.下劃線命名法:單詞與單詞間用下劃線做間隔。private static final int MSG_SHOW_GIFT = 20;private static final int MSG_SHOW_EXPRESSION = 21;private static final int MSG_SHOW_RED_PACK = 22;private static final int MSG_SHOW_JOIN_USER = 23;靜態(tài)常量名稱都是 功能說(shuō)明_類別 統(tǒng)一下劃線命名法private static final int MSG_SHOW_GIFT = 20;private static final int MSG_SHOW_EXPRESSION = 21;private static final int MSG_SHOW_RED_PACK = 22;private static final int MSG_SHOW_JOIN_USER = 23;變量這個(gè)分為兩種全局變量、局部變量,全局變量 以m開(kāi)頭,局部變量不用。全局變量:protected VideoEntity mCurrentVideo;protected int mShareType;protected MyHandler mHandler;protected int mLikeCount;protected int mCommentCount;局部變量:TextView tview = new TextView();Button button = new Button();上面已經(jīng)介紹過(guò) xml中id命名的方法了所以變量和那個(gè)規(guī)則基本一致: 功能邏輯名稱簡(jiǎn)寫(xiě)+view 簡(jiǎn)寫(xiě)private ImageView mPhoneVerifyIv;private Button mConfirmBtn;private EditText mPhoneNumberEt;private TextView mSelectCountryNameTv;private TextView mSelectCountryCodeTv;之前寫(xiě)的一篇文章【軟件開(kāi)發(fā)規(guī)范六】《Android開(kāi)發(fā)編碼規(guī)范》二.寫(xiě)好代碼注釋
代碼注釋我認(rèn)為是很有必要的,這里說(shuō)的代碼注釋是那些必要的,一些簡(jiǎn)單的功能沒(méi)有必要加太多的注釋說(shuō)明。舉個(gè)簡(jiǎn)單的例子:某項(xiàng)目中有一個(gè)項(xiàng)目重點(diǎn)工程列表功能,后來(lái)又新增了在施項(xiàng)目列表功能,再后來(lái)又新增了停工項(xiàng)目重點(diǎn)列表功能,這個(gè)時(shí)候一般的開(kāi)發(fā)人員都會(huì)考慮復(fù)用,就是用一個(gè)類,不用寫(xiě)三個(gè)類,因?yàn)榱斜韮?nèi)字段都很類似,這個(gè)時(shí)候開(kāi)發(fā)人員直接用的一個(gè)類,然后我貼一下代碼大家感受下有注釋和無(wú)注釋兩者區(qū)別:無(wú)注釋:有注釋:很明顯加上注釋以后,大家一眼就能看出這個(gè)類的作用,三個(gè)功能列表都是這個(gè)類的代碼,后期維護(hù)起來(lái)會(huì)非常方便,如果不加注釋,可能只有開(kāi)發(fā)這個(gè)功能的開(kāi)發(fā)人員清楚,其他人或者后期進(jìn)入公司維護(hù)這個(gè)項(xiàng)目的開(kāi)發(fā)人員只能通過(guò)讀代碼分析出三個(gè)功能是復(fù)用的一個(gè)類,很明顯效率就會(huì)降低很多,所以在開(kāi)發(fā)過(guò)程中一定要養(yǎng)成一個(gè)寫(xiě)注釋的習(xí)慣,代碼注釋相當(dāng)于產(chǎn)品說(shuō)明書(shū),太重要了。寫(xiě)代碼注釋要注意的幾個(gè)問(wèn)題:盡量減少不必要的代碼注釋,說(shuō)的直白點(diǎn)就是大家都知道的東西就沒(méi)必要加注釋,加了就是畫(huà)蛇添足類似這種的就屬于畫(huà)蛇添足,我看代碼能很直觀的知道這是點(diǎn)擊登錄后調(diào)用的邏輯,不需要解釋,寫(xiě)了感覺(jué)一點(diǎn)意義沒(méi)有。注釋一定寫(xiě)清楚作用,對(duì)于特殊處理的邏輯,要注釋這樣處理的原因代碼的注釋不是越詳細(xì)越好,概況的說(shuō)清楚這段代碼的作用即可。三.review重構(gòu)代碼
review代碼剛?cè)胄械臅r(shí)候就聽(tīng)別人說(shuō)過(guò),但是在前兩家公司的時(shí)候,基本都是各做各的,每個(gè)人分工不同,也就是說(shuō)自己寫(xiě)的代碼自己維護(hù),也不涉及到其他人,真正讓我知道review代碼的是在第三家公司的領(lǐng)導(dǎo)。當(dāng)時(shí)我在第三家公司工作的一年多時(shí)間,從入職第一天寫(xiě)的代碼到我離職的前一天,我寫(xiě)的所有的代碼,我的領(lǐng)導(dǎo)都會(huì)幫我review一遍,每次review完我寫(xiě)的代碼,他都會(huì)把我叫過(guò)去和我說(shuō)哪里寫(xiě)的不行、哪里需要改、怎么改、參照哪處的代碼。也是在那家公司項(xiàng)目組領(lǐng)導(dǎo)的指導(dǎo)下,我開(kāi)發(fā)水平有了很大的提升,到現(xiàn)在回想起來(lái),內(nèi)心非常感謝他。可以說(shuō)是那個(gè)領(lǐng)導(dǎo)幫我養(yǎng)成了review代碼的習(xí)慣,剛?cè)サ臅r(shí)候被他說(shuō)過(guò)幾次,我每次寫(xiě)完也會(huì)review一遍,最開(kāi)始我僅僅是不想再被他吐槽寫(xiě)的爛,因?yàn)榇蠹叶级模绦騿T就怕別人說(shuō)自己菜,后來(lái)時(shí)間長(zhǎng)了發(fā)現(xiàn)寫(xiě)完功能后review一遍代碼,然后修改一下會(huì)讓代碼規(guī)范整潔很多;其次有些功能會(huì)加深理解。后來(lái)我離職去了下一家公司也一直保留寫(xiě)完代碼后再重新review一遍的習(xí)慣。review代碼幾點(diǎn)小的建議:做完一個(gè)小功能后或者發(fā)布一個(gè)版本后review一遍,這個(gè)時(shí)間點(diǎn)比較適合,新功能還在討論需求中,會(huì)有空余時(shí)間可以用來(lái)review。代碼review都看哪些東西,我其實(shí)一般主要就看三方面:代碼規(guī)范 命名、格式、易讀性等代碼涉及到的一些算法或者邏輯等代碼是否可整合,比如同一類的方法是否可以增加參數(shù)復(fù)用、自定義組件是否可以重新封裝增強(qiáng)擴(kuò)展性。當(dāng)然如果系統(tǒng)性的review代碼不僅僅這三點(diǎn),大家根據(jù)自己實(shí)際情況來(lái)做。四.多學(xué)習(xí)優(yōu)秀的源碼
如何讓自己的代碼寫(xiě)的看起來(lái)很高大上、有水平、很規(guī)范。很多老菜鳥(niǎo)一般都會(huì)脫口而出:看源碼啊...這個(gè)看源碼沒(méi)毛病,看源碼肯定會(huì)有所收獲,源碼基本都是標(biāo)準(zhǔn)規(guī)范化的模板,但是說(shuō)實(shí)話,我真的沒(méi)咋認(rèn)真讀過(guò)那些底層源碼,除了剛學(xué)習(xí)java那會(huì)老師說(shuō)必須仔細(xì)看API,去源碼找方法,后來(lái)基本沒(méi)咋看過(guò)源碼,因?yàn)槲艺娴目床幌氯ァ?/p>我一般都喜歡帶著問(wèn)題或者有一定目的去做事情,你就直接讓我看一堆源碼,我容易犯困。我個(gè)人習(xí)慣是看那些大廠的DEMO,比如我做云直播,我就看XX團(tuán)隊(duì)的DEMO的代碼是怎么寫(xiě)的;我做推送我就看某推送團(tuán)隊(duì)的API文檔說(shuō)明,學(xué)習(xí)文檔說(shuō)明里面附帶的DEMO源碼是如何寫(xiě)的。所以個(gè)人習(xí)慣看大廠發(fā)布的最新版本的DEMO源碼,因?yàn)槭紫任夷芸炊浯文苤苯訋臀医鉀Q問(wèn)題。再后來(lái)我就看github上面主流的一些開(kāi)源DEMO,都是star高的開(kāi)源項(xiàng)目,這些項(xiàng)目都有一個(gè)共同點(diǎn),就是代碼都寫(xiě)的很規(guī)范。學(xué)習(xí)代碼規(guī)范的同時(shí)還能順便了解項(xiàng)目中都依賴了哪些新的框架、采用了哪些新的技術(shù),總而言之就是找適合自己的優(yōu)秀的項(xiàng)目去學(xué)習(xí)。五.保持平和的心態(tài)
程序員這個(gè)職業(yè)其實(shí)對(duì)個(gè)人的心態(tài)要求很高,控制不好自己的心態(tài)真的不太適合做這行工作。因?yàn)槊刻於紩?huì)面對(duì)各種復(fù)雜的問(wèn)題,做不完的功能,改不完的BUG...描述一個(gè)場(chǎng)景:你正在改一個(gè)特別難處理的bug,但是開(kāi)發(fā)環(huán)境卻在這時(shí)候出問(wèn)題了,配置了半天還是解決不了,開(kāi)發(fā)環(huán)境還是一直有問(wèn)題,恰好這時(shí)候產(chǎn)品經(jīng)理突然過(guò)來(lái)和你說(shuō)之前另外一個(gè)功能模塊的需求設(shè)計(jì)需要推翻重新做并且需要盡快加班改完。產(chǎn)品經(jīng)理通知所有相關(guān)人員參加新需求討論交底會(huì)議,會(huì)上研發(fā)經(jīng)理要求大家晚上留下來(lái)加班討論改版后的系統(tǒng)架構(gòu)設(shè)計(jì)和數(shù)據(jù)庫(kù)相關(guān)改動(dòng)設(shè)計(jì),此時(shí)你的內(nèi)心想必是有很多神獸飄過(guò)...很多開(kāi)發(fā)的小伙伴碰到這種情況,心態(tài)就發(fā)生變化了,bug也改不下去,功能也不想做,即便硬著頭皮去改去做也會(huì)有很多問(wèn)題,因?yàn)樾膽B(tài)沒(méi)調(diào)整好,邏輯沒(méi)有梳理清晰,做出來(lái)的功能一定是問(wèn)題一大堆。調(diào)整心態(tài)的方法:1.站起來(lái)活動(dòng)活動(dòng),讓自己冷靜冷靜。2.去各種摸魚(yú)群里面吹吹水、吐槽吐槽,都可以緩解我們緊張煩躁的情緒。3.去各種技術(shù)社區(qū)去瀏覽瀏覽文章或者寫(xiě)寫(xiě)文章。總之就是做一些事情,先轉(zhuǎn)移一下注意力,先把自己心態(tài)調(diào)整好,這樣才能高效的投入到工作中。總結(jié)
代碼是一環(huán)扣一環(huán)的,從邏輯、可讀、簡(jiǎn)潔、效率、維護(hù),這些標(biāo)準(zhǔn)都決定了代碼的好壞。從看到學(xué)再到寫(xiě),在提升自己代碼能力的同時(shí),還要注意代碼的質(zhì)量?jī)?yōu)化,一個(gè)好的程序,是由好的代碼模塊組合而成的,而在我們寫(xiě)程序的時(shí)候就應(yīng)該多加考慮和設(shè)計(jì),這樣不僅是對(duì)代碼負(fù)責(zé)也是對(duì)自己負(fù)責(zé),寫(xiě)好優(yōu)質(zhì)代碼是一個(gè)程序員應(yīng)盡的責(zé)任。本文分享自華為云社區(qū)《【云駐共創(chuàng)】為了寫(xiě)好代碼,你堅(jiān)持了哪些好習(xí)慣?》,作者:再見(jiàn)孫悟空_。