责任分担后如何管理单一责任?


10

我有两堂课,OperationTrigger。每个类都有许多专门用于某些类型的操作或触发器的子类。一个Trigger可以触发特定的Operation。虽然Operation可以由特定触发Trigger

我需要编写将给定映射Operation到给定Trigger(反之亦然)的代码,但是我不确定将其放置在何处。

在这种情况下,代码显然不属于一个类或另一类。因此,就单一职责原则而言,我不确定代码应属于何处。

我可以看到三个选项都可以使用。虽然1和2似乎只是语义的选择,但3和3完全代表了一种不同的方法。

  1. 触发时,例如bool Triggers(Operation o)
  2. 关于操作,例如bool TriggeredBy(Trigger t)
  3. 在管理映射的全新类中,例如bool MappingExists(Trigger t, Operation o)

我应该如何根据单一责任原则决定将共享映射代码放置在何处?

责任分担后如何管理单一责任?


编辑1。

因此,实际代码如下所示。所有属性,或者是一stringGuidcollection<string>,或enum。它们基本上只是代表一小部分数据。

在此处输入图片说明

编辑2。

返回布尔类型的原因。另一个类将使用Trigger和的集合Operation。它需要知道在Trigger和之间存在映射Operation。它将使用该信息来创建报告。


为什么是布尔型?
图兰斯·科尔多瓦

@ user61852将结果返回到调用代码
James Wood

1
调用代码对布尔值有什么作用?根据您对这个问题的回答,我可能会找到解决方案。
图兰斯·科尔多瓦

@ user61852,请查看我的修改。
James Wood

1
因此,它与实际执行操作的触发无关吗?
图兰斯·科尔多瓦

Answers:


4

我会这样思考:如何确定哪个操作导致哪个触发器被触发。它必须是一个可以随时间变化或演变为多种算法的算法。将其放在Trigger或Operation类中意味着这些类将来将能够处理此类情况。注意,我认为它不像映射那样简单,因为它可能还有更多。

我的选择是使用适当的方法(例如GetOperationForTrigger(Trigger t))创建一个类。这使代码可以演变为此类类的集合,可以在运行时或其他变量(例如策略模式)中进行选择。

请注意,这种思路的主要假设是编写最少的代码(即今天的三个类),但是如果将来不需要扩展功能,则可以避免进行主要的重构,而不必假设总是存在唯一的方法来进行重构。确定哪个触发器导致哪个操作。

希望这可以帮助。尽管响应类似于user61852,但推理是不同的。结果,实现方式将有所不同(即,使用显式方法而不是覆盖等号,因此,方法的数量可以根据需要随时间变化)。


5

去过也做过。

选项#3。

我不知道您将使用哪种语言,但是我将使用与Java非常相似的伪代码。如果您的语言是C#,则可能具有相似的接口和结构。

有一个Mapping类或接口:

public interface Mapping {
    public void setObject1(Object o);
    public void setObject2(Object o);
    public Object getObjecto1();
    public Object getObjecto2();
}
  • 可以查询的集合的覆盖equals()方法,Mapping以了解Mapping它们是否包含给定的映射。
  • 特殊对象也应具有适当的equals()方法。
  • 同时实现接口Comparable,以便您可以对报告进行排序。

他们可以将映射简单地放入集合中

List<Mapping> list = new ArrayList<Mapping>();
Hat hat = new Hat();
Bag bag = new Bag();
list.add(new Mapping(hat,bag));

稍后您可以问:

// let's say you have a variable named x which is of type Mapping

if ( list.contains(x) ){
    // do some thing
}

0
  1. 将您的代码分解为更小的位。

当前,您有关于B类的A类知识和关于B类的B类知识。这就是很多耦合的过程。

根据定义,A至少在执行自己的操作,并检查是否应运行B。对于B,情况恰恰相反。无论第一个调用它的类是什么,都应该能够查看结果并查看是否需要进一步处理。

通过将类拆分为较小的组件,尝试打破这种耦合。我喜欢在每节课的顶部加一个注释,用简单的英语解释它的作用。如果您需要使用AND之类的单词,或者使用一两个句子,那么您需要考虑将其分解。通常,“和”之后的任何内容都应属于其自己的类

另请参阅是否可以定义一个涵盖触发器和操作功能的接口。如果您不能这样做,那就表示您的课程越来越大。这也将打破您的课程之间的联系。


1
老实说,我不确定是否可以进一步分解代码。我已经用类签名更新了我的问题,以便您可以看到,但基本上它们是相当轻量的数据对象,每个对象都存储一些属性。在耦合方面,是的,这有点问题,因为a实际上Trigger会耦合到a Operation。但这就是现实世界数据的样子。它们是耦合的,因为存在映射,例如,它们必须彼此了解才能具有含义。
James Wood
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.