假设你想写一个俄罗斯方块克隆,你刚开始计划。
你如何决定课程应该是什么?您是将单个块设为类还是仅使用不同的块类型?
我问这个是因为我经常发现自己编写的课程太多,或者写的课程太少。
答案 0 :(得分:10)
退后一步。
我怀疑你把马放在马前。 OOP本身并不是一件好事,它是一种有效解决问题的技巧。问题包括:“我有一个拥有多种技能和专业知识的大型多人团队组织。我们正在构建大型复杂软件,其中许多子系统相互交互。我们的预算有限。”
OOP适用于此问题空间,因为它强调抽象,封装,多态和继承。这些都适用于许多团队编写的大型软件空间。 抽象允许一个团队使用另一个团队的工作而无需了解实施细节,从而降低了沟通成本。 封装允许一个团队知道他们可以对内部结构进行更改以使其更好,而不必担心影响其他团队的成本。 多态性降低了使用给定抽象的许多不同实现的成本,具体取决于当前的需求。 继承允许一个团队以另一个团队的工作为基础,干净利用现有代码,而不是花时间和金钱重新发明它。
所有这些都不是好事,而是因为它们降低了大型团队复杂软件场景的成本。
他们是否可以降低单人琐事软件方案的成本?我不认为他们这样做;我认为他们会增加成本。继承点是通过代码重用来节省时间;如果你花费更多时间来获得完美的继承层次,而不是通过代码重用来节省时间,那不是净赢,而是净损失。与所有其他人类似:如果你没有相同的东西有很多不同的实现,那么花时间在多态上是一种损失。如果你没有任何人会使用你的抽象,或者你需要保护你的内部状态的任何人,那么抽象和封装是成本而没有相关的好处。
如果您想要做的是以OO风格编写俄罗斯方块,以便以该风格进行练习,那么请务必前进,不要让我阻止你。我只是说:不要觉得你有道德要求使用OOP来解决OOP不适合解决的问题; OOP并不是所有软件开发风格的全部。
答案 1 :(得分:5)
您可能想查看How do you design object oriented projects?。接受的解决方案是一个良好的开端。我也会拿一本design patterns书。
答案 2 :(得分:1)
对于俄罗斯方块克隆,你会更好,我会说创建一个块类并使用enum
或类似的来记录它的形状。原因是所有的块都以相同的方式起作用 - 它们下降,它们通过旋转或下降更快地对用户输入作出反应,并且它们使用碰撞检测来确定何时停止下降并触发下一个块。
如果每个类型都有一个类,那么每个类之间的差异就会很小,这会浪费时间。
在另一种情况下,你有很多相似的概念(比如许多不同类型的动物等),每个子类型都有一个类可能会让人觉得很有意义,如果子类型是彼此更加不同
答案 3 :(得分:0)
取决于您的开发方法。
假设你做敏捷,那么你可以先编写你认为需要的课程。然后,当您开始填写实现时,您会发现某些类已过时或其他类需要拆分。
假设有一个更先设计然后构建的方法(dsdm / rup / waterfall ...),那么你想要根据“用户故事”进行设计,请参阅SwDevMan81的链接以获取示例。
答案 4 :(得分:0)
我会制作一个基类片,因为它们每个都有类似的功能,如向右移动,向左移动,向下移动,旋转CW,旋转逆时针,颜色,位置,列表继续。然后每一件应该是一个子类,如ZPiece,LPiece,SquarePiece,IPiece,BackwardsLPiece等......你可能确实有很多类,但有许多不同类型的作品。
你要问的OOP点是继承。当涉及到向左/向右/向下移动等一些功能时,您不想重新发明轮子,也不想在多个位置重复确切的代码。这些函数不应该根据片段而改变,因此将它放在基类中。每个部分以不同的方式旋转,但它在基类中,因为每个类都应该实现它自己的版本。
基本上,所有部件都有共同点应该是基类。然后,使一件作品独一无二的一切都应该在课堂上。是的,我认为制作一个街区类,每件作品中有4个有点多,但有些人不同意我的意见。