2017-10-08 18 views
1

私はカプセル化とゲッター/セッターについてSESEでthis answerを読んでいました。セッターが実施されたので、もし、それは例えば、変更を反映する新しいオブジェクトを返します、私は不変クラスを使用することを好むと仮定します。リンクで情報を表示するためのデータ構造を返す

//return a new Book reflecting the price change. 
public Book updatePrice(double price){} 

、答えは私がgetDisplayinformation()というメソッドを持って提案しましたデータ構造体を返します。

私は著者の一覧でブックを返すだろうか、このアドバイスに続き

(列挙型、構造体、またはmethodlessクラスをインデックスとする配列を思いますか)?

public final class Author{ 
    private final String id; 
    private final String firstname; 
    private final String lastname; 
    //Constructor 
} 
public final class Book{ 
    private String bookID; 
    private final String title; 
    private List<Author> authorsList; 
    private double price; 
    //Constructor 
} 

Map<String,String>を返信したいとします。

public Map<String,String> getDisplayinformation(){ 

    Map<String,String> displayMap = new HashMap<String,String>(); 
    display.put("BookTitle", title); 
    display.put("ID", bookID); 
    display.put("Price", price.toString()) 
    //insert authorsList; 
    return displayMap; 
} 
+2

ブッククラスでtoStringメソッドを実装しないのはなぜですか?私は地図の目的を見ません。しかし、リストを文字列にすることができますので、私はあなたの問題を理解しません –

+0

私が提供したSESEリンクの答えは、カプセル化を破ることなく表示したいフィールドを返すようにデータ構造を提案しました。私はすべてのフィールドを表示したいので、私はeveroneのゲッターを提供する必要があります。この悪いデザインではないですか? –

+1

私は@ cricket_007によって作られた点に同意しました。 – Ravi

答えて

1

あなたの答えは半分です。 フィールドのゲッターを提供すると、呼び出し元が内部構造に依存するため、カプセル化を中断するが発生します。

ここで、呼び出し元がキーを知る必要があり、その情報が何であるかを知っているマップを返すことは、基本的にはそのフィールドのゲッターを提供することと違いはありません。

オブジェクト指向は、機能をデータにバンドルする必要があることを私たちに伝えようとします。したがって、BookにはBookを提示するための何らかの方法が必要です。私はそれをgetDisplayInformation()と呼ぶのではなく、単にdisplay()と呼んでいます。それは何かを返すことができ、関連するパラメータも取ることができます。

要点は、display()で返されたものはプレゼンテーションでなければならず、本についてのものであってはならないということです。その時点で本の存在に関するセマンティクスが失われるはずです。そうしないと、発信者は緊密に結合されます。

Bookから独立したプレゼンテーションに使用できるものであれば、XMLドキュメント、JSONドキュメント、HTML、Wicket Componentを返すこともできます。

または、メソッドは、からになるために引数をとることができます。 AWT Component.paint(Graphics g)または何かのように。

注:これは実際に論争の対象です。混合パラダイムの発達(手続き型と大雑把型が混在している)は、提示がオブジェクトから分離される必要があると主張し、オブジェクト指向はデータと機能が常に一緒に存在すると主張する。

関連する問題