1. 程式人生 > >基於軟體工程的程式碼設計問題

基於軟體工程的程式碼設計問題

       本學期我們進行了軟體工程的學習工作,其中一項內容就是重新對C語言就行學習,通過這一系列的作業,在軟體工程領域中對程式碼的編寫有了全新的認識。

       最開始我對於程式碼的理解就是對於演算法的完成,函式的呼叫,甚至於沒有一個清晰的模組的概念,但是隨著課程的加深,特別是在軟體工程這門課上我逐漸對於軟體系統的瞭解,明白程式碼只是軟體的血肉,骨架在於架構的設計,而軟體工程作為一個整體需要平衡的是各方面的關係(Availability,Modifiability,Performance,etc)所以這就導致了程式碼的存在性從我們最開始的程式設計師眼中的全部性漸漸地向軟體工程的全域性性轉變。我們編寫的程式碼不是給我們一個人看到的,最基礎的要能讓其他人看懂(所以各門語言都統一了自己的規範並且我們添加了自己的註釋),通過課程的學習。我們發現在軟體工程的建立過程中,我們更強調模組化

的思想。這就回到了最初我的思想,在一個int main()函式中可以做到的一件事情,我們現在需要將裡面的函式分離出來變成各個模組,甚至於原來 printf("XXX") 一行程式碼就可以完成的功能我們現在也需要將其變成函式void show():現在我逐漸明朗在軟體工程中程式碼的編寫只是功能實現的基礎,在此之上我們還要進行橫向(新增功能)以及縱向(完善功能)的拓展,而擴充套件的本人並不一定是你,所以在別人使用你的程式碼時可以清楚的看出每個函式,每個模組的用途,這樣有利於整個軟體體系的構建,增強了其中的Usability。

       然後僅僅有模組化對於整個程式碼設計來講是遠遠不夠的,拋去隱藏函式資訊,建立通用模組等細節技巧,我在軟體工程中還學到了另一個重要的程式碼特性:靈活性

