DRY原則!繰り返してはいけないのはコードだけにあらず
「さあ始まりましたひまじんプログラマーのお時間でございます皆さん今日もおはようございますおはようございますというわけでこのラジオはひまじんの中級エンジニアが送る駆け出しエンジニアをキャリアアップさせるラジオになっておりますエンジニアには中級層が少ないと言われてますからねはいはい界隈上げていきましょう界隈はい界隈界隈というわけでかいちですのりですはい今日は何ですか今日はですねはい用語解説の」
「コーナーでございますということで今回紹介する用語プログラミングっていくつかこうやるといいよねみたいな原則があるんですけどその中でもすごくよく聞いたことがあるやつをよく聞いたことあるやつ?よく聞いたことがあるかもしれないであろう有名なやつもし知らなかったら超大事なんですけどドライ原則っていう」
「ものです乾いていく感じですかそうです電子機器ってね水に弱いんでキーボードの隙間にねデカビタこぼしてね十字キーカピカピになって押せなくなってるやついましたね固まるって砂糖でダメなんだ」
「あれはねアウトだねうーんってやったらいけそうですけどねいやもう音出ない硬い板板になってたマックブックストローク深いなら大丈夫かもしれない全然関係ないよこれ関係なかったわドライ原則っていうのはですね頭文字取ってますこれ乾くとか濡れてるとかそういうのじゃなくてこれドントリピートユアセルフの略なんですねさあじゃあ英語得意なかいちくんはいめっちゃ得意ドントリピートユアセルフ」
「Don'tbeatyourselfどういう意味でしょうかNorepeataftermeリピートアフターミーかと思いましたNoです直訳すると自分でやったことを繰り返すな的な」
「ジャスティスジャスティス珍しいパターンだそうなんですジーニアスとか言われるのあったけどジャスティスって正解的に言われるのは正解って英語でなんだっけってなった結果一番近いのジャスティスだったから言っちゃったわ正しいですからねジャスティスですねそれはジャスティス」
「繰り返すなよっていうことですこのルールは何の話ですかっていう気持ちになっちゃいますけどねそうですよねじゃあ何を繰り返すのかって話なんですけど普段プログラマーの皆さんはコードを書いてお仕事してますよね書いてますねありませんかこことここなんか似てるからコピーしてペーストしちゃおうペッペッってやつあるありますね特に僕とかだと聖書しない」
「一旦ちょっとこれで動くかやってみようって思った時にペッペッって張ってやっちゃうピピピピピピはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはいはい」

