Class 对于对象在OO编程中的粒度,是否有经验法则?

Class 对于对象在OO编程中的粒度,是否有经验法则?,class,oop,Class,Oop,我正在学校学习OO编程,在接下来的几个月里,每项作业都涉及到骰子游戏和文字游戏,比如jumble和hangman。每个作业都要求我们为这些变量创建一个新类;HangmanWordArray、JumbleWordArray等。为了可重用性,我想创建一个类(或一系列类),可用于我的作业。我很难想象那会是什么样子,希望我的问题有意义 让我们假设类将包含具有访问器和变异器的属性,以及返回各种对象的方法…一个单词、一个字母、一个骰子。如何组织这些课程有经验法则吗 每个类保留一个对象是最好的吗?或者将所有对

我正在学校学习OO编程,在接下来的几个月里,每项作业都涉及到骰子游戏和文字游戏,比如jumble和hangman。每个作业都要求我们为这些变量创建一个新类;HangmanWordArray、JumbleWordArray等。为了可重用性,我想创建一个类(或一系列类),可用于我的作业。我很难想象那会是什么样子,希望我的问题有意义

让我们假设类将包含具有访问器和变异器的属性,以及返回各种对象的方法…一个单词、一个字母、一个骰子。如何组织这些课程有经验法则吗

每个类保留一个对象是最好的吗?或者将所有对象分组到一个类中,因为它们都与“我需要分配的内容”相关,或者按数据类型分组,所以所有数值对象都在一个类中,所有字符串都在另一个类中


我想我正在努力解决程序员在现实世界中如何决定如何在一个类或一系列类中对对象进行分组的问题,以及我应该用来构建这种设计场景的一些问题和思考过程。

现实地说,它因项目而异。没有任何保证的“正确方式”来分组任何内容;这完全取决于你的需要。归根结底是可管理性,这意味着您可以多么轻松地读取和更新旧代码。如果您可以将所有游戏包含在一个“games”类中,那么这样做没有错。然而,如果游戏非常复杂,有许多子类和变量,那么将它们全部移动到自己的类中可能更容易管理

也就是说,有一些方法可以对项目进行逻辑分组。例如,如果您有很多用于操作的solo函数(char-to-string、string-to-int、html编码/解码等),您可能会决定创建一个“helper-functions”类来保存它们。类似地,如果应用程序使用数据库连接,则可以创建一个类来保存和管理共享连接,还可以创建获取查询结果和执行非查询的方法

有些人试图把事情分解得太多。例如,他们可以创建一个类来创建和管理数据库连接,而不是使用上面提到的数据库核心。他们将创建另一个类,然后使用连接类来处理查询。并不是说这种方法不起作用,而是当项目分割得太小时,它可能会变得非常难以管理


如果不知道你在做什么,就没有办法告诉你怎么做。如果在每个项目中重用相同的方法,那么也许可以将它们放在可以共享的地方。我发现,要想知道什么最有效,最好的办法就是尝试一下,看看它的反应如何

我看到人们所做的是分解他们的对象和方法,直到每个方法都只是少数代码;如果任何方法超过了一页代码,他们将尝试进一步分解对象结构以缩短时间

我个人不反对冗长的方法,只要它们可读。我认为“一页限制”往往会造成太多的粒度,并且会带来更多的混乱而不是更少的风险。但这似乎是当前的时尚


只是报告我在野外看到的情况。

作为一名老COBOL黑客,他习惯于在办公桌上堆积一英寸高的扇形折叠,我非常喜欢长类和方法……这对我掌握OO架构和设计非常不利。:)好吧,在掌握窍门之前,可以使用方法的“一页限制”作为经验法则。一旦你习惯了分解对象结构,你总是可以后退一点。我过去常常过度规范化数据库(规范化很好!),直到我发现有一点,即多了一个维度表只会让一切变得更困难,而且没有必要。但这是一个很好的练习。实际上,我一直试图将自己限制在Visual Studio中的一个面板上,这样我就可以在选项卡之间翻转,而不是翻转和滚动。到目前为止,这是相当成功的。当我决定坚持下去时。:)过去一页规则有一个优点,当你使用打印输出时,一页就是一页。但现代的视频屏幕太小,无法容纳许多方法,而且,正如你所说,随意分解东西会使人困惑,而不是照亮。答案是“不”——没有经验法则。知道如何分手需要经验。5-10年后,你开始做对了。(忘了“可重用性”——这是一个虚构的问题。)这个问题似乎离题了,因为它是关于OOP的,而不是一个特定的编程问题。“我发现找出什么最有效的方法就是试一下,看看它如何响应!”——非常正确!