。或許最初我們只認為程式碼就是程式碼,寫好之後編譯執行,出現bug之後進行除錯就可以了,但是在大專案中這些事不存在的,程式碼量之大,分支之多絕非一人能夠搞定,要不也不會出現運維或者軟測團隊。如今的程式碼講究的是靈活性,軟體工程可以深切的表現出它的這個性質。比如說工程的構建很多現在都是螺旋式併發的,需要不斷地與客戶互動並且新增上新的功能,這對於程式碼的靈活性來講是很重要的,舉一個很簡單的例子,我們需要設定一個Menu,最開始我們設定一個數組,然後在其中寫入我們需要的cmd,desc,但是陣列可能設定的過大,浪費 了記憶體,所以我們理應從靜態的Menu改變成動態的陣列模樣,所以我們使用了連結串列的功能,不斷的設定新的結點然後新增data進去,這是一個比較傳統的好方法,不浪費資源,使用動態指標完成了Menu的編輯工作。但是到後來我們並不滿足動態連結串列的構成,因為資料是在建立連結串列時儲存在結點中的(在建立initMenu函式中新增資料進去),我們希望在程式碼中可以手動的輸入每個新的Menu結點,這時我們在動態建立Menu的時候添加了引數int argc,char argv,使用傳參的做法我們可以在執行程式碼時輸入每個結點的cmd和desc,使得Menu的構成方式更加健壯。從這個例子中我們可以看出在Menu的構建方面程式碼的使用越來越靈活,雖然說程式碼實現的功能沒有改變,但是在實現的手段上越來越智慧,或者說更人性化,符合我們的思維方式。以上是我對於軟體工程中C語言程式設計的一些總結,接下來會從6次作業中逐一談談每次收穫的知識。

       https://www.shiyanlou.com/courses/reports/1244462 第一次作業我們進行了簡單的hello world的程式碼編寫工作,其中的重點在於讓我們熟悉linux下的環境,也是在這幾次的實驗中我學會了一些基礎的linux命令列以及git命令。從老師文件中提及的mkdir,git push等命令到後來自己能夠掌握git diff,git merge,nohup等,我逐漸的發現對於命令列掌握的越熟練那麼對於程式碼的管理與編輯上越方便,所以想要寫好程式碼,對於終端的掌握十分重要。

       https://www.shiyanlou.com/courses/reports/1245153 第二次作業要求寫出具有實驗命令的小程式,要求實現多功能的執行動作,大多數人用的是strcmp(cmd,XXX),然後呼叫某個函式,我選擇了基於linux終端上的getpwuid(getuid())函式,通過函式本身的性質可以呼叫linux系統中的函式。

       https://www.shiyanlou.com/courses/reports/1245714第三次實驗我們採用了模組化的思想,將一個函式分成了linklist.h,linklist.c,menu.c三個部分來描寫,具體的是menu.c呼叫linklist.c中的函式,而linklist.c中的Node呼叫了標頭檔案linklist.h中的struct Node,本次實驗的函式十分有邏輯,一層一層的呼叫。系統被抽象成兩個層級:選單業務邏輯和選單資料儲存。另外在說一下本次實驗是在十一的時候提交的,之前老師有說過十一作業是推遲一週的,結果我就沒看網易雲課堂打算下週再交作業了,結果發現10月3號的作業還是需要提交的,而十月10號左右的作業不需要提交,我本以為延遲的是十一這一週結果延遲的是下一週,導致一次作業加評論沒有提交,希望通過這次對於6次實驗的總結,能夠讓老師看到我寫的作業,並不是當初沒有完成啊0.0

        https://www.shiyanlou.com/courses/reports/1246256 第四次作業在我看來是最難的,任務量也最繁重,我們在這次實驗中添加了連結串列,通過連結串列對Menu進行操作,包括Init,delete,add,getnextNode等等函式,並且添加了大量的指標操作,這使得程式碼表述上增加了許多的困難,比如說initMenu函式,最後AddLInkTableNode設定下一枚結點,但實際上結點並沒有真正的指向誰,可以說程式能不能執行全憑指標自己的意志,在借鑑之前提交報告同學的程式碼時發現也不能很好的執行程式,比如命令只是能從help開始執行,而從中間結點的命令執行時也總是出錯,既然指標指向不對,就需要將每一部分的指標,比如pNext=NULL編寫出來,這個是最要的,每一次新建的結構體的指標,必須要初始化。

       https://www.shiyanlou.com/courses/reports/1246941 第五次作業中我們主要學習了callback機制,這在軟體工程中也是很重要的一部分,也算初步體現了函式靈活性的一面,在main函式中呼叫某個庫函式時,需要先使庫函式對某個函式進行呼叫,這種多層呼叫的關係缺少一層都是不完整的,而通過登記不同的回撥函式,使得每次呼叫都有不同的功能發生,有點類似於C++的多型性質,極大的增加了函式的靈活性。

檔案,再次細分了整個函式的模組,而函式中對於int argc,char argv的引用,讓使用者對於Menu選單的使用更加方便,可以通過修改函式或者直接手動輸入新的結點資訊。在本次實驗中我們還進行了巨集命令的學習,連編譯過程我們都可以簡化以makefile的形式展現出來。

       綜上所述,在本次網路課程中,我們所要進行的函式功能並未發生改變,只是從結構上,從靈活性方面加深了對其的呼叫,這也是軟體工程(c語言程式設計)的目的所在,讓我們在短時間內能夠了解模組化思想,靈活的處理各種問題。

       學習軟體工程最大的收穫就是學會了模組化思想這一點,這對於程式設計師本身來講算是一種質的飛躍,從拘泥於一小點的程式碼編輯躍升至站在整個工程的角度去看問題,這種收穫無疑是巨大的。而想要去加深這種思想,我們還需要不斷的練習,在程式編寫過程中以模組化思想為中心來思考,設計問題。自己在課程中也存在著許多的不足與遺憾,由於自己來的比較晚課堂上總是佔不到最前面的座位,有時孟寧老師講的畫在黑板上的結構與程式碼無法及時的理解,只能課後再進行總結。而下半學期孟寧老師的網路程式設計沒有選到,無法跟著老師繼續學習,聽不到一些獨到的見解與語錄,算是本次實驗最大的遺憾吧!在課後作業方面,有時知道某個函式的寫法並不是最好的但是卻不想去修改,或者設計某個指標時想去指向其他地方看看會出現什麼錯誤等等,自己也沒有花費時間進行深入的研究,在以後的課程學習中我一定要再多花費時間對於程式碼的整體設計方面多進行探討!