我正在努力理解单一责任原则如何与OOP合作。
如果我们要遵循T恤的原则,那么我们是不是留下了许多课程,其中许多课程可能只有一个方法?
如果我们不完全遵循这个原则,那么该原则的重点是什么?
答案 0 :(得分:6)
我喜欢用这种方式陈述单一责任原则:"你写的每件事 - 每个模块,类,接口或方法都应该有一个作业。它应该执行整个作业,而仅那个作业。
请注意,您编写的这些内容中的一些是大(模块),一些是小(方法),一些是介于(类)之中,而一些大的东西是由较小的东西组成的。
这不是问题,因为工作或职责也有各种规模,可以分层次地分解。例如,警察部队的工作是“保护和服务”。 - 一项工作,分解为"巡逻街道","解决犯罪"等,每个都可以由不同的单位处理。这就产生了协调的需要(一项不同的工作),每个单位的工作分解为个别官员的工作等。
对于每一个重要的工作,有很多方法可以将其分解为较小的工作,并且每个工作都可以通过遵循SRP和其他SOLID原则的软件设计来建模。决定如何解决问题是软件设计艺术的重要组成部分。
答案 1 :(得分:1)
一个班级应该处理一个主题,这是它的唯一责任。课程Car
可以包含startEngine()
等方法或weight
:
class Car
{
int weight;
void startEngine();
void stopEngine();
}
当然,你可以更多地分解这个课程。例如,通过为引擎定义类:
class Engine
{
start();
stop();
}
class Car
{
Engine engine;
int weight;
}
但不会定义启动和停止引擎的单独类,如:
class EngineStop
{
stop();
}
class EngineStart
{
start();
}
class Car
{
EngineStart engineStart;
EngineStop engineStop;
int weight;
}
原则是尽可能合理地分类,以实现抽象。抽象太深违反了这一原则。
答案 2 :(得分:1)
单一责任期由Rober C. Martin介绍。这一原则的主要座右铭是改变的理由。一个类或模块应该只有一个,而且只有一个要改变的原因。这个原则的主要好处是使类更加健壮。一个类或模块的更改不会破坏另一个类。
它可以防止对象成为反对模式示例的上帝对象。它还可以防止Ravioli代码(一个包含许多微小的,紧密耦合的对象的源代码)。
因此,单一责任原则是OOP中良好源代码设计的重要组成部分。
答案 3 :(得分:0)
我倾向于将单一责任原则(以及许多经验法则,模式和模型)视为思考问题的一般方式。它意味着引导您改进代码,但不一定明确规定解决方案的外观。因为最终软件设计是一个邪恶和主观的问题。
我不认为SRP应该总是导致一堆单一的功能类。虽然如果你有一些想要抽象出来的复杂逻辑,有时可能会出现这些问题。但是,一般而言,您应该倾向于具有高度内聚功能的类,其中方法为:
都与相同的抽象相关
分享常见的依赖关系
所有操作都处于相同的抽象级别
您实际上想要尽可能多地分组功能,同时保持上述条件并牢记您的抽象是多么容易理解。最终,单一责任原则的目标是帮助管理复杂性并使代码更易于理解。
答案 4 :(得分:0)
在分解职责之前,你应该知道班级应该做什么。它应该做那件事,只有马特在他的回答中提到的那件事。以最简单的方式实现这个想法,只是为了使它工作。那就是你将你写的责任分解成责任的时候。
分解代码时要考虑的重要事项是确保在分解代码后它是可读的。
答案 5 :(得分:-1)
这是对单一责任原则的一种常见误解,即一个班级应该只有一个功能。一个班只负责一件事并不意味着一个班级应该只有一个函数。单一责任原则意味着在逻辑上将您的功能分成不同的类而不是混淆事物。
一个非常简单的例子就是说,如果你要创建一个计算器,你可以纯粹为同一类中的计算器添加所有功能(加,减,乘,除等)。您不需要为计算器的每个功能创建单独的类。但是,如果要将计算结果打印到打印机,则不要将打印逻辑写入计算器类内的打印机,因为打印到打印机不是计算器类的责任。为打印机创建一个单独的类,并在该类中编写与打印相关的逻辑。 如果您在Calculator类中编写打印功能,那么您违反了单一责任原则。
答案 6 :(得分:-1)
我引用Robert C. Martin的书Clean Code:
单一责任原则(SRP)声明一个类或一个 模块应该有一个,只有一个,有理由改变。这个原则 为我们提供了责任的定义和指导 班级人数。课程应该有一个责任 - 一个理由 变化