减少公共代码调用公共类的代码重复

Posted

技术标签:

【中文标题】减少公共代码调用公共类的代码重复【英文标题】:Reducing code duplication from common code calling common class 【发布时间】:2014-04-13 20:25:52 【问题描述】:

我有一个“A”类,几乎可以满足我的需求。 “B”类使用“A”类

我现在设计了“C”类和“D”类,并注意到“B”类、“C”和“D”类中有大量代码重复使用“A”类。我已经在每个类中的特定独立函数中分离出这段代码。

现在我想知道这段代码应该放在哪里。目前,函数在三个调用类(B、C 和 D)中重复。

将函数放入“A”类会破坏单一责任原则。添加功能的继承可能会破坏 SRP 和 LSP。

似乎可行的方法是作曲。

问:为几个函数设计一个完整的类是否超过了kill?

问:类“B”、“C”和“D”访问新类“E”(取决于 A)和旧类“A”(必须是与新类“E”中的实例相同的实例),还是应该新类“E”提供足够的功能以使 B、C 和 D 类不需要直接访问 A 类?它似乎是一个带有附加功能的不完整界面。

或者新的'E'类应该做些什么并将结果返回给B、C、D类,然后他们可以自己传递给'A'类。实际上,不,那无法工作,因为该类将不得不再次调用某些返回值。

或者我应该以完全不同的方式来做吗?

(为什么软件设计需要这么多思考?)

使用场景示例:

B 类:while ((A->DoSomething() == ERROR/TIMEOUT/etc) && (retries SetSomeParameters();

(实际代码更大)

【问题讨论】:

我认为您需要在问题中附加一个非常简单的示例。 这些重复的函数是否需要任何实例变量?或者它基本上是向函数发送一些东西并返回你需要的东西?例如,您发送一个以毫秒为单位的函数,它会返回一个以分钟、秒和毫秒为单位的时间字符串。 是的,这些函数需要实例变量,因为它们会检查依赖类的返回码并在某些情况下重试。 【参考方案1】:

如果如此重复的代码 (a) 很大 (ish),(b) 可能会同步更改为所有使用的类,因此 (c) 会冒着产生新错误的风险,我会选择创建一个包含该功能的(隐藏)类并根据需要继承它。

无论如何,请仔细考虑成本与收益。添加一个或多个函数版本会产生僵化,以后可能需要删除(再次拆分)。 “现在就开始工作,它可能以后会有用”往往只是为以后创造额外的工作(墨菲定律绝对无情)。整体架构比可能重复的细节更重要。

【讨论】:

以上是关于减少公共代码调用公共类的代码重复的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Clojure 中调用公共类的非公共方法?

避免公共类中的代码重复

无法访问类的公共属性

关于公共内部类的问题

公共属性列表及其值[重复]

类的公共成员及其访问