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或任何其他OOP_Java_Oop_Object - Fatal编程技术网

一对多对象-Java或任何其他OOP

一对多对象-Java或任何其他OOP,java,oop,object,Java,Oop,Object,比如说,我需要设计一个收集书籍的系统。假设我有数百万本书,为了简单起见,我们不需要在系统中添加或删除书籍 我可以创建一个Book类并启动集合大小的数组: Book book = new Book[number of books]; 在这种情况下,Book将包括以下字段: long bookIsbn String bookTitle 或者,只启动一个对象: Book book = new Book(); 在本例中,Book类需要包含数组/列表/地图等,其中包含有关整个集合的信息。例如: M

比如说,我需要设计一个收集书籍的系统。假设我有数百万本书,为了简单起见,我们不需要在系统中添加或删除书籍

我可以创建一个Book类并启动集合大小的数组:

Book book = new Book[number of books];
在这种情况下,Book将包括以下字段:

long bookIsbn
String bookTitle 
或者,只启动一个对象:

Book book = new Book();
在本例中,Book类需要包含数组/列表/地图等,其中包含有关整个集合的信息。例如:

Map<Integer, String> isbnToTitle = new Map<Integer, String>();
Map isbnToTitle=newmap();
哪个代表更有效?或者重新表述这个问题,哪一种被认为是更好的OOP方法


谢谢

分离不同的关注点:

1) 创建一本带有属性(标题、作者等)和方法(阅读、上架、出借、借阅)的书


2) 创建一个数据结构,用于存储支持所需操作的书籍(按作者搜索、按标题搜索、浏览等)

考虑OOP:思考一本书是什么,它有哪些属性。一本书肯定不知道其他的书,所以第二种方法是不知道

数组。。。如果足够的话,当然可以。

最好的方法(从模型的角度)是创建一个类
Book
和一个类,例如管理所有书籍的
Library
。最后一个类包含所有书籍的列表,并提供对所有书籍的操作。

这是关于什么是真正的逻辑

“Book”不是存储大量书籍的容器的逻辑名称。你可以按照世界的方式来建模

而且,作为一个新手,你会经常听到,“效率”在设计你的结构时是不被考虑的

你为正确性、逻辑性和“意义”而设计。(以及,显然,其一般操作)。效率可以(通常)作为实施的一部分。当您检查设计并尝试实现它时,您可能会发现组件效率低下。在这种情况下,您可以尝试在总体设计的背景下解决这个问题,或者根据您的发现对设计进行重大调整(尽管这很少见)。

两者都不正确

你可能想考虑有一个书本对象(带有标题、ISBN代码)和一个藏书对象(书架或书架)对象。 在现实生活中,你不会在书中添加“书名和ISBN”。你可以把一本书添加到图书馆


OOP不一定是关于模仿现实生活中的实体,但你的做事方式有点奇怪,会让任何阅读你的代码的人感到困惑。

我认为这个问题的信息量不足以很好地回答。OO首先是关于在何处划清界限。如果你为一本书建模,它应该有和ISBN,这很好,但是一个OO狂热者也会让你为这本书配备一个Leaf-s数组,每一个Leaf-s正好有两个Page-s,每一页有一个页码,一个Line-s数组,每一行都是字符数组。或者是一根绳子。但是,在这种情况下,字符串并不是很好的OO

你必须决定在何处停止建模,重要的是要意识到你不是在建模真实的单词,而是一个隐喻,在(第二个)程序员和机器之间进行思维交流。你所做的是同时向机器和读者解释一些事情。OO在这方面可能是一个很好的工具,但也可以用来阻止。小心!保持简单

如果您只需要根据ISBN查找标题,请保持简单:

Map<String, String> indexedBookList;
把你所有的书都放在书柜里

List<Book> bookList;
列表图书列表;
然后,您的项目可能会从这个静态的小东西成长为必须与SQL数据库通信的东西,它会不时地更新,并且超出您的控制。那么,为了可读性,最好保持简单,并对数据库建模,而不是试图对真实世界建模


编程就是告诉机器要做什么,同时告诉其他人我们要告诉机器要做什么。代码中最重要的特性是,需要理解它的程序员可以阅读它。一年后,这可能就是你。

更高效和更好的OOP方法实际上并不是指同一件事,所以一个不是对另一个的重新表述。潜在的效率问题只是对象阵列和映射。正如你所知道的,它们有各自的优缺点。是的,对象阵列和映射是一个什么对特定应用更好的问题。但是让我们忘记地图,对于一般应用程序,我对第一种解决方案的关注是我需要创建数以百万计的Book类型的对象,在第二种解决方案中,我只创建Book的一个对象,然后在Book中我可以创建基元数组(这对Java来说可能比数百万类对象更容易处理——这主要是我的问题)。“lend”/“borrow”不属于
Book
类。它们属于
Library
对象,并将
Book
作为参数。(FWIW,我对你投了反对票,但这只是因为你被提升了两次。)[大概是因为包含了花哨的短语“关注点分离”)。@silky:我认为人们可以争论这个问题。这些都是详细的设计问题,没有对错。@Felix当然可以争论,但也有人会错(IMHO)因此,我不同意并投了反对票。我认为一本书为自己提供“出借”的便利是不自然的(不用说,它需要访问库的属性才能实际执行此功能,而IMHO将这种逻辑包含在书本身中是错误的。例如,假设书不再在库中。您仍然可以调用
List<Book> bookList;