the industrial

ブログと言うより自分のためのメモ以外の何モノでもないです。でも読んでくださってありがとうございます。

現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法〜 CHAPTER2 場合分けのロジックを整理する

現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法

増田 亨. 現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法 (Japanese Edition). Kindle 版.

前回

omiend.hatenablog.jp

プログラムを複雑にする「場合分け」のコード

区分や種別がコードを複雑にする

システムを実現するプログラムには様々な「区分」や「分類」(= つまり実コード上では Enum で表現されるものか)がある。

この「区分」「分類」に対して条件分岐を実装するが、複数の「区分」「分類」が入り組み、分岐が複雑になると修正が厄介になる。

そのため、変更しやすい実装となるように設計するにはどうすればよいか、という話。

判断や処理のロジックをメソッドに独立させる

「区分」「分類」もやはりオブジェクト指向の考え方で実装する。

「区分」「分類」を一つの塊としてメソッドに抽出し、関連するデータやロジックを一つのクラスにまとめる。

else句をなくすと条件分岐が単純になる

else をなくして条件分岐を単純化するとのことで、それには「早期リターン」が良いとのこと。

Java を書いていたときは結構意識してたな。

例では条件分岐結果を設定して最後に return するためのローカル変数を排除し、else を使わずに早期リターンを行う。

この「else を使わずに早期リターン」を「ガード節」と言うらしい。初めて知った。

また、早期リターンをしやすくするために予め条件文をメソッドに抽出しておくとよい。

複文は単文に分ける

if の中に if が入ったりと、「複文」は意図がわかりにくくなるので避ける。

ここでもやはり「ガード節」を使えばシンプルになる。

また、「ガード節」は疎結合なため順序を入れ替えても良い。

区分ごとのロジックを別クラスに分ける

区分ごとのクラスを同じ「型」として扱う

区分ごとにクラスを分けた結果、区分同士を使い分ける条件分岐を書くと、クラスに整理した意味がなくなってしまう。

そのためにインターフェイスを使って同じ型として扱うようにプログラミングしていく。

つまりポリモーフィズムのことか(「多態」)。この本を読んで気づいたのは、カタカナ名詞をなるべく使わないように説明しているところ。

区分ごとのクラスのインスタンスを生成する

Map を使って区分ごとのインスタンスを受け取るテクニック。

Javaの列挙型を使えばもっとかんたん

列挙型(Enum)と多態を組み合わせることによって、if文/Switch文でごちゃごちゃしがちなコードをすっきりさせることができる。

これは10数年前にいた現場で実際やっていたのだけど、そのときはまだ「多態」とかあまり言われてなかったかもしれない時代(あくまでも観測範囲で)だった。

しかし、こういうテクニックが設計手法として確立されていくんだなと思うなど。

区分ごとの業務ロジックを区分オブジェクトで分析し整理する

「区分オブジェクト」とは、区分ごとの業務ロジックを、区分ごとにクラスとして独立させたオブジェクトである。

業務ロジックの見通しを良くし、わかりやすく整理する。

  • 業務要件から区分を発見したら、Enum で列挙。
  • 区分ごとの値をそれぞれコンストラクタで指定する。
  • 区分ごとにロジックが違うのであれば、区分ごとに暮らすを作成する。

こうすることで複雑さを分析・整理することができる。

状態の遷移ルールをわかりやすく記述する

状態遷移を管理することも重要な関心事である。状態の制約条件を管理するにも列挙型を使うと良い。

まず組み合わせをマトリクスで整理する。次にある状態から遷移可能な状態をSetで宣言する。宣言元を「キー」に、遷移可能な状態をSetとしたMapを宣言する。こうすることで、現在の状態がどの状態に遷移できるのかを整理することができる。

まとめ

業務要件から出てくる「区分」に対して愚直に条件分岐を書いた場合、あっという間にソースコードが複雑化していくという課題から、以下にして見通しの良いコードにするのかというテーマ。

曰く、業務要件から「区分」を整理し、メソッドやクラスにまとめ、さらにif文・Switch文を削減するために「インターフェイス、多態」「関心の分離」「区分オブジェクト」「列挙型」を利用するといった設計・実装をする。

こうすることで「区分」が増えた場合でも変更が容易になったりと変更にも強いソースになるのだと思う。

実はこういった列挙型や多態などのテクニックは十数年前に Java を書いていた時にはもう利用していた覚えがあるのだけど、こうしてきちんと言語化と知識として理解していた気はしない。

もちろん今は知識としても持っているのだが、再確認する意味でもとても良い CHAPTER だった。

次回

omiend.hatenablog.jp

ヒトラーを殺し、その後ビッグフットを殺した男

ヒトラーを殺し、その後ビッグフットを殺した男(字幕版)

妻に先立たれた孤独な老人の何気ない生活と、愛する妻と出会ったころの思い出と戦時中の光景を回想するという哀愁漂うエモい静かな前編。

そこから、カナダの森の奥地で病原体をばら撒くビッグフットを討伐するという前編とはかけ離れた後編。

どちらもそれ単体で結構面白いのに、終盤で前編と後編が混ざり合う胸アツ展開からの、ちょっぴり切ないラストが最高だった。

邦題がなんかアレで全然期待してなかった分、良い意味で裏切られてめっちゃ楽しめた。

42~世界を変えた男~

42~世界を変えた男~ (字幕版)

チャドウィック・ボーズマン、ご冥福をお祈りします。

大変な時代だったんだなあ。

スポ根映画というよりは、スポーツマンシップと人間の浅はかさみたいなのを感じる映画だった。

ANY GIVEN SUNDAY

Any Given Sunday [DVD]

どこも配信してないっぽいからDVD買った。

後半のアルパチーノの演説シーンが社内で話題になり、ちゃんと観ておかないとと思い鑑賞。

その演説シーンは泣けたし、ラストの試合もすごく面白かった。

DVD買ってよかった。

フィールド・オブ・ドリームス

フィールド・オブ・ドリームス (字幕版)

社内でこのニュースが話題になり鑑賞。

news.yahoo.co.jp

初めは映画のワンシーンだと思ったら、これが「フィールド・オブ・ドリームス」を題材にした現実のイベントでめっちゃ良かったのだけど、実は映画を観たことがなかった。

イメージはマネーボールみたいな感じかなと思ったのだけど、90年代にあったような懐かしい造りの映画ですごく良かった。

80〜90年台はいつもテレビで映画を観ていたのでなんとなく吹き替えで観たのだけど、すごく懐かしい雰囲気だった。

このくらい古い映画は吹き替えで観ようかな。