最近公司項目不是很忙,這段時間就抽空給自己充了充電屯蹦。在充電的同時順手把項目中的網(wǎng)絡請求給優(yōu)化了一下,根據(jù)自己的想法加入了緩存和 json 格式檢驗,具體緩存思想可以看我這篇文章點我蔓腐。
在優(yōu)化網(wǎng)絡請求的同時也在網(wǎng)上查找一些比較優(yōu)秀的三方庫,其中看到猿題庫封裝的網(wǎng)絡請求,其中關于猿題庫網(wǎng)絡請求介紹中:YTKNetwork 的基本的思想是把每一個網(wǎng)絡請求封裝成對象,這句話引起了我的思考,"對象"到底什么叫對象呢?什么叫面向?qū)ο竽?經(jīng)過幾天的思考終于悟出了一點門道,我將探索的過程分享出來希望能夠?qū)τ行枰耐瑢W們有所幫助哮洽!
什么叫面向?qū)ο?
不懂就百度唄,在網(wǎng)上搜 iOS面向?qū)ο?出現(xiàn)最多的就是面向?qū)ο蟮娜筇匦?封裝,多態(tài),繼承(這幾個稍后說)浴井。我們雖然用的是面向?qū)ο蟮恼Z言,我相信絕大多數(shù)入門或者工作經(jīng)驗1年多的同學敲出來的代碼依然是大段的面向過程的思想,我們只是把面向?qū)ο髞懋斪?OC 語言的一個特性而已,具體是什么估計自己也說不明白到底是什么。
我曾問過一個同事什么叫面向?qū)ο?他是這么給我說的:一個自行車組裝師傅酪穿,不需要知道車頭的原理是怎么剎車的,只需要知道它是車頭它的作用,就行摊灭,然后師傅組裝自動車的其他部件,就可以把車裝好败徊,這就是面向?qū)ο?/em>,感覺他給我說的并非我所想問的帚呼。
對象的概念
什么是對象?世界萬物皆對象
,是啊,所有看到的看不到的都是對象,把對象引入到編程中,那就是面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP皱蹦,面向?qū)ο蟪绦蛟O計),在百度百科中有關于 OOP 詳細的介紹煤杀。簡單來說就是它將對象作為控件的基本元素, 利用對象和對象之間的相互作用來設計程序,說白了,一款軟件的運行就是控件之間的相互作用。說了那么多,那到底啥是對象,對象是你,是我,是萬物,我認為在程序中能 alloc出來的都是對象沪哺。就拿人來說,你是人,我也是人,為啥咱倆不一樣,要是放到程序里來說,是因為 alloc 分配的內(nèi)存地址不一樣沈自。人有頭發(fā),眼睛,手鼻等,這些在 OC 里面稱之為屬性,人能跑,跳,投,等動作這些在 OC 里面稱之為方法。我這么比喻我想你應該有所理解辜妓。其實,你在做項目的時候已經(jīng)在用對象這個概念了,只不過你不知道罷了枯途。舉個簡單的例子:點擊 tableview 的 cell 讓 cell 里面的控件變換顏色,我相信大家都能實現(xiàn)這個效果,是怎么做的呢?肯定是定位點擊的哪個 cell, 拿到當前 cell,那這個 cell 不就是對象,找到 cell 中的控件,控件不就是 cell 的屬性嗎?顏色也是控件的屬性,控件即是對象也是屬性,控件間的相互作用完成了這個功能,說到底也就是操作的對象籍滴。 大家做項目的時候都發(fā)起過網(wǎng)絡請求,利用 AFN 的 POST 請求大家都經(jīng)常用,那在請求回調(diào)的 block 塊中返回的id responseObject
這個是什么?對,這個就是對象,是一個數(shù)據(jù)對象,這個對象是由 AFN 創(chuàng)建,拿到數(shù)據(jù)對象,對數(shù)據(jù)做處理,我們怎么處理數(shù)據(jù),一般我們是不是要建模型,那為什么我們要建模型,模型有什么特性呢?請看下面類的概念
類的概念
承接上面所說,模型有什么特性呢?具有相同數(shù)據(jù),方法等酪夷。
面向?qū)ο缶幊讨? 具體的事物是對象, 將具有相同或相似性質(zhì)的對象的屬性或方法抽象出來便是類,類是對象的抽象化,對象便是類的具體實現(xiàn)。估計這不好理解,再拿網(wǎng)絡請求數(shù)據(jù)來講,數(shù)據(jù)都有相同或相似的數(shù)據(jù),將這段數(shù)據(jù)的相同點抽離出來便是我們所建的 model 類,比如 person 類,屬性有:name,height,weight等,他們具有相同的屬性將屬性他們通過一個方法將數(shù)據(jù)進行轉(zhuǎn)化,那這個方法不就是封裝嗎?一般都是在.h 文件中聲明方法,在.m 中去實現(xiàn),方法一般都是隱藏內(nèi)部實現(xiàn)孽惰,預留一個穩(wěn)定外部接口捶索。面向?qū)ο蟪绦蛟O計中的方法可分為兩種,一為上述的實體(對象)方法,二為類方法,主要的差異在于實體方法需要有一對象去引發(fā),而類別方法可以由類別名稱調(diào)用。
面向?qū)ο蟮娜筇卣?/strong>
封裝
上面在類的概念中已經(jīng)將封裝的概念帶入了一點了,在網(wǎng)上對封裝解釋最多的就是:封裝主要的功能是將數(shù)據(jù)隱藏起來,只有此類別所屬的方法,亦即實體方法,才能直接存取數(shù)據(jù),所以也可以說是在保護數(shù)據(jù),不會被外界任意的存取,所以就大大的降低數(shù)據(jù)的誤用,且很容易的知道錯誤在哪里,從而省下很多的維護成本灰瞻。
繼承
"繼承"這倆字非常形象的描述了這一特性,我們現(xiàn)實生活中繼承的發(fā)生著最多的就是"子繼承父",它可以使用現(xiàn)有類的所有功能腥例,并在無需重新編寫原來的類的情況下對這些功能進行擴展,大大提高了編程的靈活性辅甥。一般在項目里面會繼承自 AFN 請求等即方便又快捷。
多態(tài)
不同對象以自己的方式響應相同的消息的能力叫做多態(tài)燎竖。假設有一個人
類,都有一個相同的方法, 比如這個方法叫-sport 小明和小紅都繼承自人
這一類,各自實現(xiàn)各自的- sport 方法,也就是不同的對象以自己的方式響應了相同的消息璃弄。
從理解面向?qū)ο蟮嚼斫饷嫦騾f(xié)議
網(wǎng)上傳了一個很火的設計模式便是M-V-P
,M V 大家必定熟悉,可能對 P 不是很了解, P 就是協(xié)議即protocol
。 比如 TableView 的代理,每次在控制器或者視圖中都要將協(xié)議寫一遍,很繁瑣,很麻煩构回。他們都有相同的數(shù)據(jù)和方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
...
這個設計模式將繁瑣的協(xié)議抽離出來交給一個類去實現(xiàn),只不過這個類實現(xiàn)是的是系統(tǒng)定義的協(xié)議夏块。關于 MVP 簡單使用可以看這個是我自己基于對象的理解用 swift 去實現(xiàn)的。
舉個例子:
創(chuàng)建一個繼承于NSObject
類叫MTableViewDelegate纤掸。h
文件,這個類實現(xiàn)的協(xié)議是UITableViewDelegate
和UITableViewDataSource
@interface MTableViewDelegate : NSObject<UITableViewDelegate,UITableViewDataSource>
大家在項目中都寫過協(xié)議,聲明協(xié)議,要實現(xiàn)協(xié)議,在MTableViewDelegate脐供。m
文件中要將 tableview 的代理方法要實現(xiàn)了,現(xiàn)在所有經(jīng)過MTableViewDelegate
所創(chuàng)建的對象都實現(xiàn)了 tableview 的代理
MTableViewDelegate *delegate = [[MTableViewDelegate alloc]init];
你在控制器中創(chuàng)建 tableview 你可以這樣寫
#import "MTableViewDelegate。h"
@interface ViewController ()
@property (nonatomic, weak) UITableView *tableView;
@property (nonatomic, strong) MTableViewDelegate *delegate;
@end
- (UITableView *)tableView
{
if (!_tableView) {
UITableView * tableView = [[UITableView alloc] init];
tableView借跪。frame = self政己。view。bounds;
//一定將代理設置為全局變量,如果設置為局部變量的話,
沒有了引用會自動被銷毀(ARC)
_delegate = [[MTableViewDelegate alloc]init];
tableView掏愁。delegate = _delegate;
tableView歇由。dataSource = _delegate;
[self。view addSubview:tableView];
_tableView = tableView;
}
return _tableView;
}
這只是舉了一個簡單的不能再簡單的例子了,只要為了說明面向?qū)ο蟮乃枷?/strong>果港。萬變不離其宗,無論是 MVP 還是 MVVM 或者是 MVC 都是基于對象去實現(xiàn)的,理解了對象的思想在以后做項目必有很大幫助沦泌。