单一职责原则,它的核心就是一个类只应该承担一项责任,在实际的设计中,可以以是否是只有一个引起类变化的原因作为准则,如果不止一个原因会引起类的变化,则需要对类重新进行拆分。
也就是说如果要更改一个类,通常是因为一些需求而去对该类进行更改,修改类的时候我们应该思考是不是只有一个原因只有引起一个类的修改,如果是只有一个原因,那么就是非常优秀地遵从了单一职责原则,如果不是的话,那么需要对类进行重新拆分。
特点:
· 降低类的复杂度,一个类只负责单一的职责,逻辑清晰,提高内聚,降低耦合。
· 提高代码的可读性,提高代码的可复用性。
·增强代码的可维护性与可扩展性。
·类的变更是必然的,功能的增加必然会产生类的变更,单一职责可以使变更 带来的影响最小。
例如:我们平时在ViewController上做搭建UI和网络请求,这种写法就违背类单一职责原则
Image.png所以我们应该把,加载数据这一功能类在VC中分离出来,这里以一个例子做为说明
假如现在有一个需求,一个VC有一个tableView展示网络请求回来的列表数据,tableView的header有展示网络请求回来的banner数据
class ViewController{
var bannerData : String?
var listData : String?
//请求广告数据
func loadBannerData() {
bannerData = "广告数据加载完成"
}
//请求列表数据
func loadListData() {
listData = "列表数据加载完成"
}
//页面展示
func showUI() {
print("页面展示:\(self.bannerData!),\(self.listData!)")
}
}
let viewController = ViewController()
viewController.loadBannerData()
viewController.loadListData()
viewController.showUI()
这段代码明显不符合单一职责原则,数据请求和UI搭建都放在了ViewController里面,所以当我们搭建界面或者模块的时候,我们遵从单一职责原则,就应该先把数据请求封装起来,作为单独的模块来使用
class DataLoader{
var bannerData : String?
var listData : String?
func loadBannerData() {
self.bannerData = "广告数据加载完成"
}
func loadListData() {
self.listData = "列表数据加载完成"
}
func getData() -> String {
return self.bannerData! + "," + self.listData!
}
}
class ViewController{
func showUI() {
let dataLoader = DataLoader()
dataLoader.loadListData()
dataLoader.loadBannerData()
print("展示页面:\(dataLoader.getData())")
}
}
let vc = ViewController()
vc.showUI()
单一职责原则是的核心就是职责的细分
网友评论