假设我需要为一系列书籍设计一个系统。我们假设我有数百万本书,为简单起见,我们不需要在系统中添加或删除书籍。
我可以创建一个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>();
哪种表示更有效?或者可能重新解释这个被认为是更好的OOP方法的问题?
谢谢!
答案 0 :(得分:12)
考虑OOP:考虑 哪本以及属性。一本书确实不知道关于其他书籍,所以第二种方法是不的方式。
阵列......好吧,如果足够的话
最好的事情(从模型的角度来看)是创建一个类Book
和一个类,例如管理所有图书的Library
。然后最后一节课包含所有书籍的清单,并提供所有书籍的操作。
答案 1 :(得分:2)
分开不同的问题:
1)创建一本书及其属性(标题,作者等)和方法(阅读,架子,借,借)。
2)创建一个数据结构,用于存储支持所需操作的书籍(按作者搜索,按标题搜索,浏览等)
答案 2 :(得分:2)
我认为这个问题不足以以良好的方式回答。 OO首先是关于在哪里划线。如果你对一本书进行建模,它应该有ISBN,那就没问题了,但是一个OO狂热分子也会为你装备一系列Leaf-s,每个Leaf都有两个Page-s,每个页面都有一个PageNumber,和一个Line-s数组,每一行都是一个字符数组。或者是一个字符串。但是,在这种情况下,String并不是真正优秀的OO。
你必须决定在哪里停止建模,重要的是要意识到你没有对真实的单词建模,而是对(第二)程序员和机器的思维进行隐喻协商。你正在做的是同时向机器和读者解释一些东西。 OO可以是一个很好的工具,但它也可以用来阻碍。小心!保持简单!
如果您唯一需要的是根据ISBN查找标题,那么请保持简单:
Map<String, String> indexedBookList;
如果您怀疑功能可能会增长,您应该创建一个
class Book {
String title;
String isbn;
String author;
}
并将所有图书保存在
中List<Book> bookList;
然后,可能是你的项目从这个静态的小事物发展成为必须与SQL数据库进行通信的东西,它会在一定程度上更新并且不受你的控制。然后,为了便于阅读,最好保持简单,并对数据库进行建模,而不是试图模拟现实世界。
编程是指告诉机器该做什么,同时告诉其他人,我们试图告诉机器做什么。代码中最重要的特性是程序员可以读取它需要理解它。在一年中,那可能是你。
答案 3 :(得分:1)
这是关于什么是合乎逻辑的。
“Book”不是存储大量书籍的容器的逻辑名称。你可以按照世界的方式对其进行建模。
而且,正如您经常会听到新手一样,在设计结构时(通常)不会考虑“效率”。
您设计正确性,逻辑性和“意义”。 (以及显然,其一般操作)。效率可以(通常)作为实现的一部分。当您检查设计并尝试实现它时,您可能会发现某个组件不会高效。在这种情况下,您尝试在整体设计的上下文中解决这个问题,或者根据您的发现显着调整设计(尽管这种情况很少见)。
答案 4 :(得分:0)
两者都不正确。
您可能需要考虑使用Book对象(带有标题,ISBN代码)和带有Book对象集合的Library(或Bookstore,或Shelf)对象。
在现实生活中,您不会在书中添加“标题和ISBN”。您可以将图书添加到图书馆。
OOP并不一定是模仿现实生活中的实体,但是你的做事方式有点奇怪,会让任何人都在阅读你的代码。