オブジェクト指向の学習を進めています。
オブジェクト指向は疎結合を目指すもの、ということなので過去に書いたプログラムをクラスは可能な限り不変に、機能を小さく、テストをしやすいように修正しています。
しかしクラス間の疎結合という考えは何となくわかってきましたが、クラス内ではどこまで疎結合にするべきかわかりません。
オブジェクトの生成に必要なデータをコンストラクタで受け取り、
必要に応じてエラーチェックなどの処理をしてフィールドに格納する。
その際に、内部で呼び出されるメソッドに必要な情報は、引数で渡すべきなのでしょうか、フィールドを参照するべきなのでしょうか。
引数で渡すやり方が疎結合っぽい気がします。
でもフィールドにある値を毎回引数にして渡すのは無駄な手間と変数が増えるだけで対した利点がないようにも思えます。
フィールドを参照すると、順序を間違えるとコンストラクタで初期化されてない値を参照してエラーになりそうです。
でもクラス内でどう動くか、クラス内でどう実装されているかは外部が知る必要はないので、オブジェクトを生成した時点で完全な状態になればそれでいい気もします。
たとえばこんな感じで、IDを使ってDBから会員情報を読み込むクラスがあったらどうするべきですかね。
public class MemberInformation{ private final int ID; private final String name; private final String lank; //案1 フィールドは使わず引数で? public MemberInformation (int ID){ this.ID = ID; String tempName = loadName(ID); this.name = tempName; this.lank = calculateLank(ID,tempName); } private String loadName(int ID){ //IDでDBを検索する処理 return loadedName; } private String calculateLank(int ID,String name){ //ID nameでランクを計算 return loadedName; } }
public class MemberInformation{ private final int ID; private final String name; //案2 引数はなしでフィールドから? public MemberInformation (int ID){ this.ID = ID; this.name = getNameMethod(); this.lank = calculateLank(); } private String loadName(){ //this.IDで検索する処理 return loadedName; } private String calculateLank(){ //this.ID this.nameでランクを計算 return loadedName; } }
回答6件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/07 10:04