我是否遵循具有此结构的 SRP?
Am I following the SRP with this structure?
我正在尝试为 Autocad 编写一个插件,在那里,他们有这些扩展词典,您可以在其中将数据保存到 Autocad 对象中,这样当您关闭图形文件时,保存的数据仍然存在。
现在我需要4个函数来操作扩展字典:
- exist - 用于检查扩展字典是否存在
- create - 用于创建扩展字典
- set - 用于设置扩展字典中的数据
- get - 用于从
扩展字典
目前,我有一个 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 很难处理。例如参见 [=10=] class。这个 class 应该包含一个 Send()
方法吗?一个方法可以发送自己吗?或者应该有另一个class MessageSender
?
有些人使用 SRP 只是为了让 classes 越来越小,这可能最终导致 classes 只包含一种方法。但是属于一起的方法应该在一起。一个很好的帮助是如何决定相同的内容 class 是:如果我必须更改一个功能,通常我必须更改几个方法。这些方法应该在同一个 class 中。如果我总是同时更改相同的两个 classes,那么这些 classes 可能应该合并。如果我只更改 class 的一部分或另一部分,但绝不会同时更改两个部分,则应该拆分 class。另见 https://hackernoon.com/you-dont-understand-the-single-responsibility-principle-abfdd005b137
回到消息示例:如果发送消息的机制与消息包含的数据完全无关,则两个 classes Message
和 MessageSender
可能会更好。如果消息的格式与消息的发送方式密切相关,那么使用单个 class 可能会更好。但这总是一些主观的考虑。
对于您的代码:我会把它放在一个 class 中。参见示例 List<T>
:这是一个用于操作列表的 class,而不是 ListAdder<T>
、ListInserter<T>
、ListRemover<T>
,...如果您的 autocad 更改,您将不得不同时更改检查某物是否存在、创建等的算法。这就是为什么它们属于一个 class.
我正在尝试为 Autocad 编写一个插件,在那里,他们有这些扩展词典,您可以在其中将数据保存到 Autocad 对象中,这样当您关闭图形文件时,保存的数据仍然存在。
现在我需要4个函数来操作扩展字典:
- exist - 用于检查扩展字典是否存在
- create - 用于创建扩展字典
- set - 用于设置扩展字典中的数据
- get - 用于从 扩展字典
目前,我有一个 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 很难处理。例如参见 [=10=] class。这个 class 应该包含一个 Send()
方法吗?一个方法可以发送自己吗?或者应该有另一个class MessageSender
?
有些人使用 SRP 只是为了让 classes 越来越小,这可能最终导致 classes 只包含一种方法。但是属于一起的方法应该在一起。一个很好的帮助是如何决定相同的内容 class 是:如果我必须更改一个功能,通常我必须更改几个方法。这些方法应该在同一个 class 中。如果我总是同时更改相同的两个 classes,那么这些 classes 可能应该合并。如果我只更改 class 的一部分或另一部分,但绝不会同时更改两个部分,则应该拆分 class。另见 https://hackernoon.com/you-dont-understand-the-single-responsibility-principle-abfdd005b137
回到消息示例:如果发送消息的机制与消息包含的数据完全无关,则两个 classes Message
和 MessageSender
可能会更好。如果消息的格式与消息的发送方式密切相关,那么使用单个 class 可能会更好。但这总是一些主观的考虑。
对于您的代码:我会把它放在一个 class 中。参见示例 List<T>
:这是一个用于操作列表的 class,而不是 ListAdder<T>
、ListInserter<T>
、ListRemover<T>
,...如果您的 autocad 更改,您将不得不同时更改检查某物是否存在、创建等的算法。这就是为什么它们属于一个 class.