【问题标题】:Returning a Data Structure to Display information返回数据结构以显示信息
【发布时间】:2017-10-08 19:01:50
【问题描述】:

我在 SESE 上阅读 this answer 关于封装和 getter/setter 的内容。假设我赞成使用不可变类,那么如果实现了一个 setter,它将返回一个反映更改的新对象,例如:

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

在链接中,答案建议我有一个名为getDisplayinformation() 的方法,它返回一个数据结构。

(想想一个由枚举、结构或无方法类索引的数组)

按照此建议,我将如何返回带有作者列表的图书?

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&lt;String,String&gt;

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;
}

【问题讨论】:

  • 为什么不在 book 类上实现一个 toString 方法呢?我看不到地图的目的。但是您可以将列表设为字符串,所以我不明白您的问题
  • 我提供的 SESE 链接上的答案建议了一种数据结构,可以在不破坏封装的情况下返回我想要显示的字段。鉴于我想显示所有字段,我必须为everone 提供一个吸气剂。这不是糟糕的设计吗?
  • 我同意@cricket_007 的观点。

标签: java oop encapsulation


【解决方案1】:

你引用的答案有一半是对的。为字段提供 getter确实会破坏封装,因为它使调用者依赖于某些内部结构。

现在,返回一个调用者需要知道键并知道该信息是什么的映射,基本上与为该字段提供一个 getter 没有什么不同。

面向对象试图告诉我们功能需要与数据捆绑在一起。所以,Book 必须有一些方法来呈现Book。我不会称它为getDisplayInformation(),而是简单地称它为display()。它可以返回一些东西,也可以带相关参数。

重点是,display() 返回的任何内容都必须与演示文稿有关,而不得与书籍有关。关于成为一本书的语义应该在那时丢失,否则调用者将紧密耦合。

因此,可以返回 XML 文档、JSON 文档、HTML、Wicket Component,无论您可以用于独立于 Book 的演示文稿。

或者,该方法可以接受一个参数来呈现自己。比如 AWT Component.paint(Graphics g) 什么的。

注意:这实际上是一个有争议的话题。混合范式开发(程序和对象的混合)认为表示需要与对象分离,而面向对象则认为数据和功能始终属于一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2013-09-11
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多