耦合並非軟件開發中的專用語言,在初中和高中物理中就有電磁學方面的耦合,還有印象中機械設備之間也有耦合的概念,因此軟件開發中的耦合只是來源於生活,用之於軟件工程學。設計模式
就拿機械設備中的耦合來類比說明吧,咱們都知道長途貨運車,把車頭和車身分別想象成兩個不一樣功能的模塊,車頭的發動機負責驅動,車身負責裝載貨物,兩個模塊之間應該是較低的耦合度,只要車頭和車身之間有一個堅固連接的鐵軸,這是它們之間耦合度的一個主要結構,再附加上一些電路線之類的零件用以從車頭控制車身的燈光,這基本就是二者之間的低耦合的體現;而車身和車頭自身則要高內聚,車身主要提供寬敞的空間來存放貨物,車頭內部複雜的電路系統和發動機驅動,用來給整個車子提供動力,以及控制電路系統。數組
那麼在回到iOS開發過程當中,低耦合和高內聚的體現,如今有一個自定義的UITableViewCell,用於顯示一個用戶發佈的內容,顯示的界面包括用戶名username、時間time、頭像header、發佈的內容content、點讚的數量like,因此這個自定義Cell包括的UI元素以下,優化
@interface CustomTableViewCell:UITableViewCellatom
@property (nonatomic, strong) UILabel *timeLabel;spa
@property (nonatomic, strong) UILabel *usernameLabel;.net
@property (nonatomic, strong) UIImageView *headerImageView;設計
@property (nonatomic, strong) UILabel *contentLabel;orm
@property (nonatomic, strong) UILabel *likeLabel;對象
@end 開發
咱們都知道Cell數值內容的獲取是在
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{}中實現的,
咱們在{}括號中來寫一段比較菜的代碼,
{
//.....
//關鍵代碼
NSString *name = [_names objectAtIndex:indexPath.row];
NSString *time = [_times objectAtIndex:indexPath.row];
UIImage *header = [UIImage imageNamed:[_headers objectAtIndex:indexPath.row]];
NSString *content = [_contents objectAtIndex:indexPath.row];
NSNumber *like = [likes objectAtIndex:indexPath.row];
//.....
cell.timeLabel.text = time;
cell.usernameLabel.text = name;
cell.headerImageView.image = header;
cell.contentLabel.text = content;
cell.likeLabel.text = [NSString stringWithFormart:@"%@",like];
}
這樣的代碼寫的是頗有問題的,首先就沒有將信息所包含的對象給封裝起來,咱們把包含time、username、header、content、like的糗事封裝成對象Qiushi(糗事),下面是Qiushi對象的代碼,
@interface Qiushi:NSOjbect
@property (nonatomic, strong) NSString *username;
@property (nonatomic, strong) NSString *time;
@property (nonatomic, strong) NSString *content;
@property (nonatomic, strong) NSString *header;
@property (nonatomic, strong) NSNumber *like;
在CustomTableViewCell所在的ViewController中將qiushi加入qiushiArray數組,而後在
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}
的括號{}中這樣寫,
{
//.....
//關鍵代碼
Qiushi *qiushi = [qiushiArray objectAtindex:indexPath.row];
cell.timeLabel.text = qiushi.time;
cell.usernameLabel.text = qiushi.username;
cell.headerImageView.image = [UIImage imageNamed:qiushi.header];
cell.contentLabel.text = qiushi.content;
cell.likeLabel.text = [NSString stringWithFormart:@"%@",qiushi.like];
//.....
}
這樣咱們將username、time、content、like、header等屬性封裝在Qiushi這個對象中,這就是初級的MVC使用了。那麼看上面的代碼,有沒有以爲不妥的地方,你看上面紅色的cell.timeLabel、cell.usernameLabel。。。等等賦值方法,像不像Cell對象與ViewController之間的連線,這種狀況就是高耦合了,由於鏈接的線太多了,爲了下降耦合度,咱們給CustomTableViewCell添加Qiushi屬性變量,以下,
@interface CustomTalbeViewCell:UITableViewCell
@property (nonatomic, strong) UILabel *timeLabel;
@property (nonatomic, strong) UILabel *usernameLabel;
@property (nonatomic, strong) UIImageView *headerImageView;
@property (nonatomic, strong) UILabel *contentLabel;
@property (nonatomic, strong) UILabel *likeLabel;
@property (nonatomic, strong) Qiushi *qiushi;//新增長的Qiushi對象屬性變量
在- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}
的括號{}中這樣寫,
{
//.....
//關鍵代碼
Qiushi *qiushi = [qiushiArray objectAtindex:indexPath.row];
cell.qiushi = qiushi;
//.....
}
這樣是否是在Controller中少了不少代碼,這時候得到了qiushi數據的cell對象,想怎麼在其UIView控件上面顯示數據就讓它本身去作,好比,能夠在其內部這樣寫代碼填充UILabel、UIImageView上面的數據內容,
- (void)setQiushi:(Qiushi)qs
{
self.timeLabel.text = qs.username;
self.contentLabel.text = qs.content;
self.header.image = [UIImage imageNamed:qs.header];
....
}
這樣就是使用MVC下降耦合度,提升了代碼的可讀性,即Controller做爲View和Model(此處就是Qiushi)之間的橋樑,View不與Model直接交流,只負責顯示Controller傳遞給它的數據。
這就是爲何說MVC是iOS設計模式之王,由於使用MVC能夠有效的將項目的模塊分工明確,下降了不一樣模塊之間的耦合度,提升了可讀性和可擴展性。
上面是我本身總結的一個使用場景,固然還有更多的場景,須要下降模塊之間的耦合度,好比兩個Controller頁面之間切換,ViewController1 push進入ViewController2,那麼第二個ViewController2之間的數據顯示什麼內容,徹底就是ViewController1決定的,你能夠想下面這樣寫代碼,
ViewController1
{
ViewController2 VC2 = [[ViewController2 alloc] init];
VC2.name = @"xxxx";
VC2.content = @"xxxx";
[VC2 setTitle:@"xxx" image:[UIImage imageNamed:@"xxx"]];
[self.navigationController pushToViewContorller:VC2];
}
看看上面的代碼,經過三條語句來給VC2賦值,咱們都能看出來哪裏很差,優化的方式就是儘可能減小VC2方法的調用和屬性的賦值,能經過儘可能少的代碼進行VC2中初始化賦值最好。