簡介
本篇博客記錄了我在軟件工程學習過程中關于軟件需求與面向對象基礎知識的學習體會和要點總結。博客共分為三個關卡內容:第1關圍繞“軟件需求”的定義、分類及分析過程展開,讓我清晰地理解了功能性需求、非功能性需求與約束條件的區別;第2關深入探討了如何構思有創意的軟件需求,包括技術、思想、素材和用戶視角的多維思考;第3關則介紹了面向對象軟件工程的基本思想、產生背景及核心概念,如類、對象、繼承、多態、消息傳遞等。通過這三關的系統學習,我不僅夯實了軟件開發中前期需求分析的基礎,還初步理解了面向對象建模與設計的邏輯,對后續學習UML、用例建模等內容產生了濃厚興趣。本文旨在梳理知識點,加深理解,供今后復習與項目實踐參考。
第1關:軟件需求
任務描述
本關任務:了解軟件需求的內涵和軟件需求分析的任務,掌握軟件需求的分類,完成相應的選擇題。
相關知識
何為軟件需求
獲取和分析軟件需求是軟件開發的前提,只有明確了軟件需求,后續的軟件設計與建模、代碼編寫與測試等軟件開發活動才有基礎和依據,因而需求獲取和分析在整個軟件開發過程中發揮著前導性、關鍵性的作用。
軟件需求是指軟件系統的利益相關者對軟件系統的功能、質量等方面,以及軟件系統在運行環境、資源消耗、提交進度等方面的期望和要求。具體表現為兩個方面:
(1)功能性需求
用戶對軟件系統能夠完成何種功能以及在某些場景下軟件系統能夠展現何種外部可見行為或效果的要求。
(2)非功能性需求
用戶對軟件系統的質量屬性、運行環境、資源約束、外部接口等方面的要求,包括:運行性能、可靠性、易用性、安全性、對外接口、可維護性等等。
軟件需求通常來自于軟件系統的利益相關者,在空巢老人智能看護系統中,利益相關者為老人及家屬,他們提出了具體需求;但是軟件工程師也可代表用戶來構思和提出需求,比如微信、12306 等 app,是由軟件工程師代表用戶提出需求。
軟件需求的類別
軟件需求的類別可以分為三類:
功能(Functional)
能夠完成的功能及在某些場景下可展現的外部可見行為或效果。示例:自主跟隨老人、獲取老人圖像和視頻信息、檢測老人是否摔倒等;
非功能(Non-Functional)
軟件系統在質量屬性、運行環境、資源約束、外部接口等要求。示例:性能、可靠性、易用性、安全性、接口、可維護性等;
約束(Constraint)
成本、進度、技術選型、標準和規范等要求。示例:如成本不能超出 50 萬元,要求半年內交付使用等等。
軟件需求分析的任務和過程
軟件需求獲取和分析的任務是,通過與用戶的溝通和交互,獲得用戶關于軟件系統的期望和要求,即軟件需求;在此基礎上對軟件需求進行建模和分析,產生準確、一致、直觀、可視化的軟件需求模型,并在此基礎上形成規范化的軟件需求文檔。軟件需求獲取和分析的過程如圖 1 所示,它包含以下三項軟件開發活動。
圖1 軟件需求分析的過程
作答要求
根據相關知識,按照要求完成右側選擇題任務。作答完畢,通過點擊“測評”,可以驗證答案的正確性。
題目
1、
軟件需求的類別不包含以下哪類?
A、功能性
B、可靠性
C、非功能性
D、約束
答案
B
思考
案例分析:12306訂票系統的需求分類
功能性需求:用戶可以注冊、登錄、查詢車票、預訂車票、在線支付、取消訂單等。
非功能性需求:系統需支持高并發訪問(春運期間)、提供良好的界面交互體驗、安全性保障(如短信驗證碼、實名認證)、操作簡單易懂。
約束性需求:系統必須接入國家支付平臺、每天凌晨進行系統維護、部署在政府指定數據中心,開發周期不得超過6個月。
軟件需求規格說明書(SRS)模板結構簡要
引言:描述項目背景、目標、術語解釋
總體描述:系統環境、用戶特征、約束條件
功能需求:詳細列出系統必須具備的功能模塊
非功能需求:性能、安全性、可維護性等
外部接口:數據庫、硬件、軟件等接口描述
附錄:相關參考資料、術語表等
第2關:軟件需求構思和創意
任務描述
本關任務:了解構思軟件需求的背景以及什么是有創意的軟件需求,掌握如何構思有創意的軟件需求,完成相應的選擇題。
相關知識
構思軟件需求
在軟件開發時,常常會遇到這樣的問題:
想開發一個軟件系統,但是沒有明確的利益相關者;
有明確利益相關者,但是找不到這樣的用戶能夠提供需求。
比如微信、QQ 在開發時,雖然有明確的利益相關者,但是用戶其實也不清楚自己的需求,不能夠提出明確的需求。
這時候需要軟件開發人員擔任用戶的角色,構思和導出待開發軟件系統的需求,微信軟件系統的需求就是由微信開發團隊提出的。
正是在這樣的背景下,產生了構思軟件需求,具體內容為:明確軟件系統欲解決的應用問題及其潛在的用戶,通過對相關應用領域的調研和分析以及與軟件系統目標用戶的溝通和交流,明確用戶的期望和要求,獲取軟件系統的需求。在某些情況下(如暫時找不到合適的目標用戶),軟件開發人員可代表用戶來構思軟件系統的需求。該活動的輸出是用自然語言描述的軟件需求。
構思有創意的軟件需求
在構思軟件需求時,需要有創意,才能帶來價值:
創意帶來新產品
創意帶來用戶
創意帶來市場和利潤
創意帶來發展
那么什么樣的需求才有創意?
創意基于欲解決的問題,產生基于計算機軟件的解決方法,能夠展示有價值、獨特性、新穎性、有效性等特征。
有創意軟件的特點通常有以下幾點:
創意來自于欲解決的新穎問題(Needs)
創意來自于解決問題的獨特方式(Approach)
創意來自于給用戶帶來的好處(Benefits)
創意來自于你強于對手(Competitors)
空巢老人智能看護系統屬于有創意的軟件需求,因為其符合以下兩點特征:
欲解決的問題有價值。看護老人已經成為一個全社會迫切解決的問題,對老人、家屬、醫院等都有實際的需求;
解決方法的新穎性和獨特性。傳統上人們需要依靠保姆、家人等來看護老人,現在通過計算機軟件以及相應的信息系統(包括機器人和智能手機等)來解決這一問題。
如何構思和創意軟件需求
想要構思有創意的軟件需求,可以從如下幾個方面著手:
突發奇想,奇思妙想。根據用戶的新期望或者不經意的討論,發現新的問題和應用;
技術層面的創意。利用新技術,或者集成和綜合多項技術來解決問題;
互聯網大眾的想法。根據開源社區中大眾的建議和問題,拓展思路;
思想。思維活躍,思路開放,開闊視野,不拘泥于現實;
素材。既要留意當前學習、生活和工作中的方方面面,并從中尋找有意義、有價值的應用問題和需求,也要著眼于未來構思未來的問題及需求;
方法。既要了解和掌握現有問題的解決方法和手段,也要敢于現象如何借助于以計算機軟件為核心的信息系統來解決問題;
開展調研分析,切忌拍腦袋憑空想問題。查詢文獻資料,了解狀況需求,分析已有技術和產品,掌握現有方式方法,形成對問題及解決方法理解和判斷,做到有理有據,進行縝密論證;
不斷反復論證,切忌不切實際的想象。構思須進行反復的思考、推敲、研究和論證,放棄不現實不切實際問題,深化有價值、有意義、可實現的問題;
尋求有意義、有價值的問題。確保所提出的問題有現實意義,對用戶有價值。
持續深化、改進和提高。進行反復討論,尋求創意點,發現潛在問題,調整關注點,不斷進行權衡和折中,分析可行性等等。
構思有創意的軟件需求,最終產生的的軟件制品為:
軟件需求構思和創意文檔(文檔)
軟件需求模型(模型)
軟件需求規格說明書(文檔)
作答要求
根據相關知識,按照要求完成右側選擇題任務。作答完畢,通過點擊“測評”,可以驗證答案的正確性。
題目
1、
有創意軟件的特點通常有哪些?
A、創意來自于欲解決的新穎問題
B、創意來自于解決問題的獨特方式
C、創意來自于給用戶帶來的好處
D、創意來自于你強于對手
答案
ABCD
思考
創意案例:校園跑腿服務平臺
背景問題:學生經常忙于上課或天氣不便出門
創意功能:拍照下單(上傳代辦清單)、地圖智能派單、訂單跟蹤、微信通知提醒
受眾用戶:高校學生、宿舍管理員
非功能性亮點:支持微信小程序、實時定位追蹤、評分機制增加信任度
?用戶調研與需求來源
設計一份調研問卷(可用問卷星):
“您是否經常因天氣、課程原因需要他人幫忙代買物品?”
“您更傾向于通過什么方式發出代辦請求?”
第3關:面向對象軟件工程基礎
任務描述
本關任務:了解面向對象軟件工程的產生背景及基本思想,掌握面向對象的基本概念,完成相應的選擇題。
相關知識
產生背景
在面向對象軟件工程產生之前,人們通常采用結構化軟件工程的方法來開發軟件。結構軟件工程包括結構化需求分析、結構化軟件設計、結構化程序設計等。具體內容如下:
結構化需求分析采用諸如數據流圖等技術來表示和分析軟件需求;
結構化軟件設計采用層次圖、模塊圖等技術來描述軟件設計模型;
結構化程序設計則借助于過程、函數等程序設計機制及相應的語言(如C、Pascal等)來編寫程序代碼。
結構化軟件工程采用不同的模型、語言、機制等來描述軟件需求、建立設計模型、構造程序代碼,這就意味著軟件開發的不同階段需要采用不同的抽象來對軟件系統進行建模,從而建立起基于不同抽象的軟件模型,任何的軟件開發活動(無論是需求分析、軟件設計還是程序設計)都需要解決不同模型之間的轉換和精化問題,無疑這極大增加了軟件開發的復雜性,難以應對大規模、復雜軟件系統的開發。存在的問題及局限如下:
問題模型(即需求模型,如數據流圖)與現實世界不一致,導致需求模型不自然、不直觀、難以理解;
解模型(即設計實現模型,如模塊圖)與問題模型不一致,導致需要進行轉換,帶來開發的復雜性;
模塊粒度較小,封裝程度不高,可重用性不好。
因此,對軟件工程提出了新的要求:
用貼近現實世界的抽象來表示軟件系統的需求,建立起更為自然和直觀的需求模型。
采用相同的抽象來表示問題模型和解模型。減少從需求到設計的概念鴻溝,縮減問題空間與解空間的距離;實現自然、平穩過渡,簡化在二者間架設“橋梁”的工作。
提供更大粒度的封裝,以更好地支持軟件重用,更好地體現模塊化、高內聚度低耦合度、信息隱藏原則。
在這樣的背景下,面向對象軟件工程應運而生,以解決結構化軟件工程的內在不足和存在的局限。
面向對象軟件工程的基本思想
面向對象軟件工程認為,無論是現實世界(應用問題)還是計算機世界(軟件系統),它們都是由多樣化的對象所構成的,這些對象之間通過一系列的交互來展示行為、實現功能和提供服務。軟件開發人員可以面向對象軟件工程所提供的對象、類、屬性、操作、消息、繼承等概念來表示現實世界的應用,從而建立起軟件需求模型,描述軟件系統的需求,也可來表示計算機世界的軟件系統,從而建立起軟件模型,描述軟件系統的解決方案。
面向對象分析
將軟件系統的需求,尤其是功能性需求,表征為問題域中對象的方法以及它們之間的協作,也即借助于面向對象軟件工程所提供的核心概念來表示應用系統的組成、功能、行為等等,進而建立起軟件系統的需求模型。
例如,通過對象、類等來描述和分析應用系統的構成,借助類的方法來描述和分析應用系統的行為,利用消息機制來分析多個對象之間如何通過協作來提供功能和服務。一般地,面向對象分析將產生若干基于面向對象概念的軟件需求模型,如用例模型、交互模型、分析類模型等等。
面向對象設計
根據面向對象的需求模型,結合編程實現的約束與限制(如所采用的面向對象程序設計語言等),對目標軟件系統進行設計,給出實現軟件需求的解決方案。面向對象的軟件設計仍然借助于面向對象核心概念,從不同層次、不同的視點描述軟件設計模型。
例如,目標軟件系統整體上由哪些子系統、構件和包等構成,每個子系統和構件內部包含哪些類、每個類封裝了哪些屬性和方法、不同對象之間如何通過消息傳遞來進行協同,從而來實現軟件系統的功能等等。不同于結構化軟件設計,面向對象設計是通過對面向對象需求模型進行不斷精化(而非模型轉換)而得到的。一般地,面向對象設計將產生若干軟件設計模型,如軟件體系結構模型、軟構件模型、設計類模型、交互和協作模型、狀態模型等等。
面向對象編碼
根據軟件設計模型,采用特定的面向對象程序設計語言(如 C++、Java、Python 等等),編寫目標軟件系統的程序代碼。軟件設計模型中的相關設計元素將直接用程序設計語言所提供的編程元素和機制來加以實現。
面向對象的基本概念
面向對象軟件工程提供了一組有別于結構化軟件工程的概念和抽象來支持系統的分析、建模、設計、實現和測試。具體地,這些概念描述如下。
對象(Object)
它是對現實世界和計算機世界中個體、事物或者實體的抽象表示。例如,可以用對象表示應用領域的一個事物(如NAO機器人),也可以用它來表示在計算機軟件中的某個運行元素或單元(如運行實例)。每個對象都有其屬性和操作。屬性表示對象性質,屬性的值定義了對象的狀態;操作也稱方法,表示對象所能提供的服務,它定義了對象的行為。一般地,對象的屬性只能由該對象的操作來存取或修改。
類(Class)
顧名思義,類是一種分類和組織機制。它是對一組具有相同特征對象的抽象。通俗地講,通過類可以對不同的對象進行分類,將具有相同特征的對象組織為一類。所謂的相同特征是指具有相同的屬性和方法。每個類都封裝了屬性和方法。對象是類的實例,類是創建對象的模板,也即可以根據類模板來創建一個個具體、具有多樣狀態的對象。基于某個類創建一個對象后,那么該對象就具有這個類所封裝的屬性和方法。相比較而言,類是靜態和抽象的,對象是動態和具體的。
消息(Message)
消息是對象間進行通信的手段,也是一個對象與另一個對象進行交互和協作的方式。一個對象通過向另一個對象發送消息,從而來請求相應的服務。當一個對象發送消息時,它需要描述清楚接收方對象的名稱以及所請求方法的名稱及參數。對象之間的消息可以是同步消息,即請求者對象需要等待響應者對象的處理結果;也可以是異步消息,即請求者對象發出消息后繼續自己工作,無需等待響應者對象返回結果。
繼承(Inheritance)
繼承描述了類與類之間的一般與特殊關系。它本質上是對現實世界不同實體間遺傳關系的一種直觀表示,也是對計算機軟件中不同類進行層次化組織的一種機制。一個類(稱之為子類)可以通過繼承關系來共享另一個類(稱之為父類)的屬性和方法,從而實現子類對父類屬性和方法的重用。當然,子類在共享父類屬性和方法的同時,也可以擁有自己獨有的屬性和方法。繼承既可以表現為單重繼承,即一個子類至多繼承一個父類,也可以表現為多重繼承,即一個子類可以繼承多個父類。
多態(Polymorphism)
多態是針對方法而言的,它是指同一個方法作用于不同的對象上可以有不同的解釋,并產生不同的執行結果。換句話說,同一個方法雖然其操作名稱和接口定義形式相同,但是該方法在不同對象上的實現形態不一樣。因此,當一個對象給若干個對象發送相同的消息時,每個消息接收方對象將根據自己所屬類中定義的這個方法去執行,從而產生不同的結果。
覆蓋(Override)
一個子類可以通過繼承來獲得父類的屬性和方法。然而,子類也可以在自己的類中增加或者重新定義所繼承的屬性和方法,從而用新定義的屬性和方法來覆蓋所繼承的、來自父類中的屬性或方法。示例代碼如下:
public class A{String name;public String getValue(){return “Value is:” + name;} ? ? ? ? ? ??}
public class B extends A {String address;public String getValue () {return “Value is:” + address; ? ?}}
可以看出,子類 B 重新定義所繼承的方法 getValue。
重載(Overload)
一個類中允許有多個名稱相同但是參數不同的方法。由于這些方法在具體的參數數目及類型上有所區別,因而系統將根據接收到消息的實參來引用不同的方法。示例代碼如下:
Public class A {int age;String name;public void setValue(int agePara){age = agePara;?}public void setValue(String namePara){name = namePara;}
}
關聯(Association)
關聯描述了類與類之間的關系,它具有多種形式,如聚合(Aggregation)、組合(Composition)等等。聚合和組合均刻畫了類與類之間的部分-整體關系,即部分類的對象是整體類對象的組成部分,或者說整體類對象由部分類對象所組成。相比較而言,聚合描述的是一種簡單的整體部分關系,而組合刻畫的是一種更為特殊的整體部分特殊關系,它更加強調整體類對象和部分類對象之間的共生關系。
示例
聚合關系:老師與大學
組合關系:校長與大學
作答要求
根據相關知識,按照要求完成右側選擇題任務。作答完畢,通過點擊“測評”,可以驗證答案的正確性。
題目
1、
一個類(稱之為子類)不可以通過繼承關系來共享另一個類(稱之為父類)的屬性和方法。
A、對
B、錯
答案
B
思考
UML類圖實例:圖書管理系統
類1:Book
屬性:書名、作者、ISBN、庫存量
方法:借出、歸還、查看信息
類2:User
屬性:用戶名、學號、借閱記錄
方法:借書、還書、查詢借閱情況
類3:Admin
屬性:賬戶、權限等級
方法:添加圖書、刪除圖書、查看庫存
類之間關系:
User → 借閱 → Book (關聯)
Admin → 管理 → Book(聚合)
面向對象核心概念代碼示例
class Book {String title;String author;void borrow() {System.out.println("已借出:" + title);}
}class Student extends User {@Overridevoid borrowBook(Book book) {System.out.println("學生借書:" + book.title);}
}
總結
通過本次關于軟件需求與面向對象軟件工程基礎的學習,我深刻認識到“需求”是整個軟件開發流程中的核心與起點。只有明確、規范地獲取并分析用戶需求,后續的設計、開發和測試才有明確的方向。特別是在第2關中,構思有創意的軟件需求讓我認識到,軟件開發不僅僅是寫代碼,更是解決實際問題的過程,需要不斷洞察用戶的潛在需求。第3關的面向對象知識為我搭建了一個認識軟件世界的新視角,理解了類與對象的映射關系,也逐漸明白了封裝、繼承、多態等原則在實際系統設計中的意義。整個學習過程內容結構清晰、邏輯緊密,為我后續學習軟件工程建模方法、面向對象分析與設計等內容打下了堅實基礎。同時,我也意識到,理論學習和實際應用需要相互結合,只有在項目中不斷實踐,才能真正掌握并應用這些知識。