Java 对于与实体不直接相关的属性,最佳的设计方法是什么?
我想用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或书名
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