日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
程序總出故障,這10個(gè)容易犯的編程錯(cuò)誤你避免了嗎?

為什么程序出故障?雖然自世界上第一位女程序員艾達(dá)·洛夫萊斯(Ada Lovelace)在上世紀(jì)第一次看到通用計(jì)算的潛力以來我們已取得了很大進(jìn)展,但是我們編寫的軟件還是錯(cuò)誤百出。這些年來,盡管我們開發(fā)出許多高級方法來確保代碼的成功,但是程序還是不斷的出故障。

公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)、做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出云溪免費(fèi)做網(wǎng)站回饋大家。

原因何在?

雖然這個(gè)問題的答案多種多樣,但我們還是決定提供一個(gè)務(wù)實(shí)的答案。程序員難免犯錯(cuò)。他們有時(shí)馬虎了事。他們并不總是使用最佳工具或最佳實(shí)踐。

我在加州大學(xué)伯克利分校教面向?qū)ο缶幊踢@門課,我在學(xué)校教優(yōu)秀編程實(shí)踐所花的時(shí)間與幫助學(xué)生理解代碼本身所花的時(shí)間相比只多不少。我在課堂上看到許多常犯的錯(cuò)誤,本文就介紹其中幾個(gè)常見錯(cuò)誤。

我還聯(lián)系上了西北理工大學(xué)工程學(xué)院的詹姆斯·A·康納(James A. Connor)教授,請他介紹其學(xué)生常犯的一些錯(cuò)誤。

我先來說幾個(gè)。

第一個(gè)錯(cuò)誤:糟糕的注釋方法。

注釋是程序里面計(jì)算機(jī)并不執(zhí)行的那部分文本。它們被程序員寫成附注的形式,用來解釋代碼里面發(fā)生的情況。

我的好多學(xué)生避免給代碼添加注釋,也想不明白為何要占用實(shí)際編碼的時(shí)間去編寫一些注釋。我最實(shí)用的例子來自我自己的生活。

早在世紀(jì)之交前,我編寫了版本1.0的ZENPRESS,這是最古老的內(nèi)容管理系統(tǒng)之一。我預(yù)計(jì)它會(huì)帶來好幾年的文章。14年過后,它仍在管理許多文章,準(zhǔn)備好了75000篇文章和26億頁的內(nèi)容。

最后,它運(yùn)行所依賴的那個(gè)平臺過時(shí)了。我不得不回過頭去研究代碼。2009年,我把代碼從原始平臺移植到現(xiàn)代平臺。我最近不得不再次改動(dòng),因?yàn)镻HP一個(gè)關(guān)鍵的語言特性在版本升級后完全消失了。

19年過后,我根本記不起所有這些代碼是怎么運(yùn)行的,但是由于我對代碼作了詳細(xì)的注釋,所以可以說有了一份路線圖。我可以查看代碼,查看嵌入在代碼里面的注釋,然后進(jìn)行修改。

你在團(tuán)隊(duì)工作時(shí),或者你的軟件不歸你監(jiān)管時(shí),注釋也很重要。你的職業(yè)生涯可能發(fā)生變化,別人可能需要過來了解你的代碼。注釋將大有幫助。

第二個(gè)錯(cuò)誤:糟糕的變量命名。

我會(huì)繼續(xù)探討這個(gè)主題:通過語言讓代碼一目了然。我會(huì)用一個(gè)例子來表明這點(diǎn)。假設(shè)你駕駛一輛每加侖汽油跑20英里的汽車,開了100英里。請問你用掉了多少汽油?

這是個(gè)簡單的例子,但是適用于我們的用途。假設(shè)你遇到了a = b/c這一行。a指什么?b和c又指什么?它們與你的其余代碼有何關(guān)系?在編寫程序十分鐘后,你會(huì)記得一干二凈。更不用說別人過來修改代碼或編寫更新版了。

現(xiàn)在看看這個(gè)表達(dá)式:加侖 = 英里/每加侖行駛英里數(shù)。每一個(gè)變量的具體用途就一目了然。一個(gè)代表加侖,一個(gè)代表英里,另一個(gè)代表每加侖行駛英里數(shù)。很清楚。

