我正在尝试为 Autocad 编写一个插件,在那里,他们有这些扩展词典,您可以在其中将数据保存到 Autocad 对象中,以便在您关闭图形文件时,保存的数据仍然存在。
现在我需要 4 个函数来操作扩展字典:
扩展词典
目前,我拥有的是一个 ExtensionDictionaryManager.cs,它被部分分解为 4 个 .cs 文件,如下所示:
partial class ExtensionDictionaryManager
{
public bool Exist() {...}
}
partial class ExtensionDictionaryManager
{
public bool Create() {...}
}
partial class ExtensionDictionaryManager
{
public bool Set() {...}
}
partial class ExtensionDictionaryManager
{
public bool Get() {...}
}
这是否遵循单一职责原则?或者我应该将其进一步分解为 ExtensionDictionaryCreator
, ExtensionDictionaryChecker
, ExtensionDictionarySetter
和 ExtensionDictionaryGetter
?我担心的是,如果我确实将其分解为绝对单一的职责,而不是将相关功能组合在一起,并且在整个程序中始终如一地执行此操作,我最终会得到这么多对象。
这样做的正确方法是什么?
最佳答案
SRP 很难处理。参见例如 Message
类(class)。这个类是否应该包含 Send()
方法?一个方法可以发送自己吗?或者应该有另一个类MessageSender
?
有些人使用 SRP 只是为了让类越来越小,这可能最终导致类只包含一种方法。但是属于一起的方法应该保持在一起。一个很好的帮助是如何确定应该在同一个类中的内容是:如果我必须更改一个功能,通常我必须更改几个方法。这些方法应该在同一个类中。如果我总是同时更改相同的两个类,则这些类可能应该统一。如果我只更改类(class)的一个部分,或另一部分,但从不同时更改两个部分,则应拆分该类(class)。另见 https://hackernoon.com/you-dont-understand-the-single-responsibility-principle-abfdd005b137
回到消息的例子:如果发送消息的机制与消息包含的数据完全无关,则有两个类Message
和 MessageSender
可能会更好。如果消息的格式与如何发送消息密切相关,那么最好有一个类。但这总是一些主观考虑。
对于你的代码:我会把它留在一个类(class)。参见例如 List<T>
: 这是一个用于操作列表的类,而不是 ListAdder<T>
, ListInserter<T>
, ListRemover<T>
, ... 如果您的 autocad 发生变化,您将不得不同时更改检查某物是否存在、创建等的算法。这就是为什么他们属于一类。
关于c# - 我是否遵循这种结构的 SRP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67898699/