「ってなった時に今までコピペで作ってたやつが例えば50箇所あったらその50箇所全部修正しなきゃいけなくなるじゃないですか地獄地獄だしミスる可能性増えますよねそうですね何個も繰り返すからねそうそうだからコースも増えるしバグる可能性も高くなってしまうのでちゃんとまとめれるものはまとめましょうというのがざっくりしたイメージですこのDon'tTPtoYourselfのただ」
「ただ僕がこの本読んだ時にすごくこの本っていうかねこのドライ原則って達人プログラマーっていう今年の2021年あ間違えた2022の商営者がやってる技術書大賞みたいなやつがあって2022かなそこで紹介されてる原則ですこれはそこで読んで衝撃だったんですけどこの本出した時に」
「繰り返すなよって意味で出したけど世間的にはこれコードについてのことだと言われてるっていう風にみんな認識しちゃった悲しいって言ってました第2版でこれは第2版ではコードに限ってない他の話もあるとそうなんです繰り返すなよっていうのは同じコード書くなよっていうちょっと狭い感じじゃないんですよすごいびっくりしたのはですねドキュメントも」
「コードからわかることは重複だよってあってあーあーなるほどねみたいなこの前キーワードさんが似てるようなこと言ってたなマジで?ツイッターでなんだっけコードには何々がわかるようにテストコードには何々がわかるようにドキュメントでは何々がわかるようにっていう何々が今言えない時点で響き切ってないんですけど本当だななんもわかんなかったもん今なんだっけな思い出したら言います」
「なんでしょうねということでコード以外も重複しちゃいけないよっていうのを言ってるんですよちょっとここに関してはね日本の社会的に若干そのドキュメントじゃあ作れよってルールあったらいやこれはドライですって逆らったらねなんかやばい感じもする気がするんですけどどういう範囲なんですかねまあちょっとそこは読んでわかります読むんですけどでもコードの中身をドキュメントに書くことって多分ない」
「うんうんうんまあドキュメントって言ってもまあ仕様書とかいやーうん書かないと思う書かないかうんあんまり書かないと思うまあでも必要な部分とかやっぱあるよねありますよねあの最初にこういうものを作ろうとしてたよねっていうのはなんか残さないとブレそうな気がするしはいはいはいはいそういうなんかコードから読み取れない部分うんなぜの部分って結構残さないといけない気がするんだよねそうですねうん」
「ちなみにすみませんT和田さんのやつちょっと勘違いでコードにはHowテストコードにはWhatコミットログにはWhyコードコメントにはWhynotを書こうという話をしたっていうツイートでしたちょっと今聞かされただけだとパッと理解するのは難しいですねちょっと話違かったんで一回忘れましょうわかりましたということでDon'tRepeatYourselfでコメントとかも重複だよっていうのが」
「この中では言われてますコードから読み取れることはコメントに書くなってことですねこれなんでやっちゃいけないかっていうとコメントってさなんか機能を変えるときにさあんま見なくないコメントは機能を変えるときにじゃあ元々ソースコードがあってコメントがあって実装部分がありましたと今回ちょっと修正しなきゃいけない実装部分をと実装部分修正したらさ満足しない」

「するかもしれない多分これって人間共通の修正だと思うんですよだから結局そういうコードから読み取れることをコメントにしてもどんどんコメントに書いてる中身と実際の実装がずれちゃって信頼できないコメントが出来上がるみたいなのでコメントには」
「やってることじゃなくてなんでこの処理をやってるかとかそういうこと書かないとちょっとやばいよっていうこういうのも重複と言えそうですねコードとこのコードの意味はコメントあたりに残すのはもうそれはコードから読み取れることだから例えばif文で分岐してメールを送って終わってるみたいな処理があったとしてここでメールを送るっていうコメントはね」
「うんこめですねうんこめって言うんですねうんこコメントのことうんこめですねこれはなるほどねそれはでも確かにありますねやっぱじゃあ共通するのは何でしょうスケール大きくしてた時とか将来修正する時のためにこうした方がいいっていう教訓ってことなんですねそうですその思いやりの心を持ってやっていけばおのずと多分綺麗な形になっていく」
「思いやり大事ですね思いやりであとねただじゃあ全部同じものを共通化すればいいかっていうとここは差事加減がちょっと難しくてその時たまたま同じになってる処理とかたまにあるんですよだけど本当はこれたまたま同じなだけだから変更されるタイミングが違うみたいなことがあってそういうのはまとめちゃいけないんですよでもこれを今ここで言語化して説明するのは無理なのではい」
「経験を積んでくださいそれって今話を聞いてて思うのは多分最初じゃあ作りたての時は一緒やんってなって共通化したとしますとで後で変えなきゃってなった時に片方の中身を片方を書き換えるって言うんですか多分関数で外出ししてるものを呼び出し先変えるのかもしくはそこに直で書いちゃうのかちょっと分かんないですけどうん」
「そういう風に変更していくのがいいってことなんですかね一番やばいのはあれじゃないクラスAとクラスBがありますどっちもクラスCを使ってますとクラスCに共通の処理まとめてそれを呼び出してますとでもある日突然Bだけ仕様が変わって変更になったよって時に」
「Cの中にif文つけてもし使うのがBだったらこれこれするみたいな分岐つけんなってことじゃねうんうんそこでつけないでちゃんとそういう時は別に切り分けようっていううんうんこれ図ないとむずいねでもまあ伝わるかなちょっと質問なんですけどはいコードを書いてて僕もちょっとなんとなく意識はしてるんですけどそのドライっていうのをうん」
「テストコードとか書いてるとなんか共通の一行みたいなのがちょっと生まれたりするんですよ関数ごとにテストなんでこういう状況を作ってからコードを実行したりするんですけどこの2関数だけ2つのテストケースだけ一行が共通で入ってしまうっていう時に共通ドライを妥協するんですよ関数に外出しすると」

