Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(引数のオブジェクトデータを書き換えるクラスをリファクタリング)
閲覧数:618
掲示板(引数のオブジェクトデータを書き換えるクラスをリファクタリング)
名前
匿名
題名 引数のオブジェクトデータを書き換えるクラスをリファクタリング
質問内容

質問を評価する
(0ポイント)

昔作ったソースをみると
このようなクラスを見かけたのですが、
このように「引数のオブジェクトデータを書き換えるクラス」はあまりよくないと思ったのですがどうでしょうか。

もしよくない場合はどのように修正すればよろしいでしょうか。
※掲示板に上げるために簡素化しましたが、実際にはParentクラスにはもっとフィールド変数があり、Childクラスでフィールド変数を書き換える処理が多数あります。

    public static void main(String[] args) 
    {
        Parent parent1 = new Parent(Parent.Child1ID);
        parent1.SetData("test");
        System.out.println(parent1.strParent);
        
        Parent parent2 = new Parent(Parent.Child2ID);
        parent2.SetData("test");
        System.out.println(parent2.strParent);
    }
    
    /**
     * 親クラス
     * @author takejiri
     */
    private static class Parent
    {
        public String strParent = "";
        
        public static final String Child1ID = "Child1";
        
        public static final String Child2ID = "Child2";
        
        public ChildBase child;
        
        public Parent(String ChildID)
        {
            if(ChildID.equals(Child1ID))
                child = new Child1(this);
            
            if(ChildID.equals(Child2ID))
                child = new Child2(this);
        }
        
        public void SetData(String strSetter)
        {
            if(child == null)
                return;
            
            child.SetData(strSetter);
        }
    }
    
    private static abstract class ChildBase
    {
        abstract public void SetData(String Setter);
    }
    
    private static class Child1 extends ChildBase
    {
        protected Parent m_parent;
        
        private static final String FukaData = ":Child1";
        
        public Child1(Parent parent)
        {
            m_parent = parent;
        }
        
        public void SetData(String Setter)
        {
            StringBuilder sb = new StringBuilder();
            sb.append(Setter);
            sb.append(FukaData);
            m_parent.strParent = sb.toString();
        }
    }
    
    private static class Child2 extends ChildBase
    {
        protected Parent m_parent;
        
        private static final String FukaData = ":Child2";
        
        public Child2(Parent parent)
        {
            m_parent = parent;
        }
        
        public void SetData(String Setter)
        {
            StringBuilder sb = new StringBuilder();
            sb.append(Setter);
            sb.append(FukaData);
            m_parent.strParent = sb.toString();
        }
    }
質問日時 2013-09-13 09:29:26
名前
匿名
回答内容

回答を評価する
(0ポイント)
>引数のオブジェクトデータを書き換えるクラス
引数を書き換えてるとこなんてなさそうだけど。

引数をそのままフィールドにsetしてないって意味?
そんなの気にする必要はないな。

m_parentはBaseに定義とか、
protected abstract String getFukaData()を作ってsetData()も
Baseに定義とかは考えられるにしても、今回の主題とは
関係がないな…。
回答日時 2013-09-13 10:05:30
名前
匿名
回答内容

回答を評価する
(0ポイント)
あ、分かったかも。
あるクラスのフィールドを書き換えるのに、実際には別の
クラスを通しているのが変じゃないか、と言いたい…?

んー…。それでも別に気にしないで良いわけだけど。
何となく気持ち悪いというなら、例えば

ChildBase child = ChildFactory.get(this,
     ChildFactory.CHILDID1);
child.setData("test");

のように、child主体に動かしちゃいかんの?
既にChildでも何でもないので、例えばDecoratorなんて
名前にした方が良さそうだが。
回答日時 2013-09-13 10:19:30
名前
匿名
回答内容

回答を評価する
(0ポイント)
thisはFactoryではなくsetData()に渡すのが一番単純だな。
回答日時 2013-09-13 10:22:06
名前
匿名
回答内容

回答を評価する
(0ポイント)
質問者です

気になったのは
ChildクラスがParentのオブジェクトを
引数にして、中身のstrParentを書き換えている
ところです。

やっぱり気にしすぎなのでしょうか。
Webでもちょくちょくみかけるパターンですし。
回答日時 2013-09-13 10:23:47
名前
匿名
回答内容

回答を評価する
(0ポイント)
>Decorator
なるほど、これはDecoratorパターンなのですか。
Decoratorはインターフェースを活用する
方法だと思ってました。


>thisはFactoryではなくsetData()に渡すのが一番単純だな。
確かにそうですね。検討してみます。
回答日時 2013-09-13 10:30:48
回答内容を入力し、「確認」ボタンをクリックしてください。
ログインしていません。ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 ユーザIDをお持ちでない方は「ID登録」からユーザIDの登録を行ってください。
氏名 匿名
回答内容
 



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道