ぷろぐら×でざいん

Don’t repeat yourself (DRY)

Don’t repeat yourself (DRY)

「たぬきさん……2度 同じ事を言わせないでくださいよ………1度でいい事を2度 言わなけりゃあいけないってのは……そいつが頭が悪いって事だからです」

重複コードはやめようー

開発における一種の哲学として”DRY”という概念があります。それは”Don’t repear yourself”の省略形で、要するに同じような処理の2回書かないことを意味します。理由としては保守する上で重複するコードがあることで、そのコードの変更を行わなければならない時に複雑性が増し、透明性が減少してしまうからです。つまり単純に保守性が下がることを意味します。処理Aと処理Bが全く同じ処理をしているが、これらに変更を加えることにより、どこにどのような影響を及ぼすかわからないために処理Cというようなまた同じようなコードが量産されることになります。また、同じような処理が量産されるということは、各処理の役割分担が明確に定義されていないことも意味します。コードを再利用する際も同じような関数があることで期待する動作と違うということも発生したりするので、重複コードは百害あって一利なしです。

def get_tomorrow(date):
    return date + datetime.timedelta(days=1)

def get_tomorrow_with_date_str(date):
    return datetime.datetime.strptime(date, '%Y-%m-%d').date() + datetime.timedelta(days=1)

上記のようなコードがあった際に、片方は日付に1日を加算しているのに対して、もう一方は日付の文字列を日付型に変換して1日加算しています。一見すると違う処理をしているようですが、下の処理は文字列を日付に変換し、さらに1日加算しているので処理が複数ある上に、上の処理と同様の処理として1日加算があります。

def get_tomorrow(date):
    return date + datetime.timedelta(days=1)

def str_to_date(date_str):
    return datetime.datetime.strptime(date, '%Y-%m-%d').date()

date_str = '2017-01-01'
date = str_to_date(date_str)
tomorrow = get_tomorrow(date)

単純な処理ではありますが、このように処理の役割を明確化してあげることはもちろんですが、重複する部分をしっかり取り除くことで、少しでも保守性を高めることができるはずです。また、同じ結果が得られるコード、つまり開発資源をうまく使い、開発効率をどんどんあげたいですね!


大抵のことは1度で良いのでは

仕事において「あれ?これって一度説明したような気がする…」「あれ、デジャブ…」ということはないでしょうか。同じことを繰り返すことほど、生産性に欠けることはないと思います。人の短期記憶というのは数十秒から数十分の間に一般的には7個程度の数や文字を記憶できるそうです。質問した時や人の発表を聞いた時などは覚え切れると思いがちですが、多分大抵それは自分自身のことを過大評価している時だと思います。本当に短期記憶を即時的に長期記憶に移せるスーパーマンみたいな人は世界にはいるとは思いますが、少なくとも私はそうでないという自信があります。この”DRY”という哲学を知ってからは質問などする時、人と会話する時は可能な限り同じ話を繰り返しさせないように心掛けています。


まとめ

同じような仕事をひたすら繰り返すことほどつまらないものはないと思います。同じエラー、ミス、間違い、などは是正し、電柱などの障害物はしっかり避け、常に前進し続けたいですねー

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です