蔡子恒 + 原創(chuàng)作品轉(zhuǎn)載請注明出處 + 《軟件工程(C編碼實踐篇)》MOOC課程http://mooc.study.163.com/course/USTC-1000002006
實驗報告鏈接
實驗四:用可重用的鏈表模塊來實現(xiàn)命令行菜單小程序V2.5
實驗五:用callback增強鏈表模塊來實現(xiàn)命令行菜單小程序V2.8
實驗七:將menu設(shè)計為可重用的子系統(tǒng)
課程學(xué)習(xí)總結(jié)
課程一
開通代碼倉庫音念,熟悉實驗樓環(huán)境草描,初步了解代碼規(guī)范唯咬,回顧linux基本命令从绘,cd疾渣、ls施戴、mkdir敷待,vim橄唬,模式切換,復(fù)制耙厚,markdown的書寫强挫,包括標題、插入鏈接薛躬、插入圖片俯渤、插入代碼,完成實驗報告型宝。
課程二
代碼規(guī)范:縮進4個空格八匠,變量命名采用lowCamel風(fēng)格絮爷,類型/類/函數(shù)名用Pascal風(fēng)格,類型/類/變量名用名詞或名詞組合梨树,函數(shù)名用動詞或動賓短語坑夯,括號清楚地表示邏輯優(yōu)先級,所有{和}獨占一行抡四,且成對對齊柜蜈,不要把多個語句和多個變量定義放在同一行,注釋指巡、文件名跨释、路徑等用英文ASCII字符,不要用中文和特殊字符厌处,不要解釋程序如何工作(How)鳖谈,要解釋程序做什么(What),為什么這么做(Why)阔涉。
課程三
將程序內(nèi)部進行模塊化缆娃,設(shè)置接口,使程序更加邏輯清楚瑰排;KISS(keep it simple and stupid):一個函數(shù)或一個方法贯要,只做一件事。擴展開來椭住,在設(shè)計上崇渗,一個系統(tǒng)、一個子系統(tǒng)京郑、一個模塊宅广、一個類等也只做一件事;Using design to frame the code 設(shè)計與實現(xiàn)保持一致些举;不要和陌生人說話(Law of Demeter):一個對象應(yīng)當(dāng)對其他對象有盡可能少的了解跟狱;運用Control Structure和Data Structure簡化代碼;一定要有錯誤處理户魏。
課程四
可重用模塊的接口設(shè)計(天王蓋地虎驶臊,寶塔鎮(zhèn)河妖),簡單地說就是造輪子叼丑,要求達到高內(nèi)聚低耦合的設(shè)計目標关翎,方便重復(fù)使用;常見接口設(shè)計規(guī)范有:參數(shù)化上下文鸠信,生死相依原則纵寝,移除前置條件,簡化后置條件等症副,還需編寫開發(fā)者指南店雅,供用戶閱讀使用政基;關(guān)于接口通用贞铣,并不是越通用越好闹啦,因為過于通用需要考慮很多情況,導(dǎo)致模塊臃腫辕坝、效率低下窍奋,因此應(yīng)該not too specific, not too general。
課程五
用callback函數(shù)實現(xiàn)linktable酱畅,設(shè)計接口能夠方便地實現(xiàn)多態(tài)琳袄,使接口更加通用而避免考慮許多情況,用戶使用起來也更簡潔纺酸。但callback的做法是把某些實現(xiàn)丟給了用戶窖逗,也算造成了一些不必要的麻煩,應(yīng)該盡量少用餐蔬。注意信息隱藏碎紊,一般地說,定義和實現(xiàn)需要隱藏樊诺,而聲明和接口暴露給用戶仗考。
課程六
可重入函數(shù):可以由多于一個任務(wù)并發(fā)使用,而不必擔(dān)心數(shù)據(jù)錯誤词爬。相反秃嗜,不可重入(non-reentrant)函數(shù)不能由超過一個任務(wù)所共享,除非能確保函數(shù)的互斥(或者使用信號量顿膨,或者在代碼的關(guān)鍵部分禁用中斷)锅锨。可重入函數(shù)可以在任意時刻被中斷恋沃,稍后再繼續(xù)運行橡类,不會丟失數(shù)據(jù)⊙看剑可重入函數(shù)要么使用本地變量顾画,要么在使用全局變量時保護自己的數(shù)據(jù)。
線程安全:在代碼中使用一個互斥量實現(xiàn)線程安全匆笤。注意:可重入的函數(shù)不一定是線程安全的研侣;不可重入的函數(shù)一定不是線程安全的。
課程七
將menu設(shè)計為可以重用的子系統(tǒng)炮捧,利用命令行參數(shù)argc/argv來處理命令參數(shù)庶诡,由于menu函數(shù)是提供給用戶使用的,它只需要向外提供一個執(zhí)行命令的方法和一個初始化方法咆课。通過將其中的兩個功能變成函數(shù)放在menu.c中末誓,然后在test.c中使用函數(shù)添加節(jié)點扯俱,很好的實現(xiàn)了可重用。
makefile:非常好用喇澡,直接make即可迅栅,不用gcc。不過要注意里面不能用空格晴玖,需要用tab鍵读存。
go語言一些特性
組成:包聲明,引入包呕屎,函數(shù)让簿,變量,語句 & 表達式秀睛,注釋尔当。第一行代碼package main定義了包名,下一行import "fmt"告訴 Go 編譯器這個程序需要使用 fmt 包等等蹂安;文件名以.go結(jié)尾椭迎,不需要gcc編譯,直接go run即可運行藤抡;沒有.h頭文件侠碧,也沒有makefile文件,在將c語言代碼轉(zhuǎn)化為go語言代碼時要注意這些缠黍。
學(xué)習(xí)心得總結(jié)
最大收獲
這半學(xué)期弄兜,跟隨孟寧老師的MOOC高級軟件工程課程,學(xué)習(xí)到了許多的軟件工程方面的知識瓷式。從最初的hello world小程序來熟悉實驗環(huán)境與過程替饿,到最后實現(xiàn)一個可重用的menu小程序,一步一步跟隨孟寧老師的講解進行代碼書寫實際操作贸典,不僅學(xué)習(xí)了代碼書寫的規(guī)范视卢,還了解到了許多代碼書寫的原則,這些對我之后的學(xué)習(xí)和實踐都有著深刻的指導(dǎo)意義廊驼。
線下的實驗是進行g(shù)o語言代碼的書寫据过,將線上實驗的功能進行g(shù)o語言的轉(zhuǎn)換。這又相當(dāng)于重新學(xué)習(xí)了一門新的語言妒挎。所以為了完成實驗绳锅,自己在網(wǎng)上找教程,搭環(huán)境酝掩,了解go語言的基本特性鳞芙,語法,一步一步實現(xiàn)想要的功能。雖然開始起步很艱難原朝,但是完成代碼跑通時還是很有成就感的驯嘱。
線下的課程,老師從一篇谷歌的文章入手喳坠,從中找出很多現(xiàn)在流行的知識點鞠评,例如代碼審查,代碼倉庫丙笋,調(diào)試谢澈,rup等等煌贴,通過同學(xué)分享的形式御板,真的從中學(xué)習(xí)到了許多,拓展了我的知識面牛郑。雖然很遺憾沒有搶到知識點進行分享怠肋,但是自己也做了關(guān)于rup的ppt,學(xué)習(xí)了rup的基本知識淹朋。
學(xué)習(xí)完這門課后笙各,我對軟件開發(fā)有了更深刻的理解。一個好的程序不僅要代碼規(guī)范础芍,可讀性強杈抢,還有就是要可重用。在動手寫一個程序之前仑性,我們要先進行設(shè)計惶楼,重點考慮怎樣可以讓這個程序既實現(xiàn)功能,又美觀诊杆,可讀性強歼捐,同時功能發(fā)生變化時可以進行最少量的代碼更改。我現(xiàn)在意識到晨汹,軟件高于程序豹储,這使我受益匪淺。
最大遺憾
對我來說淘这,最大的遺憾就是課時太短剥扣,沒有進行更深入的了解。課程結(jié)束后我會進行更深入的學(xué)習(xí)铝穷。
最后钠怯,感謝孟寧老師線上線下的課程帶給我的巨大收獲,感謝助教檢查實驗以及給我的建議與指導(dǎo)氧骤。