? ? ? 歡迎加入【iOS/Swift/OC開發(fā)交流群|127183325】交流學(xué)習(xí)
? ? ??上篇主要介紹了三層中的數(shù)據(jù)持久層,這一篇來詳細(xì)說一下剩下的兩層:業(yè)務(wù)邏輯層和表示層。
業(yè)務(wù)邏輯層相對(duì)于其他兩層來說更能體現(xiàn)整個(gè)項(xiàng)目的擴(kuò)展性和可伸縮性,這一層對(duì)表示層和數(shù)據(jù)持久成起著承上啟下的作用,由于表示層的變動(dòng)比較頻繁,所以業(yè)務(wù)邏輯層需要精心的設(shè)計(jì),以便能夠承載將來的業(yè)務(wù)需求的頻繁變化。
下圖是業(yè)務(wù)邏輯層功能模塊的劃分。

? ? ? AppManager是一個(gè)單例,它在這一層是一個(gè)比較特殊的存在,也是一個(gè)挺不好的設(shè)計(jì),違反了單一職責(zé)原則。AppManager功能比較雜亂,既承擔(dān)了部分Controller的跳轉(zhuǎn)的功能,又承擔(dān)了部分模塊的初始化,還有一些通知轉(zhuǎn)發(fā)的功能。這個(gè)類需要在以后的版本中重新設(shè)計(jì),盡量避免設(shè)計(jì)出類似的“上帝類”。
? ? ? 業(yè)務(wù)邏輯層的模塊是按功能來劃分的。例如,用戶相關(guān)的注冊(cè)登陸和用戶信息的修改都屬于User模塊,遠(yuǎn)程遙控相關(guān)的屬于RemoteControl模塊,文件傳輸相關(guān)的屬于FileTransfer模塊,網(wǎng)絡(luò)視頻語音屬于VOIP模塊,等等。模塊和模塊之間是相對(duì)獨(dú)立的,盡量避免模塊之間的相互訪問,這樣可以減少模塊間的耦合度,需求發(fā)生改變的時(shí)候不至于產(chǎn)生大范圍的影響。
? ? ? ?相關(guān)的數(shù)據(jù)模型是進(jìn)行上下兩層數(shù)據(jù)流動(dòng)的載體。業(yè)務(wù)邏輯層將表示層的相關(guān)請(qǐng)求進(jìn)行消化處理,封裝成對(duì)應(yīng)的數(shù)據(jù)模型,在對(duì)這些數(shù)據(jù)進(jìn)一步處理后傳到數(shù)據(jù)持久層進(jìn)行處理。使用數(shù)據(jù)模型可以對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行規(guī)范,也為將來的擴(kuò)展做好準(zhǔn)備。拿User數(shù)據(jù)模型來說,剛開始User的屬性較少,有登陸必須的昵稱和密碼。表示層將昵稱和密碼傳給業(yè)務(wù)邏輯層發(fā)起登陸請(qǐng)求后,業(yè)務(wù)邏輯層用表示層的昵稱和密碼創(chuàng)建一個(gè)user對(duì)象,然后對(duì)這個(gè)user對(duì)象進(jìn)行相關(guān)的操作,比如向數(shù)據(jù)持久層發(fā)起數(shù)據(jù)持久化的請(qǐng)求。項(xiàng)目進(jìn)行一段時(shí)間后,產(chǎn)品經(jīng)理對(duì)這個(gè)用戶進(jìn)行了一些擴(kuò)展,比如增加用戶的性別,年齡等等,如過不用數(shù)據(jù)模型的話,我們可能會(huì)在所有用到用戶信息的地方增加這些新增的屬性,而數(shù)據(jù)模型,只要在user類里增加相應(yīng)的屬性就可以了,極大的方便了以后需求的更改。另外,使用數(shù)據(jù)模型還有一個(gè)好處,就是在使用某一個(gè)屬性的時(shí)候用點(diǎn)語法就可調(diào)用,還可以添加注釋,標(biāo)識(shí)當(dāng)前的屬性的用途。
? ? ? ?在設(shè)計(jì)這一層的時(shí)候,1.0版本和2.0版本有很大的差別,主要就在Block和Delegate的選擇上。1.0版本更多的使用了Block,2.0版本用的Delegate比較多,關(guān)于這一塊是怎么來選擇的會(huì)在后面專門拿出一部分來說,這里還是重點(diǎn)說一下項(xiàng)目分層相關(guān)的。但是,請(qǐng)記住,這兩者不能完全相互替代對(duì)方,個(gè)有個(gè)的優(yōu)越點(diǎn),算是相互補(bǔ)充吧。
下面是模塊和視圖的一個(gè)對(duì)應(yīng)關(guān)系。

? ? ? ?可以看出,如過各模塊之間的耦合度能盡量的低的話,我們?cè)谛枨蟾淖儠r(shí),功能模塊的增減修改時(shí)會(huì)很方便,業(yè)務(wù)邏輯層的伸縮性和擴(kuò)展性比較好。另外,業(yè)務(wù)邏輯層和表示層使用了Delegate進(jìn)行解耦,使得業(yè)務(wù)邏輯層的可移植性保持的比較良好。這在2.0版本的時(shí)候就可以看出來,如過沒有對(duì)這一層的重構(gòu)的話,這一層是可以直接拿來用的,需要修改的僅僅是表示層。
? ? ? ?最后是表示層,這一層沒有什么特別要說的,因?yàn)楸硎緦邮亲兓顭o常的一層,產(chǎn)品需求的更改最終的體現(xiàn)就是視圖交互的更改。但也不是說表示層就可以隨意設(shè)計(jì)了,我們還是要遵守單一職責(zé)原則和最少知識(shí)原則。單一職責(zé)原則,意思是在進(jìn)行自定義控件的時(shí)候盡量讓控件只做它應(yīng)該做的事情;最少知識(shí)原則意思是對(duì)內(nèi)要高內(nèi)聚,對(duì)外要低耦合,功能的實(shí)現(xiàn)過程對(duì)調(diào)用它的對(duì)象來說是透明的。這樣我們就能盡可能的對(duì)代碼進(jìn)行復(fù)用,而不用重復(fù)的實(shí)現(xiàn)類似的功能。