NAKKA-Kの技術ブログ

技術に関する知見や考え方などを投稿します。

ダムを見てオブジェクト指向に思いを馳せた話

先日旅行に行った時、ダムを見てオブジェクト指向に思いを馳せたことをここにまとめてみます。

ダムについて

雨が少ない時に渇水してしまわないようにダムに雨水などを貯めておき、いつでも必要な時に水を確保できるようにする役割を担っています。

その後、ダムから出た水は取水口を通して浄水場に送られます。 そして浄水場で綺麗にされた水は各配水池に貯められます。

ダムとオブジェクト指向

ダムは水の綺麗さに関わらずただ水を貯めるだけの役割を担っています。 もしこれが綺麗な水だけを貯めるようにした場合、水を貯める機能と綺麗にする機能を兼ねる事になり、今ほどの水量を貯めることができなかったでしょう。 そして水を貯めるだけの機能に限定したため、ダムの拡張が圧倒的に簡単です。

例えば水を貯めるだけのダムをイメージにするとこんな感じになります。

水を貯めるだけの場合のイメージ

これが綺麗な水だけ貯めるダムをイメージにするとこんな感じです。

綺麗な水を貯めた時のイメージ

これをオブジェクト指向的に言うと単一責務の原則です!(本当だろうか)

ダムをコーディングしてみる

ダム、浄水場、配水池の関係を実際にオブジェクト指向でコーディングしてみます。 ここではGo言語を使用しますが、雰囲気やコメントである程度読めるかと思います。

コードを後述していますが、先に概要をまとめます。 ダム、浄水場、配水池それぞれにインターフェースを設けます。 そしてそれぞれの機能を構造化して、順番に水の受け渡しをコーディングします。

と、このようにそれぞれの役割に徹し機能を分割してやると、外からのことを気にすることなく拡張が出来ます。 今回は拡張のしやすさをインターフェースでも表現しています。

まとめ

拡張しやすいように設計するのは大事だぞ!という教訓を得た話でした。 それと同時に、どんなことからでも学びに繋げることができる!という教訓も同時に得たのでした。