想一想為變量賦予清楚的英語(或者其他任何母語)名稱與注釋之間的關(guān)系。假設(shè)你從別人那里接過了一段代碼,看到a = b/c。這代碼用來干嘛?你有何頭緒嗎?

務(wù)必以一種代表其功能的方式來命名變量。那樣可以節(jié)省大量的時(shí)間,減少許多頭痛的問題。

第三個(gè)錯(cuò)誤:沒有實(shí)驗(yàn)筆記(lab notes)。

我在1997年年中開始編寫ZENPRESS,它在1998年1月份上線。遺憾的是,我當(dāng)時(shí)匆忙完成了項(xiàng)目,沒有花時(shí)間為這第一個(gè)版本編寫實(shí)驗(yàn)筆記。此后我懊悔多次。從1999年6月份開始(當(dāng)時(shí)我開始編寫版本2),我就經(jīng)常做實(shí)驗(yàn)筆記了。

實(shí)驗(yàn)筆記是代碼注釋之外的記錄??茖W(xué)家一直在使用實(shí)驗(yàn)筆記,作為其研發(fā)過程的日志或?qū)υ拑?nèi)容。實(shí)驗(yàn)筆記用來證明科學(xué)發(fā)現(xiàn)歸誰所有,因?yàn)檠芯窟^程常常記錄在科學(xué)家用來記錄進(jìn)度的每天日志中。

實(shí)驗(yàn)筆記對程序員來說同樣是一種有效的工具。我為ZENPRESS編寫的上一份實(shí)驗(yàn)筆記是在今年3月份編寫的,當(dāng)時(shí)我不得不把ZATZ歸檔從一家主機(jī)托管提供商遷移到另一家。我還經(jīng)常對自己的其他項(xiàng)目做實(shí)驗(yàn)筆記,由于能夠回過頭去查閱筆記,好多次幫了大忙。

如果你還沒有做實(shí)驗(yàn)筆記,現(xiàn)在就開始做。記下你做的任何變化,你的理由,你考慮后丟棄的代碼,參考的實(shí)用資源,以及將來幫助你的任何其他內(nèi)容。你還能幫助將來的同事或接手人――如果你需要證明歸屬權(quán),實(shí)驗(yàn)筆記還能起到證明的作用。

第四個(gè)錯(cuò)誤:不用一種人類語言編寫。

我的學(xué)生要考試過關(guān),不僅僅要編程,他們還要編寫討論區(qū)帖子,證明他們熟知某些編程概念。

我們提出這個(gè)要求出于兩個(gè)原因。當(dāng)然,首先是為了證明熟悉概念。但是更為重要的是需要所有專業(yè)人員都有編寫能力。

我在這方面遭到學(xué)生們的反對。每學(xué)期都有學(xué)生高喊:“我想成為程序員,而不是編寫者?!钡蔷幊?、工程、IT和幾乎所有專業(yè)工作都不可能在真空狀態(tài)下存在。

你需要通過編寫來解釋概念、推銷想法、獲得資金、要求澄清、準(zhǔn)備提議,或者甚至為拿到更好的分?jǐn)?shù)據(jù)理力爭。開源項(xiàng)目的參與者在非常龐大的團(tuán)隊(duì)協(xié)同工作,他們保持同步的唯一手段就是編寫清楚的、易于理解的信息。

結(jié)論很簡單:如果你想要從事專業(yè)工作或從事任何重要的項(xiàng)目,就需要用一種人類語言(比如英語)來編寫,而不僅僅是用一種編程語言來編寫。

第五個(gè)錯(cuò)誤:糟糕的代碼格式。

毫無疑問,這里的一個(gè)主題就是:讓代碼易于了解。代碼維護(hù)起來極耗費(fèi)時(shí)間和財(cái)力。坦率地說,這也不是很有趣。最好還是能夠把寶貴的工作時(shí)間用來添加功能,而不是花幾周來鉆研舊代碼,試圖搞清楚你(或者交給你代碼的那個(gè)人)想要完成什么任務(wù)。

本人就遇到過這種事,不僅僅是來自我的舊代碼,還來自從別人手里接過的代碼。我接手被丟棄的WordPress 開源插件作為一個(gè)副帶項(xiàng)目。據(jù)我所知,我接手的插件比其他任何人都要多。每個(gè)插件都是由別人開發(fā)的,為了保持插件可以正常使用,我不得不鉆研陌生人的代碼。

