Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于与实体不直接相关的属性,最佳的设计方法是什么?_Java_Oop_Architecture_Composition - Fatal编程技术网

Java 对于与实体不直接相关的属性,最佳的设计方法是什么?

Java 对于与实体不直接相关的属性,最佳的设计方法是什么?,java,oop,architecture,composition,Java,Oop,Architecture,Composition,我想用Java创建一个模拟库的小型应用程序。我创建了一个名为Book的类,该类具有以下属性: public class Book { private final String ISBN; private String title; private String author; private String domain; private int numberOfPages; } 我想再添加两个属性:股票和价格。但是这些属性与一本真正的书(如ISBN或书名

我想用Java创建一个模拟库的小型应用程序。我创建了一个名为
Book
的类,该类具有以下属性:

public class Book {
    private final String ISBN;
    private String title;
    private String author;
    private String domain;
    private int numberOfPages;
}
我想再添加两个属性:股票和价格。但是这些属性与一本真正的书(如ISBN或书名)没有直接关系,所以我不知道在哪里添加它们:在
book
或在另一个类中

一个想法是创建一个名为
BookView
(不确定它是否是最佳名称)的新类,并添加如下属性:

public class BookView {
    private Book book;
    private short stock;
    private float price;
}
另一个想法是扩展
Book
并创建一个
BookWithDetails
子类,该子类添加股票和价格,但我不确定继承是否适用于此场景:

public BookWithDetails extends Book {
    private short stock;
    private float price;
}

对于这种情况,最好的方法是什么?

在您的场景中,创建一个类似于
BookView
的类似乎是最好的选择,如您的帖子所示:

public class BookManager {
    private short stock;
    private float price;
    private Book book;
}
这样,manager类将有关图书价格和数量的额外信息与实际图书本身分开

由于字段声明为
private
,因此应该添加setter和getter方法来检索字段的值。作为一些getter方法的示例:

public short getStock() {
    return stock;
}

public float getPrice() {
    return price;
}

public Book getBook() {
    return book;
}

其他属性不属于
手册
,原因有二:

  • 他们描述了一些其他的东西——他们描述的不是这本书,而是以特定的价格提供的大量书籍,以及
  • 一本书可能有多个这样的属性——理论上,你可能有五本书每本10美元,三本书每本8美元
因此,您的
BookView
类是表示图书批次的一个好选择,除非我将其重命名为:

public class BookLot {
    private Book book;
    private short stock;
    private float price;
}

还考虑将<代码>价格<代码>改为<代码> int >代码>,理解它代表了所需货币中的美分或任何东西。这是因为

float
double
不太擅长表示小数,而
BigDecimal
对于表示小的十进制数来说可能太浪费了。

这里只是想对其他人有一个不同的看法:我认为你应该在
类中既有
股票
又有
价格
。让我详细说明:

什么是真实的?你如何定义“真实”?

有时人们会说,在OO中,我们模拟“真实世界”。这并不完全正确。我们对业务进行建模,并将业务领域中存在的一切称为“真实的”。并不是所有这些东西在传统意义上都是真实的,大多数职业(即“企业”)都有特殊的术语,这些术语可能赋予单词不同于其“传统”日常含义的语义

什么是“书”?

我不是以英语为母语的人,但我相信“书”这个词有多种含义。“书”这个词可能指的是一整组物理对象,或者是一个具体的物理对象

例如:作者X有一本新书。或者:我可以借那本书吗

事情变得更加复杂,因为您的域是一个“库”。只需与图书管理员(即您所在领域的“业务”人员)交谈即可

图书管理员会说:“我目前的藏书量是……”?她可能不会这么说,她会说:“我目前的X书库存是……”。或者类似的东西

另外,她将如何调用您可以签出的单个物理对象?她很可能会说:“这是你的X本书。”或者类似的话

建模

现在,我们知道我们的领域中存在什么“东西”,让我们看看我们是如何建模的。在OO中,我们不太关心数据,所以这些数据的位置实际上并不重要

重要的部分是行为,这些“东西”能为我们提供什么。我的第一次尝试如下所示:

public class BookView {
    private Book book;
    private short stock;
    private float price;
}
公共接口书{
复制签出();
}
公共接口副本{
void return();//我知道,关键字
}

可能我需要
书中的
股票
价格
,以方便
结账()
,但这是次要的,因为我分配给
的行为。如果没有行为,数据是不相关的。

基本上,答案是在你的问题中:对于与实体没有直接关系的属性,什么是最佳的设计方法

如果需要使用与对象无关的功能扩展对象,请考虑合成。如果扩展对象是上一个对象,请考虑继承

没错,这个名字不是最好的,让我们假设它是
图书产品
图书商品
(不太喜欢这个…)


“库存”是指有多少本书?库存将表示存储库中有多少本此类书籍。示例:10本Java思维书籍,第四版管理类只适用于某种类型的书籍,对吗?所有的书都应该是同一个标题?是的,你说得对。股票和价格描述了一本书。例如,用Java思考,每个50美元。你的BookView,也许更好地命名为BookStock,就是最好的选择。如果您需要准确的价格,请查看Java的
Currency
object为什么
BigDecimal
会“太浪费”?相反,使用
int
听起来像是一种微观优化
BigDecimal
可以很容易地使用可读的美元/美分金额,同时让计算始终返回正确的结果。@MickMemonic嗯,OP似乎对对象的大小非常敏感-他使用
short
float
代替
int
dou