クラスのフィールドのinとoutを分かりやすくする

クラスのフィールドをパラメーターや戻り値にすると流れが分かりにくい

 クラスのフィールドを処理のパラメーターや戻り値とするケースは少なくないと思います。小さいクラスなら役割も流れも分かるのでいいですが、長いクラスになると流れも分かりにくいのでこの使い方はありえない気もします。
 
 個人的な理想論をいえば、引数にいれてreturnで返すという流れが一番分かりやすくて副作用もなさそうに思います。
 
 では、フィールドを使いながらもそれを実現するにはどうしたらいいのか。いろんなことが考え付きますし、そもそも、小さいクラスをつくっておけばこんなことを考える必要もないと思います。

こんな書き方はどうかなというものです。
 ちなみに、パラメーターはimmutable(不変)にしておくのがいいと思います。あと、結果も外から編集できない方がいいです。そうすることで、処理の意図を保持した値の状態確保がしやすいです。(処理の意図を守る)

定義。

NameHolder.java
public class NameHolder {

    //パラメーターフィールド(immutableにして一度設定したら変更できないようにする処理をいれるのがいい。バージョンやツールによって実装の仕方は変わる)
    public class ParamSet {
        public String familyName;
        public String firstName;
    }
    public final ParamSet paramSet = new ParamSet();

    //結果フィールド
    public static class ResultSet {
        public String fullName;
    }
    private ResultSet resultSet;//@Getterでもいいかも。
    //getterのみ(値をいれるまではnullを返す)
    public ResultSet getResultSet() {
        return this.resultSet;
    }

    //処理を結果に格納
    public void makeFullName() {
        this.resultSet = new ResultSet();
        this.resultSet.fullName = this.paramSet.familyName + this.paramSet.firstName;
    }

}

実行。

Main.java
public class Main {

    public static void main(String[] arg) {

            NameHolder n = new NameHolder();
            n.paramSet.familyName = "Tanaka";
            n.paramSet.firstName = "Ken";
            n.makeFullName();
            System.out.println(n.getResultSet().fullName);

    }

}

めんどくさい感じがするのでいいとは思いませんが、思考実験です。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.