Tbpgr Blog

元エンジニア 人事 tbpgr(てぃーびー) のブログ

実装パターン | 状態

概要

状態について
(この書籍のベースはJavaの話)

詳細

状態

時間とともに変化する値の計算。
類似状態は1つにまとめること。
異なる状態は離すこと。

アクセス

状態へのアクセス制御で柔軟性をもたせる。

直接アクセス

オブジェクト内の状態にアクセスする。
一般的な手法は二種。
「アクセサとコンストラクタ以外からは直接アクセスしない」
「自クラス内、継承クラス内からは直接アクセスし、他からはアクセサ経由」
規則はないため、二種に限らずコンテキストにあわせて利用すること

間接アクセス

高度な柔軟性を提供するメソッド経由で状態にアクセス。
アクセサを経由することでget・set部の処理を柔軟に変更可能になる。
しかし、大抵は無変換の処理でありソースコードが煩雑になり記述量が増えてしまう。
これも一長一短なのでコンテキストに応じて利用する。

共通の状態

クラスの全オブジェクトに共通する状態をフィールドに格納
常にワンセットで利用されるような値はスコープと生存機関を統一する。

可変の状態

インスタンスによって、あったりなかったりする状態をMapに格納する。
可変状態をMapで扱うことは変更に対して柔軟だが、分かりにくくなる。

外部の状態

オブジェクトに関連するが特別な目的で使用される状態を、Mapに格納。

変数

状態にアクセスするためのネームスペース。
変数名は読みやすい名前をつける。
スコープや型情報を含ませない。
複数の値を持つなら複数形で命名する。

ローカル変数

単一スコープで状態を保持
出来る限り内側のスコープで利用直前に宣言する。

項目 内容
コレクター 後で利用するために収集する場合の変数。特に戻り値として利用する場合はresult,resultsを利用する。
カウント オブジェクトの数を収集するもの。
説明 説明のための変数。次なるリファクタリングの足がかりになりやすい。
再利用 同じ変数を複数回利用する場合。
要素 コレクションの要素。主にforeachで利用。
フィールド

オブジェクト存続中状態を保持
フィールド宣言は先頭で行う。
値が変化しないことを明示的に伝える場合はfinalを付与する。

項目 内容
ヘルパーフィールド 多くのメソッドで利用されるオブジェクトへの参照
フラグ 動作方法が2種類あることを示唆する。分岐が重複するようならストラテジーフィールドにする
ストラテジー 計算の実施方法が複数ある場合に、可変部を実行するオブジェクトをフィールド化する。
状態 変化する状態を自身で設定する。
コンポーネント 所有を表す。
引数

メソッドの活性化時に状態を伝搬。
引数が多くなる場合は参照ごと渡す。

コレクティングパラメータ

複数メソッドから結果を収集する
数値の合計処理や、リストの追加処理などコレクティング用の変数を引数で渡す。

オプション引数

オーバーロードしたメソッドを容易し、内部で一番引数の多いメソッドを呼び出すことで
オプション引数を実現する。

可変引数

引数がいくつになるか分からないケースでは可変長引数を利用する。
最後の引数である必要がある。

パラメータオブジェクト

頻繁に使用される長い引数リストをオブジェクト化する。
特に関係性の強い引数群に対して行う。

定数

変化しない状態を格納。

役割を示す名前

役割を表す命名をすること。
型情報は変数に含ませない。
略語は利用しない。
スコープの意味を含ませない。

頻出命名

項目 内容
result 戻り値格納
each コレクションの1要素。コレクションを複数で表現した場合は単数命名がよい
count カウンタ
宣言される型

変数は一般的な型で宣言する
インターフェースと実装ならインターフェースを利用する。
実装の切り替えが容易になる。

初期化

変数の初期化を出来るだけ宣言時に行う。わかりやすいため。
パフォーマンスが重要視される場合のみ遅延初期化を行う。

早期初期化

インスタンス生成時にフィールドを初期化。
宣言時、コンストラクタでの初期化。

遅延初期化

コスト節約のために初回利用時に初期化する。
初回利用時の初期化。
コードが煩雑になる。