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)!")
}
}
挨拶メソッドと別れのメソッドでわかるように、Client クラスのオプションのインスタンスが渡されます。これは nil かどうかをチェックする必要があり、それから作業を開始できます。 DRY メソッドに準拠するには、クラス インスタンスの重複した nil チェックを削除する必要があります。これはさまざまな方法で実装できます。1 つのオプションは、インスタンスをクラス コンストラクターに渡すことで、その後はチェックが必要なくなります。
ClientController を単一の Client インスタンスに特化することで 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 はプロセスとコードの両方に繰り返しがないことを意味します。これは人的要因の存在によっても重要です。繰り返しが少なくノイズの多いコードが含まれるコードは、エラーのチェックが容易です。自動化されたプロセスでは、人間が関与しないため、プロセスの実行中に間違いを犯すことがなくなります。
スティーブ・ジョブズの格言は、「書く必要のなかったコード行は、デバッグする必要のないコード行です。」です。
ソース
https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/
https://youtu.be/-msIEOGvTYM