两个不同的对象以相同的方式实现相同的接口——如何保持 DRY
Two different objects implement the same Interface in the same way - how to stay DRY
我有接口:
保证函数 getColor 的 IColored。
现在我有两个对象:
1.法拉利
2. 红苹果
两者都以相同的方式实现此 interface/function。
(但不能从同一对象继承 - 不允许多重继承)。
您将如何避免代码重复?
如果我对你的理解是正确的,你不能——不完全是。但是你可以这样接近:
TYPE
IColored = INTERFACE('GUID')
FUNCTION getColor : TColor;
END;
TFerrari = CLASS(IColored)
FUNCTION getColor: TColor;
END;
TRedApple = CLASS(IColored)
FUNCTION getColor: TColor;
END;
FUNCTION CommonFunction : TColor;
BEGIN
// Lots of code that ends with Result:=clRed
END;
FUNCTION TFerrari.getColor : TColor;
BEGIN
Result:=CommonFunction
END;
FUNCTION TRedApple.getColor : TColor;
BEGIN
Result:=CommonFunction
END;
即。将实际代码委托给对象层次结构之外的函数,以便您可以独立于 INTERFACE 实现调用它。
这是我所知道的实现您正在寻找的东西(最少的代码重复)的唯一方法(除了严重的低级黑客攻击)。
我猜你要找的是对象聚合。
查看 TAggregatedObject
。这个想法是有一个实现的对象
行为并作为 属性 它将接口函数委托给
内部对象。
DRY 是一个原则。作为一项原则,其目的是指导您采用被认为是最佳实践的方法。但是,由于它是 "just" 一项原则而非牢不可破的法律,因此需要知道何时应用它,何时应用它更可取。
我对 DRY 原则的看法是,这并不是因为 2 个函数的实现完全相同,所以它们不应该都存在,原因与您可以拥有多个具有相同值的常量的原因完全相同 ( ERROR_SUCCESS = NO_ERROR = SW_HIDE = 等等...)。语义和上下文很重要。
如果您明天更改了 1 个实现,是否还需要更改另一个?如果答案是否定的,我不认为你真的违反了 DRY 原则,或者至少我认为你不应该在这种情况下应用 DRY 原则。
当然,所有这些都带有主观色彩。
我有接口:
保证函数 getColor 的 IColored。
现在我有两个对象:
1.法拉利
2. 红苹果
两者都以相同的方式实现此 interface/function。
(但不能从同一对象继承 - 不允许多重继承)。
您将如何避免代码重复?
如果我对你的理解是正确的,你不能——不完全是。但是你可以这样接近:
TYPE
IColored = INTERFACE('GUID')
FUNCTION getColor : TColor;
END;
TFerrari = CLASS(IColored)
FUNCTION getColor: TColor;
END;
TRedApple = CLASS(IColored)
FUNCTION getColor: TColor;
END;
FUNCTION CommonFunction : TColor;
BEGIN
// Lots of code that ends with Result:=clRed
END;
FUNCTION TFerrari.getColor : TColor;
BEGIN
Result:=CommonFunction
END;
FUNCTION TRedApple.getColor : TColor;
BEGIN
Result:=CommonFunction
END;
即。将实际代码委托给对象层次结构之外的函数,以便您可以独立于 INTERFACE 实现调用它。
这是我所知道的实现您正在寻找的东西(最少的代码重复)的唯一方法(除了严重的低级黑客攻击)。
我猜你要找的是对象聚合。
查看 TAggregatedObject
。这个想法是有一个实现的对象
行为并作为 属性 它将接口函数委托给
内部对象。
DRY 是一个原则。作为一项原则,其目的是指导您采用被认为是最佳实践的方法。但是,由于它是 "just" 一项原则而非牢不可破的法律,因此需要知道何时应用它,何时应用它更可取。
我对 DRY 原则的看法是,这并不是因为 2 个函数的实现完全相同,所以它们不应该都存在,原因与您可以拥有多个具有相同值的常量的原因完全相同 ( ERROR_SUCCESS = NO_ERROR = SW_HIDE = 等等...)。语义和上下文很重要。
如果您明天更改了 1 个实现,是否还需要更改另一个?如果答案是否定的,我不认为你真的违反了 DRY 原则,或者至少我认为你不应该在这种情况下应用 DRY 原则。
当然,所有这些都带有主观色彩。