我最近有一个家庭作业问题,我们应该在棋盘上工作,并在棋盘上放置一些女王。
这个问题在困难方面是微不足道的,但我想问的是:
我应该只创建一个布尔二维数组并将包含一个皇后的每个位置更改为1,还是应该创建一个私有类来表示一个皇后,它有x和y坐标作为实例变量?
这可能看起来不是很重要或者很紧迫,但是我正在使用Java,它有点接近OO编程概念的核心。如果我们从不使用Java的模块化功能,那么为什么要使用Java呢?我们不妨在C或Python中编写相同的东西。
您认为哪种更合适?如果你可以将你的答案限制在理性支持的答案而不是意见或个人偏好,我将不胜感激。
答案 0 :(得分:5)
我应该只创建一个布尔二维数组并将包含一个皇后的每个位置更改为1,还是应该创建一个私有类来表示一个皇后,它有x和y坐标作为实例变量?
这些问题没有一个通用的答案。任何一个都适合特定情况,解决具体问题。
如果我们从不使用Java的模块化功能,那么为什么要使用Java呢?我们也可以用C或Python编写相同的东西。
Java是OO语言的事实并不意味着我们必须为我们需要表示的每一段数据定义和使用类和对象。
如果我正确理解您的问题,您就会询问实施细节。面向对象编程并不是特别关注具体的实现细节,因为它关注封装这些实现细节背后的合适接口,它很好地代表了一些重要的领域概念。因此,类的客户端不需要知道也不需要考虑它的实现细节,只需要了解接口所代表的更高级抽象。
答案 1 :(得分:2)
我应该制作一个布尔2-D数组 并改变每个位置 包含一个女王到1或我应该做 一个代表女王的私人班级, x和y坐标为 实例变量?
这取决于您的需求。例如,如果您需要迭代并检查每个方格以确定是否有王后我会选择第一种方法,但如果您只有两个或三个皇后并根据它们的相互配置存储坐标做出决定作为一个阶级的女王,对我来说是一个更好的主意。
这似乎不太重要或 紧迫,但我正在使用Java和它 有点接近这个概念的核心 OO编程。如果我们永远不会使用 Java的模块化功能,那么为什么 完全使用Java?我们可能也有 用C或Python编写相同的东西。
有能力使用OOP并不意味着它总是最好的解决方案,有时创建一个单独的类而不是使用原始类型只会使事情复杂化并使代码更难以支持。
答案 2 :(得分:1)
在这种情况下,具有皇后区的二维数组(单独的类但不包含x,y坐标)或布尔(表示是否存在皇后)应该是正确的选择。 理由如下:
您必须清楚地定义系统中每个对象的角色,以便能够以可扩展和可扩展的方式进行设计。易于使用。不清楚每个对象究竟会做什么可能会导致在路径的某个地方做出错误的决定,这本身会导致更糟糕的决定,直到它变得如此臃肿,随着你的黑客和变通办法决定重新开始:)
答案 3 :(得分:1)
我知道你不想要一个意见,但无论如何我都会给你一个:没有一般情况。软件设计的艺术在于能够根据应用程序的具体情况在数据和代码结构中做出适当的选择。 OO语言为您提供了更具表现力的设计调色板,但没有适用于各种情况的硬性规则。
所以,这是意见。现在,以你的具体例子为例。我可能会问自己一个问题:什么更有用?一个单独的部分知道它在板上的位置,或者知道每个部件在哪里?如果你没有一个单独的板子概念,即以包含碎片的二维阵列的形式,那么每次你需要用一块东西做一些事情时,你将不得不问每件作品。如果你只有几件,这可能就好了,但是你拥有的碎片越多效率越低。
相反,如果,比方说,你有一个非常大的棋盘 - 500x500 - 并且只有几个棋子,那么2D阵列的效率非常低,因此稀疏的数据结构可能会更好。
另一种看待它的方法:如果你有更多的单件那么它们将被保存在某种数据结构中,可能是数组,或2D数组,或链表,或数组链表,或其他什么。您要选择哪种数据结构?为什么?
答案 4 :(得分:0)
您可以使用您描述的任何一种方法充分代表电路板的状态。最适合使用的方法取决于我们尚未被告知的系统所需的行为。
答案 5 :(得分:0)
我应该制作一个布尔2-D数组 并改变每个位置 包含一个女王到1或我应该做 一个代表女王的私人班级, x和y坐标为 实例变量?
这实际上是两个问题:
正如其他答案所指出的那样,答案是1.这取决于。使用最适合您所需算法的数据结构。
2.答案是:是的,我总是会在一个类中包装数据结构(无论你使用哪个,坐标列表或数组)。即使课程听起来很琐碎,如果你使用课程,你会立即显示你的职位。如果您只使用2D阵列,人们将不得不想知道它的作用。另外,你可以在课堂上使用合适的方法,强制执行不变量(例如< 10皇后)等......所有的OO善良: - )。