サンプルコード昨日会社のメンバーからコーディングについて相談を受けました。話を聞いていると、オブジェクト指向設計を利用してコードをリファクタリングしたい様子でした。彼は頑張ってインターフェースやクラスを自分で定義していたんですが、ちょっとぎこちない設計だったので、おいらはStateパターンとFactoryパターンらしきテクニックを使って、改善のお手伝いをしてみました。そのときの事例をめちゃくちゃデフォルメして説明すると、こんな感じになります。プログラムはStateに応じて文字や色を変更します。ボタンを押すとStateに応じて文字や色が変わります。メンバーが最初に書いていたプログラムのイメージはこんな感じです。}}switch文で条件分岐していますね〜。さあ、これをオブジェクト指向プログラミングのテクニックを使って、条件分岐をなくしてみましょう。それではまず、このプログラムをこんな感じのクラス構成に分割します。条件分岐にあたる部分をStateFactoryクラス、Stateクラス、それとStateクラスのサブクラスで実現します。Stateクラスは抽象クラスです。各Stateの親クラスになるのと同時に、テキストボックスに文字や色を設定します。Stateに応じて変化する文字や色はサブクラスに返してもらうため、抽象メソッド(抽象プロパティ)になっています。}Stateクラスのサブクラスはこんな感じです。抽象メソッドを実装し、Stateごとに変わる文字や色だけを返します。}他のサブクラスも同じように実装します。}クラスを利用する側はどのサブクラスを使うべきかを意識しないように工夫します。条件分岐も使いません。それなのになぜ処理を分けられるのかというと、オブジェクト指向で重要な「ポリモーフィズム」が使われているからなんですね。ボタンをクリックしたときの処理はこんな感じになります。//クラスではなくプロパティを選択。どのサブクラスを利用すべきかはStateFactoryクラスにカプセル化してあります。}Warningに変更する場合の実行イメージをシーケンス図で表すとこんな感じです。完成したプログラムの全体像はこんな感じになります。このプログラムは最初のプログラムと全く同じ動作をします。}}というわけで、サンプルは以上になります。ところで「条件分岐はなくなったけどめちゃくちゃコード長くなってるじゃん!」とか「元の方がはるかにわかりやすい!」と思われるかもしれません。こんな風に元のプログラムがシンプルすぎるとオブジェクト指向のありがたみが伝わりにくいですね。このへんがオブジェクト指向を本やネットで教えにくい理由なんじゃないかと思います。実装すべきロジックが複雑であればあるほどオブジェクト指向のメリットを発揮しやすいですが、その分文章では伝えにくくなってしまいます。おいらは以前から「オブジェクト指向を習得するには実際のプロジェクトに携わってオブジェクト指向のメリットを体感するのが一番」だと考えています。簡単なプログラムであれば従来の構造化プログラミングで十分です(今回のサンプルだってそう)。プログラムが一定の複雑さを超えるとだんだんとブロックのネストやコードの重複が増え始めてきます。いう場合に構造化プログラミングを超える手法を利用する価値が出てきます。switch文を一つなくしたぐらいじゃ大したことありませんが、数十、数百というif文やswitch文を持ち、あちこちでたくさんネストしまくっているプログラムから条件分岐がなくなったらどうでしょう?ロジックは複雑なのにもかかわらず、すごくシンプルなプログラムになると思いませんか?オブジェクト指向はそれ自体が構造化プログラミング以上に複雑なルールを持っていますが、それらのルールをうまく活用すればプログラムの複雑さを押さえ込むことが出来るのです。(ちょっと矛盾した表現に聞こえますけどね)たとえば単純なデータであればExcelファイル上で管理できます。管理されるデータや運用方法が複雑になってくるとExcelではうまく対処できない事態が発生するようになってきます。なるとExcelでは力不足だということになり、リレーショナルデータベースを使った本格的なシステムに移行したりしますよね。データベースはExcelよりも複雑なルール(テーブルやビュー、インデックス、SQL等)を持っていますが、それらのルールをうまく活用すれば効率よく情報管理ができます。構造化プログラミングとオブジェクト指向プログラミングの関係もExcelとデータベースのような関係だ、と言えばちょっとは伝わる・・・かな??なお、今回紹介したサンプルはあくまでオブジェクト指向を使うと条件分岐がなくなる、という話がメインです。「こんなの厳密なデザインパターンに従っていない!」とか、「StateクラスがUIに依存しているのはおかしい!」とか、ツッコミどころはあると思いますが、そのあたりはどうかご勘弁を。いう手法を紹介したら、一緒に見ていた技術好きなメンバーから「こういうのは面白い」と言われたり、オリジナルの開発者から「どこで勉強したんですか?」と聞かれたりしました。その反応が昔オブジェクト指向プログラミングに長けた先輩がいて、その人と一緒に仕事をしたときに感じた自分自身の感想にすごく重なりました。おいらがその人に影響を受けてたくさん勉強し始めたのと同様、おいらも他のメンバーに影響を与えられる技術者になれれば、と思っております。最近Rubyを勉強しています。はてなブログPro株式会社ソニックガーデンで働くRubyプログラマ。2017年11月に「プロを目指す人のためのRuby入門」を出版。blog)はてなブログをはじめよう!JunichiItoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。