第9章 データの再編成
変数の分離
変数を設定するのは、一度だけにするべき
イミュータブルにしようね
手順
- 宣言時と最初の代入時の変数名を変える
- 可能なら、新しい変数は変更不可と宣言する
- 2回目の代入より前に元の変数へ全ての参照を変更する
- テスト
- 代入ごとに、名前変更(以下繰返し)
フィールド名の変更
データ構造は非常に重要なため、明快に保つことが不可欠
レコード構造内のフィールド名の変更の考えは、クラスにも有効
クラスの利用者にとってgetter,setterは実質的なフィールドになる
手順
- レコードのスコープが限定されている場合は、そのフィールドを使っている箇所全ての名前を変更するだけ
- カプセル化されていない場合、レコードのカプセル化を行う
- オブジェクト内の非公開フィールドの名前を変更し、内部メソッドを調整する
- コンストラクタがその名前を利用する場合は、関数宣言の変更を行う
- アクセサに対して関数名の変更を行う
問い合わせによる導出関数の置き換え
簡単に計算できる変数を全て削除する
計算により、データの意味をより明確にでき、元データが変更された時に変数を更新し忘れてデータが壊れるのを防げる
手順
- 対象とする変数の更新箇所を全て特定する
- 必要に応じ変数の分離をする
- その変数の値を計算する関数を作る
- アサーションの導入を行い、変数が使用される変数と計算結果が同じになることを確認する
- テスト
- 変数の参照処理を新たな関数呼び出しで置き換える
- テスト
- 変数の宣言と更新箇所に対して、デッドコードの削除を行う
参照から値への変更
あるフィールドを値として扱う場合、内部オブジェクトは値オブジェクトに変更できる
値オブジェクトは変更不可のため、仕様の把握が容易
共有オブジェクトの場合は参照のままにしておく必要がある
手順
- 候補のクラスが変更不可になっているか、あるいは変更不可にできるかを確認する
- 各setterに対して、setterの削除を行う
- 値ベースの等価判定メソッドを用意し、値オブジェクトのフィールドを使って判定を行う
値から参照への変更
値を参照に変更することで、一つの実体に対して存在するオブジェクトは唯一になる
シングルトンとは別?
手順
- 参照オブジェクトのインスタンス用のリポジトリを作成する
- コンストラクタから、参照オブジェクトの適切なインスタンスを検索できるようにする
- リポジトリを参照して、参照オブジェクトを取得するようにコンストラクタを変更する
- 変更の度、テスト
感想
フィールド名の変更… 言うは易く行うは難しだな
特にDBのフィールド変更は難しい
変数はできるだけ、イミュータブルにしようね
値から参照・値から参照への変更
railsで例えると、値オブジェクトはモデルのインスタンス・参照オブジェクトはモデルみたいなもん?
最初は、attr_accessor
, attr_reader
を変えるのかなって思っていたけど違うっぽい?