幸好,那些開發(fā)人員都是高手,深諳編程之道。要不然,我也就無法接手這些項(xiàng)目了。但即便如此,要盡快上手還是困難重重。你能想象要是他們編寫的代碼結(jié)構(gòu)很糟糕,那會(huì)有多難嗎?

我所說的結(jié)構(gòu)是指代碼的布局方式。我為學(xué)生制作了這方面的一段視頻。有興趣的話,大家可以上YouTube觀看(https://youtu.be/0u-I016Hxlw)。

想一想你在網(wǎng)上讀到的文章。一些文章格式優(yōu)美,每一個(gè)段落之間有一行,一切都保持一致??墒怯行┪恼露加靡粋€(gè)大大的blob來排列,沒法看清。

每個(gè)程序員(或項(xiàng)目)都往往有一種編程風(fēng)格。你的風(fēng)格是什么樣不是同樣重要,只要保持一致就行。你需要讓代碼格式來幫助引導(dǎo)。

比如說,在我的代碼中,我堅(jiān)持代碼段之間的空行不得超過一行。如果我看到一段更大的空白區(qū),我立即就知道這一點(diǎn):哪里出現(xiàn)了異常,這個(gè)空白區(qū)里面可能有錯(cuò)誤。

你在深入研究代碼時(shí),要關(guān)注貴企業(yè)有沒有編程風(fēng)格??紤]為你的所有程序員定義一種編程風(fēng)格,堅(jiān)持采用清楚、易于維護(hù)的那一種風(fēng)格。

第六個(gè)錯(cuò)誤:糟糕的錯(cuò)誤檢查。

某位著名的將軍曾經(jīng)說過,遇到敵人時(shí),計(jì)劃根本不管用。我在此基礎(chǔ)上改動(dòng)一下,遇到用戶時(shí),你的代碼根本不管用。盡管你認(rèn)為自己知道用戶會(huì)如何使用代碼,但你其實(shí)并不知道,相信我。

用戶會(huì)搞壞你的代碼。

正確的處理方式就是借助測試和錯(cuò)誤檢查。錯(cuò)誤檢查是指這種做法:檢查代碼中每一次操作的結(jié)果。確保它符合你的預(yù)期,或者確保你的代碼可處理意外的結(jié)果。

比如說,我的學(xué)生經(jīng)常有一項(xiàng)任務(wù):閱讀文件。幾乎所有的學(xué)生編寫代碼時(shí)會(huì)調(diào)用文件讀取例程。他們檢查用戶是否取消對話框,但是很少查看文件是否實(shí)際上被讀入,或者是否存在某種類型的系統(tǒng)錯(cuò)誤。要是他們試圖編寫文件,那就更糟糕了。他們幾乎從不真正查看文件是不是實(shí)際上保存起來。真是要命。

不難發(fā)現(xiàn)這會(huì)有多糟糕。為了對付這種情形,你總是要考慮能不能絕對預(yù)測行為,然后認(rèn)識到你不能絕對預(yù)測行為。你需要測試。測試并不是僅僅指你自己運(yùn)行代碼。測試意味著讓實(shí)際用戶(即行為可能無法預(yù)測的那些人)運(yùn)行你的代碼。

你會(huì)發(fā)現(xiàn)這會(huì)提供大量的信息。

第七個(gè)錯(cuò)誤:使用打印輸出語句,而不是真正的調(diào)試器。

這些年來我發(fā)現(xiàn),使用不同語言的程序員往往有不同的文化。總的來說,那是由于他們構(gòu)建不同種類的解決方案、使用不同的工具。

這方面的一個(gè)例子就是我的C#編程學(xué)生和與我一起開發(fā)一些項(xiàng)目的開源PHP開發(fā)人員之間的區(qū)別。幾乎沒有一個(gè)C#程序員會(huì)考慮不使用一種符號調(diào)試器來調(diào)試代碼。那是由于, C#本身是使用Visual Studio作為編程環(huán)境來編寫的,調(diào)試器內(nèi)置在里面。

