面向協(xié)議的編程:
https://realm.io/cn/news/appbuilders-natasha-muraschev-practical-protocol-oriented-programming/
思考:大型工程,大型公司的結(jié)構(gòu)和框架是咋樣的,現(xiàn)實(shí)生活中的例子有沒有?中共是如何組織協(xié)調(diào)事務(wù)的。各個(gè)部門的職責(zé)是什么,應(yīng)該做什么,不應(yīng)該做什么。部門之間時(shí)怎樣協(xié)調(diào)工作的? ?我們平常簽署的協(xié)議有什么好處和壞處。
原則:用清晰的框架架構(gòu),和明了的表達(dá)使得程序APP具有可讀性,可維護(hù)性,以及可擴(kuò)展性。
問題:結(jié)構(gòu)清晰嗎
(1)多人可以協(xié)同工作嘛。
(2)可插拔,可替換嗎?易于修改,維護(hù)嗎?
(3)可讀性強(qiáng)嗎
(4)易于寫測(cè)試代碼嗎
方法:
(1)少用繼承,多用協(xié)議(面向接口編程)和category。想想我們?nèi)粘I钪信c人打交道,特別是陌生人,如果有一份協(xié)議,就可以免除許多的誤會(huì)。eg,租房賣房協(xié)議,這樣彼此就清楚了自己和對(duì)方的責(zé)任和義務(wù)。如果有個(gè)麻煩,找協(xié)議就可以了。因?yàn)檫@是雙方協(xié)定好的。
(2)流水線作業(yè),每個(gè)類,方法只做一件小小的,獨(dú)立的事情。專業(yè)的人做專業(yè)的事情,不要越權(quán),管閑事。如果需要調(diào)度,找更高級(jí)的領(lǐng)導(dǎo)。 就像富士康的工人。
(3)分層次,就像http協(xié)議一樣。
(4)各個(gè)模塊不能直接交流通信,如果需要通信,必須找指揮官。
(5)設(shè)計(jì)模式在這里可以發(fā)揮作用嗎。a,業(yè)務(wù)模塊和與之關(guān)聯(lián)的非業(yè)務(wù)模塊,建議使用適配器模型。
需要考慮的事情:業(yè)務(wù),模塊之間使用協(xié)議,接口通信。
業(yè)務(wù)邏輯,非業(yè)務(wù)的事項(xiàng)。各個(gè)模塊提供給其它模塊的,必須是以接口的形式。
問題:模塊可復(fù)用嗎?
? ? ? ? ? ?模塊方便測(cè)試嗎?
? ? ? ? ? 各個(gè)模塊的職責(zé)是什么?模塊之間是怎樣傳遞消息的?

(1)各個(gè)模塊:各個(gè)模塊的角色,模塊之間交流的方式。
模塊定義了兩個(gè)協(xié)議。一個(gè)是模塊接口,它定義了模塊可以做什么;另一個(gè)則是模塊的代理,用來描述該模塊做了什么
特點(diǎn):View模塊和Model模塊無法直接溝通,需要通過ViewController間接的溝通交流。
a,Model Layer:代表了專業(yè)知識(shí)。
Model objects encapsulate the data specific to an application and define the logic and computation that manipulate and process that data
User actions in the view layer that create or modify data are communicated through a controller object and result in the creation or updating of a model object. When a model object changes (for example, new data is received over a network connection), it notifies a controller object, which updates the appropriate view objects.
b,View Layer:代表了視圖。
A view object is an object in an application that users can see. A view object knows how to draw itself and can respond to user actions.
Communication: View objects learn about changes in model data through the application’s controller objects and communicate user-initiated changes—for example, text entered in a text field—through controller objects to an application’s model objects.
c,ViewController Layer:協(xié)調(diào)器
A controller object acts as an intermediary between one or more of an application’s view objects and one or more of its model objects.
MVC模式的缺點(diǎn):好多事情都在ViewController中做了,當(dāng)項(xiàng)目越來越大時(shí)候,VC里面太混亂了。
而對(duì)于View Layer,它顯示需要的數(shù)據(jù)似乎也和專業(yè)知識(shí)不太相關(guān)。
MVVM模式:https://www.raywenderlich.com/74106/mvvm-tutorial-with-reactivecocoa-part-1


