C#一步一步教你如何去寫面向?qū)ο蟠a
本文以“家庭”為例子,演示如何使用面向?qū)ο笏季S去編寫代碼。
這是一篇文字較多的文章,建議您仔細(xì)閱讀,因?yàn)樗鼘⑼暾故緲?gòu)建一個面向?qū)ο蟠a的過程,當(dāng)然這個思想過程是我個人的過程,每個人有自己思考的方式方法,我的僅供參考。
一、編寫面向?qū)ο螅紫纫獦?gòu)思
構(gòu)思一般隨意,你可以在自己腦海中構(gòu)思,也可以借助專業(yè)的UML來構(gòu)思,又或者借助紙筆構(gòu)思,總之,一切隨意,只要你喜歡。
那么下面這張圖,是我在紙上畫的構(gòu)思:


二、形成你的思路
通過構(gòu)思,你可以慢慢的理清、形成自己的代碼思路。
回到“家庭”這個例子,我當(dāng)時是這么思考的:
家庭,就要有家庭成員,所以,我可能會有一個IMember的接口。
然后我想到家庭成員之間存在一定的關(guān)系,比如父與子、母與子等關(guān)系,于是有了IRelation接口。
接著我就想到了家庭屬性,家庭應(yīng)該是獨(dú)特的,自己的定義,所以就有了Family,有了Family,我就想到了應(yīng)該抽象成IFamily,而IFamily很可能會有家庭名稱、人員列表等屬性或者方法定義。
再然后我回顧之前的思路,想到關(guān)系會有多種類型,它可能會是個枚舉,所以就有RelationTypes枚舉對象。
那有了關(guān)系,可能需要一個關(guān)系管理類來管理它。所以,我就有了RelationManager類。
最后我又思考到了家庭成員,每個成員都有自己的個性。而個性是復(fù)雜,不一定是單一的,比如有些成員好動而熱情,比如爸爸面冷心熱等。于是我想個性應(yīng)該是個具有Flags標(biāo)簽的枚舉,允許一個成員具有多重個性。
三、檢查回顧,并理解你的需求是否滿足
我們在工作中,對于一個功能開發(fā)項(xiàng),它首要保證的是實(shí)現(xiàn)業(yè)務(wù)需求,所以,我們在做了簡單的建模后(構(gòu)思即是建模的過程),需要結(jié)合實(shí)際,看是否滿足需要。
那么我們看“家庭”這個例子,由于我是舉例子,所以它目前的簡單建模可能是正確的。暫時也不需要加其它的需求了。
但現(xiàn)在覺得沒有問題的建模,在實(shí)際編寫代碼后,可能會面臨實(shí)際項(xiàng)目中,我們尚未考慮到的點(diǎn),這時就需要不斷迭代建模。直到你的思維準(zhǔn)確為止。
四、關(guān)于對象的方法或者屬性
我個人的習(xí)慣是簡單建模出整體框架后,就開始寫代碼了。
可能有的人,做事較為細(xì)致,在構(gòu)建階段,就會想要事先定義好每一個對象的方法或者屬性,這也是可以的。看您習(xí)慣和喜歡。
五、編碼,我們先寫關(guān)系代碼
1.先定義成員關(guān)系接口


2.定義成員關(guān)系類型的枚舉


3.定義關(guān)系創(chuàng)建接口


這里要稍微注意下,這與我的簡單建模規(guī)劃的關(guān)系思想有些不同,增加了關(guān)系創(chuàng)建接口。所以說,我們在實(shí)際編碼過程中,針對業(yè)務(wù)的情況會有偏移,需要進(jìn)行重構(gòu)建模。
4.定義成員關(guān)系接口的實(shí)現(xiàn)類


這里要特別注意的是,我這里將實(shí)現(xiàn)類定義成internal,這就意味著,除了我們自己外,外部調(diào)用我們api的人,也就是外部程序員引用我們的dll的話,是無法直接new一個Relation對象的,因?yàn)槲覀儼阉x成了內(nèi)部類。這樣就可以規(guī)范外部調(diào)用者的行為,指定了他如果想要實(shí)例化這個Relation類的話,必須通過其它途徑來實(shí)現(xiàn)。
5.定義關(guān)系創(chuàng)建類


這個就是別人想要創(chuàng)建關(guān)系時,所必須通過的途徑。因?yàn)樗麩o法實(shí)例化Relation類,只能通過我的RelationBuilder對象的Create()方法來創(chuàng)建,這就規(guī)范了使用我們api的人的行為。
六、編碼,我們編寫家庭成員和個性的代碼
1.家庭成員的接口定義


我們會看到家庭成員接口只定義了全名和性別2個屬性,但是家庭成員是有個性的,為什么不放在一起寫呢?這就是面向?qū)ο蟮慕涌诟綦x原則,你可以參考我的前面文章,有一篇單獨(dú)講“接口隔離原則”的。
2.家庭成員的個性枚舉,注意個性是多重的,所以,我們的枚舉要定義成Flags


3.然后我們定義一個家庭成員的個性接口


4.最后,我們來定義家庭成員的實(shí)現(xiàn)類Member.cs


注意看這個成員實(shí)現(xiàn)類,它實(shí)現(xiàn)了兩個接口,分別是IMember和ICharacter。我們定義了它的構(gòu)造函數(shù),帶有fullName和sex兩個參數(shù),所有public的公開屬性都是只讀的,這意味著別人只能訪問而無法修改。開放了設(shè)置個性的方法SetCharacter()。
好了,由于篇幅很長了,所以,關(guān)于家庭的接口,我就不再繼續(xù)寫了。相信你通過上面兩個例子,也已經(jīng)學(xué)會了,如何去編寫面向?qū)ο蟮拇a思路了。
如果你能學(xué)會并運(yùn)用這個思路,那么我很為你高興。