关于 DRY 主题的文章有很多,我建议阅读 Andy Hunt 和 Dave Thomas 的原始资料“The Pragmatist Programmer”。然而,我仍然看到有多少开发者对软件开发中的这一原则存在疑问。
DRY 原则指出我们不应该重复自己,这适用于我们作为程序员执行的代码和流程。违反 DRY 的示例代码:
class Client {
public let name: String
private var messages: [String] = []
init(name: String) {
self.name = name
}
func receive(_ message: String) {
messages.append(message)
}
}
class ClientController {
func greet(client: Client?) {
guard let client else {
debugPrint("No client!")
return
}
client.receive("Hello \(client.name)!")
}
func goodbye(client: Client?) {
guard let client else {
debugPrint("No client!!")
return
}
client.receive("Bye \(client.name)!")
}
}
正如您在greet 和goodbye 方法中看到的,传递了Client 类的一个可选实例,然后需要检查该实例是否为nil,然后您就可以开始使用它了。为了符合 DRY 方法,您需要删除类实例的重复 nil 检查。这可以通过多种方式实现;一种选择是将实例传递给类构造函数,之后就不需要进行检查。
我们在单个客户端实例上使用 ClientController 专业化来遵守 DRY:
class Client {
public let name: String
private var messages: [String] = []
init(name: String) {
self.name = name
}
func receive(_ message: String) {
messages.append(message)
}
}
class ClientController {
private let client: Client
init(client: Client) {
self.client = client
}
func greet() {
client.receive("Hello \(client.name)!")
}
func goodbye() {
client.receive("Bye \(client.name)!")
}
}
DRY 还涉及软件开发过程中发生的流程。让我们想象一种情况,开发团队必须自己向市场上传版本,分散他们对软件开发的注意力,这也是违反 DRY 的。这种情况可以通过连接 CI/CD 管道来解决,在该管道中,只要开发人员满足某些条件,就会自动发布版本。
一般来说,DRY 是指流程和代码中不存在重复,这也很重要,因为人为因素的存在:包含较少重复、噪声代码的代码更容易检查错误;自动化流程使人们在执行过程中不可能犯错误,因为没有人参与。
史蒂夫·乔布斯(Steve Jobs)有句名言:“你永远不必编写的一行代码就是你永远不必调试的一行代码。”
来源
https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/
https://youtu.be/-msIEOGvTYM