「ディファインでなんか業務増えてプラマイプラになるなって思っちゃって妥協したりするんですけどそういうのも徹底してやるべきみたいな話なんですかうわー俺それでもまとめるなまとめます?まとめるそれはなぜ?そのテストコード肥大化するかもしれないしあーなるほどそれはあるなあとまとめた方が関数名つけれるからメソッド名かつけれるからなんか」
「意図伝えやすくなるそうですね確かに自由に名前つけるのがそこの処理でさログインとかしたいとするじゃんユーザーとしてログインしたいみたいなっていうのでログインアズなんちゃらかんちゃらユーザーみたいな感じでどんなユーザーとしてログインしてますよみたいなメソッド名で切り出して共通化しますねうんうんうん」
「そうするとどうやってログインしてるか分かんないけどとりあえずこの一行やったらログインしてんだなってのが伝わるようになってねそうですねいいかなと思いますねなるほどありがとうございます僕の仕事の質が数パーセント上がりました数パーセントいいですね」
「スーパー銭湯とスーパー銭湯って似てますね何言ってんですかすいません急に何言ってんですかいや急にスーパー銭湯の話し始めたと思ったら違ったっていう話でした違いましたねはいはい」
「ドライはじゃあコードに限らずなんかドキュメント類って話なんですかねコード簡単に分けるとコードもそうだしコメントもそうだしドキュメントもそうだよだからテキストファイル系とにかくテキストファイル系あとなんか」
「計算で導き出せる系のやつもあんま重複させんなと書いてるどういうことですか例えば地点Aと地点Bがあってその座標を保持してるとするじゃないですかその間の距離も保持してるとするじゃないですかでもその間の距離って座標間のあれで計算できるじゃないですかそういうのは持たない方がいいんじゃないかって書いてますねへーまあでもあの」
「パフォーマンス考えてそういうの先に計算することはあるよねまあまあまあまあまあまあでもその足して足し算程度だとするじゃないですか距離地点Aと地点Bの距離ぐらいの簡単な計算だとするじゃないですか僕とっといちゃいますねその変数名になんかディスタンスとか名前つけてマジで?はいあそれピピピピピピドライドライ」
「ドライハンリピートヨーセルフリーダブルコードでは変数に細かく名前分けろみたいなことが書いてた気がしていてそれゆえそういう癖をつけてたんですけど多分だけど理想はあれなんじゃない距離の変数持っておいてそこから計算するメソッド作るのがいいんじゃないかな」

「何が違うんだ?要はそれを結果を変数に持たせるか持たせないかっていうそれを関数にしておいてそれでも持たなくて済むってこと?なるほど意味は分かりました意味は分かりました結構重くなるわけじゃなかったらそういうのがいいってことですねらしいですねこの辺はちょっと色々さじ加減あると思うまあまあまあそうですねうん」
「勉強になります僕も合ってるかどうか分かんないんで間違えてるよという方は優しくコメントしていただければそういうのも大事なんですよねドライの法則第2版が出ると思うんでドライの法則第2版僕らによる解釈ね僕らによる解釈第2版が出るんでそうですねめげずにやっていきましょうというわけで今回は繰り返しをするなよというドライ原則のお話でしたありがとうございますではまた次回バイバイ」
「イマジンプラグラマーではメールを募集していますトークテーマ、悩み、要望などなど何でも募集中です宛先はhimapro11atmarkgmail.comhimapro11atmarkgmail.comになりますそれではまた次回」