为什么干燥很重要

关于 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

Leave a Comment

Your email address will not be published. Required fields are marked *