相比之下,我見到許多PHP開發(fā)人員認(rèn)為只要插入echo語句或var_dump就足以幫助自己調(diào)試代碼了。這一方面是由于,大多數(shù)PHP程序員往往在編輯器里面編程,而不是在開發(fā)環(huán)境里面編程。兩者之間的一大區(qū)別就是調(diào)試器。

那么,調(diào)試器是什么東東?簡而言之,這種工具讓你可以在代碼運(yùn)行時(shí)查看代碼內(nèi)部的情況。它就好比是代碼的X光、超聲波或MRI。可以指令調(diào)試器在某些點(diǎn)停止,檢查所有變量的狀態(tài)。還可以指令調(diào)試器在某些條件下停止。你可以更改值,可以查看和分析值(不過分析有時(shí)是另一種工具)。

工作效率方面的差異很大。如果你想更快速、極其準(zhǔn)確地完成工作,就要確保使用一種真正的符號調(diào)試器。

以上就是我所介紹的幾個(gè)常見錯(cuò)誤,下面看看詹姆斯·康納教授介紹的幾個(gè)。

第八個(gè)錯(cuò)誤:使用魔數(shù)(magical number)。

許多程序員認(rèn)為,他們只要編寫一次代碼,代碼就能完美無缺。然而,為了優(yōu)化企業(yè)軟件和工業(yè)軟件的長期生命周期成本,有必要編寫能夠抵御不斷變化的條件的代碼。

這方面的一個(gè)典例就是魔數(shù)這個(gè)想法。我所說的魔數(shù)是指程序員認(rèn)為總能經(jīng)受得住時(shí)間考驗(yàn)的數(shù)字。

以可能基于客戶的采購數(shù)量的傭金計(jì)算為例。截至截稿時(shí),傭金比例可能是三個(gè)百分點(diǎn),即0.03。

現(xiàn)在,設(shè)想一下會(huì)如何編寫這段代碼:傭金= .03 *銷售額。在這個(gè)上下文中,這個(gè)魔數(shù)就是0.03。由于程序員認(rèn)為這會(huì)是永遠(yuǎn)神奇地有效,他將0.03這個(gè)數(shù)字硬編碼到代碼中。

這一切很好,但是每年的傭金往往發(fā)生變化。如果下一年傭金漲了0.5%,漲到0.035,那么就很難在成千上萬行代碼中找到它。

切忌使用魔數(shù),而是在一個(gè)地方定義變量或常量,讓代碼使用那些變量。如果你預(yù)先定義commission_rate,那么commission = commission_rate * sale之類的代碼就不需要改動(dòng)。

要考慮的另一個(gè)方面是,無論你在何處找到魔數(shù),都應(yīng)該找到想要提供給用戶的選項(xiàng),以便用戶可以在偏好設(shè)置部分可以設(shè)置。

第九個(gè)錯(cuò)誤:馬虎對待的日期和時(shí)間。

這里有個(gè)難題:一年有幾天?365天也許是平常的回答,但今年當(dāng)然有366天。一天會(huì)有365.25天嗎?這不可能。

但我的一些學(xué)生認(rèn)為,既然閏年每四年就出現(xiàn)一次,所以每年平均下來因此是365.25天。在進(jìn)行日期計(jì)算時(shí),他們使用這個(gè)平均值;因而,結(jié)果根本不正確。

常常更好的辦法是使用系統(tǒng)庫來計(jì)算日期,因?yàn)槟阌?jì)算的日期可能不是西方日歷日期。

不妨看一下時(shí)間方面的類似問題。每幾年,由于地球轉(zhuǎn)速減慢,有一天會(huì)多出一秒來,通常是在6月30日或12月31日那天。這叫作閏秒,因而,時(shí)鐘可能從11:59:59走到11:59:60再走到12:00:00。

這是第二個(gè)時(shí)間挑戰(zhàn)。在使用夏令時(shí)的地方,交易的進(jìn)行有可能亂套。比如說,先置入交易A,但是隨后時(shí)間被向后重置1小時(shí),那么就置入交易B。然而,如果你在時(shí)間序列方面很馬虎,它就會(huì)記錄為交易B先發(fā)生。這種類型的時(shí)間錯(cuò)誤會(huì)導(dǎo)致產(chǎn)生不必要的罰款,還會(huì)導(dǎo)致其他各種各樣的混亂。

