2016-09-13 7 views
1

公開フィールドがyear_publishedBookクラスがあるとします。 NullObjectデザインパターンを実装したい場合、Bookと同じように動作するが、何もしないNullBookクラスを定義する必要があります。NullObjectパターン:フィールドの処理方法は?

質問は、NullBookのフィールドが割り当てられているときの動作は何ですか。

Book book = find_book(id_value); //this method returns a NullBook instance because it cannot find the book 
book.year_published = 2016; //What should we do here?! 
+0

まず、プロパティに直接アクセスせずに(プライベートとして定義する)、setterを使用する必要があります。クラスでどのような値を割り当てるかを制御することができます。 – olibiaz

+0

しかし、それはいつも可能ではありません。 – mahdix

+0

また、コードがクラスメソッドの中にあると仮定できます。だから、私的なフィールドにもアクセスできるようになります。 – mahdix

答えて

1

まず、プロパティを非公開にする必要があります。

class NullBook { 
    private year_published; 
    // OR solution2 private year_published = null; 

    public setYearPublished(year_published) { 
     this.year_published = null; 
     // OR solution2 do nothing! 
    } 
} 

また、親クラスのプライベートフィールドを定義することができるので、子どもたちはなぜ、使用ゲッターとセッターフィールドに

class Book { 
    private year_published; 

    public setYearPublished(year_published) { 
    this.year_published = year_published; 
    } 
} 

class NullBook extends Book { 
    public setYearPublished(year_published) { 
     parent::setYearPublished(null); 
    } 
} 

をアクセスもするセッターを実装する必要がありますか? https://stackoverflow.com/a/1568230/2377164

+0

プライベートフィールドにもアクセスできるクラスメソッドの中にコードが含まれているとしたらどうなりますか? – mahdix

+0

あなたもあなたのことを発展させることができますか?どのコード? – olibiaz

+0

質問のサンプルコードがクラスメソッド内にあるとします(プライベートフィールドにもアクセスできるようになりました)。つまり、フィールドがプライベートとしてマークされていても、問題は引き続き発生します。 NullBookのクラスメソッド内に – mahdix

1

事はある:パターンは、約のバランスをとります。はい、それは一般的にはnullを返さないのが良い習慣ですが、他に返す必要があります。しかし、うまくいけば:返されるものはまだ意味をなさないはずです!

そして、「NullBook」がアプリケーションの設計にどう役立つかは、ある程度は分かりません。特に、さまざまな内部フィールドにアクセスできるようになります。正確な質問をしてください:公開された年、著者、またはそのような "NullBook"の何をすべきですか? たとえば、コードの一部が異なる「ソース」の書籍の「検索」を行った場合はどうなりますか?出版された年にそれらの本を並べ替えることを試みる。 NullBookがそのようなデータの一部であることは確かではありません。

このように私は、このクラスを持っていることの価値が逆には見えません。私はそれが "面白い"バグの可能性を作り出しているのを見ています。したがって、私の答えは:あなたが本当にそのクラスが必要な場合は、一歩戻って再検討してください。

null置換オブジェクトに代わるものがあります。おそらくあなたの言語では許容されていますオプション;または、nullを返す可能性のあるメソッドを再作成して、書籍のコレクション/配列を返すことができます。疑いの余地があります:そのリスト/配列は単に空です。

短いストーリー:他のクラスにプライベートフィールドへの直接アクセスを許可するのは、はるかに多くのインポートですデザインの臭い;あなたはNullObjectsに集中するべきではありません。その一方で、Information Hidingといった本質的なことをあきらめてください。

関連する問題