相對(duì)于MVC而言,當(dāng)代碼越來越龐雜情況下,ViewController可能太臃腫了。把影響VIew Layer的表示邏輯從 Controller 移出放到一個(gè)新的對(duì)象里,即 View Model。View Model Layer僅僅存放了影響View Layer的視圖邏輯,例如把一個(gè)NSdate轉(zhuǎn)換為@“YY MM RR :SS”格式的數(shù)據(jù)。
MVVM模式缺點(diǎn):數(shù)據(jù)綁定的使用使得Bug很難調(diào)試。因?yàn)閿?shù)據(jù)綁定會(huì)使得一個(gè)位置的bug很快的傳遞到別的地方,要準(zhǔn)確的找到錯(cuò)誤源就不是那么容易的事情。
VIPER模式:我理解的是MVVM模式的加強(qiáng)版,更加細(xì)化責(zé)任。讓不同的,專業(yè)的類負(fù)責(zé)處理具體的事物。https://blog.coding.net/blog/ios-architecture-patterns

View Layer:視圖,負(fù)責(zé)展示view,和接受外部輸入,eg:點(diǎn)擊,觸摸等。
(ViewController指揮官,負(fù)責(zé)調(diào)度)
Interactor:接受View中的事件,在其中處理好所有與業(yè)務(wù)相關(guān)的事務(wù),抽象好數(shù)據(jù),并將向Entity發(fā)出事務(wù)處理請(qǐng)求(注意,這時(shí)已經(jīng)脫離了具體的業(yè)務(wù)相關(guān)事務(wù))。
Entity:在此層處理脫離了業(yè)務(wù)相關(guān)的事務(wù),eg,數(shù)據(jù)庫(kù)的操作,網(wǎng)絡(luò)的請(qǐng)求。
Presenter:包括ViewModel,負(fù)責(zé)提供給View的數(shù)據(jù),這些數(shù)據(jù)必須View可直接使用。
Routes:負(fù)責(zé)跳轉(zhuǎn),JLRoutes。
單例模式:https://duckrowing.com/2010/05/21/using-the-singleton-pattern-in-objective-c/
當(dāng)有人copy單例時(shí)候,如何保障單例是唯一的?調(diào)用-(id)alloc方法底層會(huì)調(diào)用+(id)allocWithZone:(NSZone*)zone,在里面保證唯一的。
在-(id)copyWithZone:(NSZone*)zone{ ?return self;}
RunTime:刨根問底runtime

這個(gè)類對(duì)象必須是一個(gè) Meta Class 的實(shí)例,而這個(gè) Meta Class 同時(shí)也是一個(gè)根 MetaClass 的實(shí)例。
BeeHive框架:模仿spring框架
REACTIVECOCOA研究
(1)子模塊的structure,BeeHive
(2)列表模塊的數(shù)據(jù)獲取,數(shù)據(jù)處理,顯示等。
? ? ? ? ?a,網(wǎng)絡(luò)請(qǐng)求
? ? ? ? ?b,緩存
(3)不同VC之間的跳轉(zhuǎn)
(4)與網(wǎng)頁(yè)的交互的structure。
業(yè)務(wù)邏輯
視圖邏輯
iOS控制反轉(zhuǎn)(IoC)與依賴注入(DI)的實(shí)現(xiàn)
OBJECTIVE消息轉(zhuǎn)發(fā)機(jī)制在框架設(shè)計(jì)中的應(yīng)用:
深入理解Objective-C消息轉(zhuǎn)發(fā)機(jī)制
+ (BOOL)resolveClassMethod:(SEL)sel
- (id)forwardingTargetForSelector:(SEL)aSelector
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
-?(void)forwardInvocation:(NSInvocation?*)anInvocation
可以利用IOS的消息轉(zhuǎn)發(fā)機(jī)制,發(fā)出虛假的消息(例如,調(diào)用不存在的方法),使用轉(zhuǎn)發(fā)機(jī)制,攔截自定義的消息,發(fā)送給代理proxy,集中處理。
http://studentdeng.github.io/blog/2014/08/29/ios-architecture/
MVVM模式學(xué)習(xí)
https://github.com/lovemo/MVVMFramework
http://www.cocoachina.com/ios/20160301/15425.html