迪米特法则(Law Of Demter)
定义:迪米特法则又叫最少知识原则,指的是一个类/模块对其他的类/模块有越少的了解越好。简单来说就是:只和最亲密的朋友交往,不和陌生人来往。
迪米特思想就是:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口
如果两个软件实体无需直接通信,那么就不应当发生直接的互相调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
场景示例
明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。
迪米特法则的独特之处在于它简洁而准确的定义,它允许在编写代码时直接应用,几乎自动地应用量适当的封装、高内聚和低耦合。 但是,过度使用迪米特法则则会使系统产生大量的中介类,从而增加系统的负责性,使模块之间的通信效率降低。所以,在采用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统结构清晰。
代码如下: 明星类(Star)
struct Star {
let name: String
init(name: String) {
self.name = name
}
}
粉丝类(Fans)
struct Fans {
let name: String
let address: String
init(name: String, address: String) {
self.name = name
self.address = address
}
}
媒体公司(Company)
struct Company {
let name: String
init(name: String) {
self.name = name
}
}
经纪人类(Agent)
struct Agent {
let star: Star
let fans: Fans
let company: Company
init(start: Star, fans: Fans, company: Company) {
self.star = start
self.fans = fans
self.company = company
}
func metting() {
print("\(fans.name)与明星\(star.name)见面了")
}
func business() {
print("\(company.name)与明星\(star.name)洽谈业务")
}
}
测试类
let agent = Agent(
start: Star(name: "Kare")
fans: Fans(name: "peng", address: "天街八号"),
company: Company(name: "天宝传媒集团")
)
agent.business()
agent.metting()