你什么时候定义一个班级?

时间:2010-02-10 15:08:51

标签: c# oop

假设你想写一个俄罗斯方块克隆,你刚开始计划。

你如何决定课程应该是什么?您是将单个块设为类还是仅使用不同的块类型?

我问这个是因为我经常发现自己编写的课程太多,或者写的课程太少。

5 个答案:

答案 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个有点多,但有些人不同意我的意见。