gpt4 book ai didi

python - 如何维护多依赖的SRP(单一职责原则)?

转载 作者:太空宇宙 更新时间:2023-11-04 09:51:15 25 4
gpt4 key购买 nike

我对类必须依赖于其他因素的情况感到困惑。

例如

class Storage:
def __init__(self):
self.logger = Logger()
self.client = Elasticsearch()

def index(document):
try:
self.client.index(document)
except ElasticsearchException as e:
self.logger.error(str(e))

这里我的类必须有记录器和一个 Elasticsearch 对象来执行它的操作。在可能有两种情况下我的类必须更改的情况下,我如何维护 SRP,例如:

  1. 我切换到不同的数据库
  2. 我切换到不同的日志库

有人可能会争辩说,我应该让客户端类处理异常,而不是在这里记录。但是在客户端只是yielding 要插入的文档并且接受索引操作失败的情况下,客户端类不会为错误而烦恼。此外,即使我将异常重新抛给客户端类,也会在那里出现相同的 SRP 问题。

如果能根据我的情况给出解释性答案,我将不胜感激。

最佳答案

我认为部分问题出在标题中:“.. 具有多个依赖项”。您的依赖项是高度耦合的,因为在您的 Storage 类中实例化。这就是为什么我会使用依赖注入(inject)(我有 0 python 知识,可能是一些错字):

interface StorageClientInterface:
def index(document)

interface LoggerInterface:
def error(Exception e)

class ElasticSearchStorage implements storageClientInterface:
def index(document):
// implements ElasticSearch specific storage logic

class MyDefaultLogger implements LoggerInterface:
def error(Exception e):
// implements MyDefaultLogger specific logging logic, totally agnostic from ElascticSearch

class Storage:
def __init__(self, StorageClientInterface storageClient, LoggerInterface logger):
self.client = storageClient
self.logger = logger

def index(document):
try:
self.client.index(document)
except Exception as e:
self.logger.error(e)


// usage
elasticSearch = ElasticSearch()
logger = MyDefaultLogger()
document = Document();
storage = Storage(elasticSearch, logger)
storage.index(document)

这样,您的存储类就不会与您的存储策略或日志记录策略耦合。它只知道它可以使用这两个接口(interface)。如果你改变你的数据库,你不需要改变你的存储类中的任何东西,只要这个新的存储策略实现了你的 StorageClientInterface。如果您更改记录错误的方式,情况也是如此。只需实例化一个新的具体记录器,然后注入(inject)它。

关于python - 如何维护多依赖的SRP(单一职责原则)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47741605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com