Oop 您如何定义单一责任?
我知道“班级只有一个改变的理由”。那到底是什么?是否有一些气味/迹象表明班级没有单一责任?或者,真正的答案可能隐藏在YAGNI中,并且在您的类第一次更改时仅重构为一个职责?您的类中的方法应该是内聚的……它们应该协同工作,并在内部使用相同的数据结构。如果你发现你有太多的方法似乎没有完全相关,或者似乎操作不同的事情,那么很可能你没有一个好的单一责任Oop 您如何定义单一责任?,oop,solid-principles,single-responsibility-principle,Oop,Solid Principles,Single Responsibility Principle,我知道“班级只有一个改变的理由”。那到底是什么?是否有一些气味/迹象表明班级没有单一责任?或者,真正的答案可能隐藏在YAGNI中,并且在您的类第一次更改时仅重构为一个职责?您的类中的方法应该是内聚的……它们应该协同工作,并在内部使用相同的数据结构。如果你发现你有太多的方法似乎没有完全相关,或者似乎操作不同的事情,那么很可能你没有一个好的单一责任 通常,最初很难找到责任,有时需要在几个不同的上下文中使用该类,然后在开始看到区别时将该类重构为两个类。有时你会发现这是因为你把抽象和具体的概念混合在一起
通常,最初很难找到责任,有时需要在几个不同的上下文中使用该类,然后在开始看到区别时将该类重构为两个类。有时你会发现这是因为你把抽象和具体的概念混合在一起。它们往往更难被看到,同样,在不同的上下文中使用将有助于澄清。一个明显的迹象是,当你的类最终看起来像一个,这实际上与SRP(单一责任原则)相反 基本上,所有对象的服务都应该专注于执行单个职责,这意味着每当您的类发生变化并添加一个不尊重这一点的服务时,您就知道您正在“偏离”正确的路径;) 原因通常是由于一些快速修复程序匆忙添加到类中以修复某些缺陷。因此,您更改类别的原因通常是检测您是否即将违反SRP的最佳标准。单一责任原则 有许多明显的例子,例如,
咖啡和汤工厂
。咖啡和汤放在同一个器具里可能会导致非常不舒服的结果。在本例中,设备可能被分为热水发生器
和某种搅拌器
。然后可以用这些成分建造一个新的咖啡厂
和汤厂
,避免任何意外混合
在更微妙的情况中,数据访问对象(DAO)和数据传输对象(DTO)之间的紧张关系非常常见。DAO与数据库对话,DTO可序列化,以便在进程和机器之间传输。通常DAO需要对数据库框架的引用,因此它们在既没有安装数据库驱动程序也没有访问数据库所需权限的富客户机上不可用
代码气味
- 类中的方法开始按功能区域分组(“这些是
方法,这些是Coffee
方法”)Soup
- 实现许多接口
- 如果你使用CRC卡,这是一个很好的指导方针。如果你在CRC卡上找不到该对象的所有责任,它可能做得太多了。。。最多7个可以作为一个很好的标记
- 重构书中的另一个代码味道是巨大的类。猎枪手术将是另一个。。。更改类中的一个区域会导致同一类中不相关区域出现错误
- 发现您一次又一次地对同一个类进行更改,以修复不相关的bug,这是该类做得太多的另一个迹象
- 如果你发现你需要几个“朋友”类或函数,那通常是坏SRP的好味道——因为你的类实际上并没有公开所需的功能
- 如果你最终得到了一个非常“深”的层次结构(一个很长的派生类列表,直到你得到叶子类)或“宽”的层次结构(很多很多类都是从一个单亲类浅派生的)。这通常是父类做得太多或太少的标志。什么都不做是限制,是的,我在实践中看到过,使用“空”父类定义只是将一组不相关的类组合在一个层次结构中
- 好吧,这一原理将与一些盐一起使用。。。避免班级爆炸
单个职责不能转换为单个方法类。它意味着存在的唯一原因。。。对象为其客户端提供的服务
一个留在路上的好方法。。。使用对象作为人物隐喻。。。如果对象是个人,我会要求谁这样做?将该职责分配给相应的类。然而,你不会要求同一个人来管理文件、计算工资、发放工资支票和核实财务记录。。。为什么要一个对象来完成所有这些任务?(如果一个班级承担多个职责,只要这些职责都是相关的、连贯的,就可以了。)
选择名字的困难几乎总是设计不好的征兆。也许比其他气味更具技术性:
我还发现重构到单一责任是困难的。当您最终开始使用它时,类的不同职责将交织在客户机代码中,这使得在不破坏另一件事情的情况下很难区分一件事情。我宁愿犯“太少”的错误,也不愿意犯“太多”的错误。写一篇简短但准确的描述,说明班级的工作
如果描述中包含“和”一词,则需要将其拆分。如果您在扩展类的功能时发现问题,而不担心最终会破坏其他功能,或者您无法使用类而不修改其大量选项,这些选项修改类的行为闻起来像是您的类做了太多事情 有一次我在工作