Warum TROCKEN wichtig ist

Es gibt viele Artikel zum Thema DRY, ich empfehle die Lektüre der Originalquelle „The Pragmatist Programmer“ von Andy Hunt und Dave Thomas. Allerdings sehe ich immer noch, wie viele Entwickler Fragen zu diesem Prinzip in der Softwareentwicklung haben.

Das DRY-Prinzip besagt, dass wir uns nicht wiederholen sollten. Dies gilt sowohl für den Code als auch für die Prozesse, die wir als Programmierer ausführen. Beispielcode, der gegen DRY verstößt:

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)!")
    }
}

Wie Sie in den Methoden „greet“ und „goodbye“ sehen können, wird eine optionale Instanz der Client-Klasse übergeben, die dann auf Null überprüft werden muss, und dann können Sie mit der Arbeit beginnen. Um der DRY-Methode zu entsprechen, müssen Sie die doppelte Nullprüfung für die Klasseninstanz entfernen. Dies kann auf viele Arten implementiert werden; eine Möglichkeit besteht darin, die Instanz an den Klassenkonstruktor zu übergeben, wonach keine Überprüfungen erforderlich sind.

Wir halten DRY ein, indem wir die ClientController-Spezialisierung auf einer einzelnen Client-Instanz verwenden:

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 betrifft auch Prozesse, die während der Softwareentwicklung auftreten. Stellen wir uns eine Situation vor, in der ein Entwicklungsteam selbst eine Version auf den Markt hochladen muss und sie dadurch von der Softwareentwicklung ablenkt. Dies ist ebenfalls ein Verstoß gegen DRY. Diese Situation wird durch die Anbindung einer CI/CD-Pipeline gelöst, in der das Release automatisch veröffentlicht wird, sofern bestimmte Bedingungen von den Entwicklern erfüllt werden.

Im Allgemeinen geht es bei DRY um das Fehlen von Wiederholungen sowohl in Prozessen als auch im Code. Dies ist auch aufgrund des menschlichen Faktors wichtig: Code, der weniger sich wiederholenden, verrauschten Code enthält, lässt sich leichter auf Fehler überprüfen; Automatisierte Prozesse machen es für Menschen unmöglich, bei der Ausführung Fehler zu machen, da kein Mensch beteiligt ist.

Steve Jobs hatte ein Sprichwort: „Eine Codezeile, die Sie nie schreiben mussten, ist eine Codezeile, die Sie nie debuggen mussten.“

Quellen

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 *