OOP-Tetris的哲学设计问题

Cla*_*diu 14 oop

您正在用Java编写俄罗斯方块程序.您将如何根据以下方面设置课程设计?

  • Piece class:有一个Piece类,内部数组决定了作品的形状,而不是七个Piece类,每个作品一个.它们都是一个通用Piece类的子类.
  • Piece类表示:有一个4个实例的数组Block,代表一个方块的一个,每个Block包含它在Board上的位置(在图形坐标中)而不是具有4x4数组,这null意味着那里没有块,并且确定了位置通过阵列的形状.
  • 位置:阵列中或阵列Block中的每个位置都存储其位置,并且知道构成它们的位置.PieceBoardPieceBoardBlocks
  • 生成一块:有一个Piece类的静态方法getRandomPiece,或者PieceFactory你在其中创建一个实例的genRandomPiece方法.
  • 操作当前部分:使用Proxy模式,以便需要访问它的所有内容只使用代理,或者getCurrentPieceBoard类上有一个方法,并在您想要使用当前部分执行某些操作时调用它.

这不是功课.我只是对我的大学里介绍CS课程的内容不和,我想看看人们普遍认为的是什么.什么被认为是"好"的OOP设计?忽略这是一个介绍课程的事实 - 你会怎么做?

Tom*_*ing 10

首先,我不会将该Piece类子类化,因为它是不必要的.所述Piece类应该是能够描述不使用继承的任何形状.恕我直言,这不是继承所做的,它只会让事情复杂化.

其次,我不会将x/y坐标存储在Block对象中,因为它允许两个块存在于同一个地方.这些Piece类将保持一个包含块对象的网格(即2D数组).x/y坐标将是2D阵列的索引.

至于获取随机片段的静态方法vs工厂对象,我会使用工厂对象,因为工厂对象可以被模拟用于测试.

我会把董事会视为一个大Piece对象.的Board类将保持大Piece对象作为成员变量,并且可能保持其他Piece作为正在播放的当前片的物体,以及要被播放的下一个片.这是使用组合来完成的,以避免继承.

  • +1继承是不必要的,甚至是有害的,因为我们希望所有部分具有相同的行为.这些碎片的形状和颜色不同.我能想到你想要特殊行为的唯一例子就像是俄罗斯方块DS中的"t-spin"奖励得分,但这可以作为评分代码中的特殊情况更好地处理.不要使用类层次结构来替代if(){}语句. (3认同)