再次,有許多好的語言和系統(tǒng)庫可以處理這兩種時(shí)間問題。常常更好的辦法是使用現(xiàn)有的庫,而不是編寫自己的時(shí)間計(jì)算代碼。

第十個(gè)錯(cuò)誤:沒有選擇合適的數(shù)據(jù)結(jié)構(gòu)。

數(shù)據(jù)結(jié)構(gòu)是表示程序中數(shù)據(jù)的一種機(jī)制。許多人聽說過鏈表、樹和數(shù)組之類的術(shù)語。這每一個(gè)術(shù)語都是數(shù)據(jù)的邏輯表示,對應(yīng)于你試圖表示的數(shù)據(jù)的一些架構(gòu)結(jié)構(gòu)。

我看到程序員(無論編程高手還是菜鳥)最常犯的錯(cuò)誤之一就是,很少注意數(shù)據(jù)結(jié)構(gòu)方面的選擇。由于你的幾乎所有代碼都建立在選擇的那種數(shù)據(jù)表示方法上,一旦選錯(cuò)數(shù)據(jù)結(jié)構(gòu),會(huì)在將來帶來嚴(yán)重的影響。

下面這個(gè)例子可以表明這種設(shè)計(jì)錯(cuò)誤:選擇一個(gè)簡單的堆?;蜿?duì)列,而不是循環(huán)隊(duì)列。堆棧就好比是一堆盤子。你取下底部盤子,然后放上另一只盤子,再取下另一只盤子,依次類推。

如果你想拿走一只盤子,你從最上面拿走。這就叫后進(jìn)先出??蓡栴},如果你需要拿走早些時(shí)候放的東西,就很麻煩了。假設(shè)一堆棧盤子有10只盤子。想找到第一只盤子,你就得先拿走其他所有的盤子。

現(xiàn)在,不妨想象一下隊(duì)列。如果你在銀行排隊(duì),就處于隊(duì)列中。第一個(gè)進(jìn)去的也是第一個(gè)出來的。一旦第一個(gè)人得到了服務(wù),下一個(gè)人跟上,然后該人得到服務(wù)。出現(xiàn)的另一種情況是,每個(gè)人都向前邁一步,在隊(duì)列中向前移動(dòng)位置。

要是許多人來排隊(duì),會(huì)出現(xiàn)什么情況?要么他們被拒之門外,要么隊(duì)伍排到門外面。第一個(gè)人叫到后,所有這些人都要往前移動(dòng)。

如果你有大量數(shù)據(jù),這種隊(duì)列就會(huì)極其低效。每當(dāng)從隊(duì)列的開頭獲取數(shù)據(jù),所有數(shù)據(jù)都要移動(dòng)。我們置身于大數(shù)據(jù)時(shí)代,有源源不斷的數(shù)據(jù)從我們的系統(tǒng)通過。

在這種環(huán)境下,一種更好的辦法也許是實(shí)施循環(huán)隊(duì)列。在這種情況下,數(shù)據(jù)根本不動(dòng)。相反,設(shè)置的指針指向隊(duì)列的開頭和末尾;在內(nèi)部,隊(duì)列首尾相連,那樣數(shù)據(jù)以圓環(huán)、而不是隊(duì)列的方式來加以組織。當(dāng)數(shù)據(jù)元素使用、從圓環(huán)中移除后,就不需要移動(dòng)圓環(huán)中的所有數(shù)據(jù)。發(fā)生的只是第一個(gè)元素的指針指向圓環(huán)中的新元素。

有許多例子可以表明選擇正確的數(shù)據(jù)結(jié)構(gòu)會(huì)給你代碼的效率帶來重大影響,這僅僅是其中一個(gè)。

但愿你在看完本文后,會(huì)成為一名更高效的程序員,避免其中一些嚴(yán)重錯(cuò)誤。


新聞標(biāo)題:程序總出故障,這10個(gè)容易犯的編程錯(cuò)誤你避免了嗎?
分享URL:http://www.5511xx.com/article/dpgigic.html