OOP - 我是否过于复杂?
我正在看我的一些项目,并将它们与我在github上看到的东西进行比较,我觉得我过度思考。我喜欢OOP,但我觉得我制作的文件太多,班级太多。OOP - 我是否过于复杂?
例如,在一个小型项目中,我有一个跳棋游戏,我有很多文件可能都会进入一个文件/类。我怎么知道我什么时候想过我的解决方案?这是我的一些文件的样子;
|src
| |- player.cpp
| |- piece.cpp
| |- color.cpp
| |- ...
当然,还有更多的文件会处理像规则,设置游戏,GUI等东西。但在这个简短的例子中,你可以看到我的项目如何能够变得非常大。这是常见的,用这种方式写东西?或者,我应该简单地写一个player.cpp
文件,其中包含多个类,在这种情况下,这些类是相关的并且会设置件/颜色/特征信息等。
每班应设计和编程来完成一个,只有一个,事情 因为每个类被设计成只有一个责任,许多类用于构建一个完整的应用程序
是,分发您代码到多个文件是一个很好的做法,因为它使您的项目可维护。
我可以看到你对一个小项目的担忧(值得吗?),但是在真正的大项目中,如果你不这样做,最终会让人们在一个大文件中永远滚动,并通过搜索文件找出他们正在寻找什么。
尽量保持文件紧凑,并且每个文件一个类,每个类都强健且目标明确。
有时,我们写函数文件。对于每一个小内联函数都有一个文件是不明智的,它会无故增加文件的数量。在文件中有一系列功能会更好(例如与打印相关的功能)。
最后,它可能是基于意见的,它是文件大小和文件数量之间的理想平衡点,但我希望自己清楚。
太过分了,我认为你应该用它来分隔OOP文件的方法是一种单一责任范式。每个班级都应该在您的问题空间中完全代表一件事情。所以你应该绝对有一个类(通常是afile),用于'player'和一个类'piece'等。这与单个责任范式类似,每个函数代表单一行为。 总之,类是名词,因为功能是动词。 – Spaceman1701
实际上,您提出了两个截然不同的问题:“什么是分离功能到类的良好粒度”和“什么是组织项目文件结构的良好实践”。两者都相当广泛。
第一个答案可能会遵循单一责任成语。第二个答案是让文件夹结构类似于命名空间结构(例如在boost中)。将当前存储在src
文件夹中的所有方法都不适用于C++,因为它会导致较长的文件名,以防止在具有相同名称的类出现在不同名称空间中时名称冲突。较大的项目确实倾向于拥有太多的文件,因为一个类需要4-5个文件。这就导致了为项目选择适当粒度的另一个问题......
人们往往担心“太多班级”或“太多文件”,但这在很大程度上是历史遗留问题。 40年前,当我们在穿孔卡上编写程序时,必须携带大型托盘和其中的一些盒子(并且不要扔掉它们!),这肯定会成为一个问题。 35年前,当你能够获得PC的最大硬盘是33MB时,这是一个问题。今天,如果您不考虑购买SSD小于512GB的PC,并且可以访问TB级和PB级的在线存储,那么程序占用的文件数量和字节数对开发流程来说基本上是无关紧要的。
这对我们人类意味着什么,我们应该利用这种丰富的能力来改善我们代码的其他方面。如果更多文件可帮助您更好地理解代码,请使用更多文件。如果更长的文件名可以帮助您更好地理解代码,请使用更长的文件名。如果遵循像“每个类一个.cpp和一个.h文件”这样的规则可以帮助人们维护代码库,那么遵循规则。关键是要关注真正重要的问题,例如“是什么让代码更易于维护,更易读,更容易理解我和我的团队?”
解决此问题的另一种方法是询问“文件数”是否是确定代码是否可维护的有用指标?虽然这个数字显然对应用程序来说太低了,但我不能告诉你10或100或1000是否是合适的数字(至少不知道它们包含的类的数量)。因此,它似乎不是一个有用的指标。
这是否意味着一个程序应该有1000个文件全部堆积到一个文件夹中,全部编译并链接到单个库或可执行文件中?这取决于,但似乎在同一个命名空间中的1000个类会有点拥挤,并且由此产生的程序可能太单一。在某些时候,您可能会想要将架构重构为更小,更有凝聚力的包,每个包都有适当的责任区。当然,没有人能告诉你这个幻数是什么,因为它完全取决于应用程序。但是,这不是驱动这种决定的文件数量,而是这些文件应该在逻辑或体系结构上相互关联。
看起来像这属于[软件工程](https://softwareengineering.stackexchange.com/) – gman
最后,它是(主要)你必须处理你的代码库 - 所以要留意任何你的代码导致你痛苦的方面。当你注意到你花了很多时间来维护某些东西,或者你的代码库的一个特定方面正在给你带来麻烦时,花点时间思考它为什么会给你带来麻烦,以及如何改变你的方法来减少或者消除问题。然后尝试新方法,看看它是否有帮助;如果确实如此,则将其作为新的“最佳做法”;如果没有,抛出它并寻找其他东西。重复,直到你快乐:) –
^^在上述过程结束时,你不仅会知道什么方法对你有用*(与其他人可能与你的想法不同),但你也会很好地理解你为什么要按照你的方式来做事情,而不是以其他方式做事 - 因为你以另一种方式尝试了它,并且不喜欢它。 –