我经常对书中所说的“改变的理由”或“改变的轴心”感到困惑。
我有一门课,让一个角色用手抓住一个物理物体。
可抓取对象本身是另一个类,它知道如何获得这些“抓取点”,因此抓取类知道在哪里放置字符的手。
我认为这是正确的,因为每个班级都有不同的责任。
但是它们是如此的耦合,所以对它们来说仅仅是一个类几乎是有意义的。这会不会打破SRP,因为现在类扫描抓取点,也移动/附加字符的手到对象,同时仍然使用内聚?
发布于 2022-06-05 13:16:24
SRP没有告诉您当类做了不止一件事情时要划分类。无论如何,这是模棱两可的,因为程序是功能层次结构--程序所做的所有“事情”都是一组较小的东西。
SRP告诉你,当班级有一个以上的责任时,就应该把他们分开,就像一个有两个老板的工人一样。这会引起问题,因为一个老板的指示可能与另一个老板想要的不一致。
在您的情况下,您需要一个处理抓取操作的类是有意义的。当你想改变抓取的工作方式时,你会修改这个类--这是它的责任。
对于每种类型/类型的对象都应该有一个类,这个类应该确定对象的抓取点,以及对象的所有其他属性,比如它的形状。这是您想要更改对象时修改的类--这是它的责任。
您是否需要一个单独的扫描类来扫描对象定义中的抓取点?可能不会。我通常希望object类有一个返回其抓取点的方法。按照其他坚实的原则,对象类必须实现一个单独的Grabbable接口才能被抓取,并且这个接口将定义返回抓取点的方法。
因此,希望您现在理解SRP的含义,但请记住,没有最好的方法来划分您的程序并确定这些职责范围。决定如何以一种最能满足所有功能和组织需求的方式来完成这一任务,主要是因为软件设计是什么,这并不容易。
特别是,如果您正在制作一个游戏,那么研究实体、组成部分、系统模式。这是一种非常流行的构建游戏实现的方法,可能会产生与您所想的完全不同的分解。
发布于 2022-06-05 14:10:37
很难说这些类是否可以合并为一个类,然而,乍一看,您似乎有两个责任,例如:
所以我会坚持两门课。因为如果我们只使用一个类,那么这个类将有两个被更改、调试或编辑的理由。因此,如果您的类更小,并且只有一个目标,那么以后编写单元测试就更容易了。
https://stackoverflow.com/questions/72503455
复制相似问题