《了解设计原则SOLID,让系统更好维护》介绍了SOLID的前世今生,今天介绍它的第一个原则。
单一职责原则,Single-responsibility principle (SRP),这个原则的定义其实非常模糊:
A class should have only one reason to change.
你可以有多种理解:
- 一个类应该只有一个被改变的原因
- 一个类只应该做一件事,即其职责
- 其职责就是这个类会被修改的原因
系统维护性问题来源,不同业务的系统实现被强制凑在一起,导致当某个组件某个业务发送改变时,会影响其他服务的稳定性。
SRP建议,任何一个组件都应该只是因为同一类业务的需求而发送变动,就是说组件应该只针对这个需求负责。一个组件不该它做的事就不能和它有关系。
SRP是软件架构整洁的理念前提,解决了组件耦合的问题,所以在设计之处就应该践行SRP,否则后续就难修改了。
举个例子:
from pathlib import Path
from zipfile import ZipFile
class FileManager:
def __init__(self, filename):
self.path = Path(filename)
def read(self, encoding="utf-8"):
return self.path.read_text(encoding)
def write(self, data, encoding="utf-8"):
self.path.write_text(data, encoding)
def compress(self):
with ZipFile(self.path.with_suffix(".zip"), mode="w") as archive:
archive.write(self.path)
def decompress(self):
with ZipFile(self.path.with_suffix(".zip"), mode="r") as archive:
archive.extractall()
这个例子中,FileManager类有两个不同的职责,分别是文件读写和文件解压缩,该类违反了单一责任原则,因为它有两个改变内部实现的原因。
为解决这个问题,可以将该类拆分成两个更小、更集中的类,每个类都有自己特定的关注点,如下:
from pathlib import Path
from zipfile import ZipFile
class FileManager:
def __init__(self, filename):
self.path = Path(filename)
def read(self, encoding="utf-8"):
return self.path.read_text(encoding)
def write(self, data, encoding="utf-8"):
self.path.write_text(data, encoding)
class ZipFileManager:
def __init__(self, filename):
self.path = Path(filename)
def compress(self):
with ZipFile(self.path.with_suffix(".zip"), mode="w") as archive:
archive.write(self.path)
def decompress(self):
with ZipFile(self.path.with_suffix(".zip"), mode="r") as archive:
archive.extractall()
SOLID原则中第一个原则就是SRP,可见其重要性,如果为避免未来复杂的耦合性,先从它做起。
欢迎关注我的公众号,搜索:虞大胆的叽叽喳喳 或者 yudadanwx,文章比较杂,涉及到编程语言、Linux、大数据、分布式、DevOps、AI、微服务、K8s/Docker等等,希望全方位给初学者一点帮助,积累或巩固知识,体验到技术的美妙。