【问题标题】:How to handle class dependency with interfaces and implementatons如何使用接口和实现处理类依赖关系
【发布时间】:2013-11-13 00:59:46
【问题描述】:

我在 Eclipse 中使用 ObjectAid 为我最新的 Java 项目生成 UML 类图,我目前有 a handful of situations like this,我在其中有两个接口之间的依赖关系,以及其中一个接口的实现之一.这里,foo 是我正在使用的图形库。

在前面的示例中,FooCanvasITexture 对象绘制到屏幕上,FooCanvas 及其接口ICanvas 都将ITexture 对象作为其方法的参数。

canvas类中导致这种依赖的方法如下:

void drawTexture(ITexture texture, float x, float y);

此外,我尝试使用 Java 的泛型对方法签名进行变体:

<T extends ITexture> void drawTexture(T texture, float x, float y);

这样的结果是一个类图,其中接口和实现类之间只有依赖关系,而画布对象对纹理没有依赖关系。我不确定这是否更理想。

接口和实现对另一个接口的依赖是预期的模式,还是典型的和/或可能将实现与其接口依赖“隔离”?还是泛型方法是理想的解决方案?

【问题讨论】:

  • ICanvas 和 ITexture 中公开了哪些方法?
  • 也许你可以给我们更多的实现,否则就像我在回答中所说的那样很难判断。
  • 在drawTexture中,使用了texture中的哪些方法?

标签: java architecture


【解决方案1】:

你的问题是你试图解决错误的问题。面向对象设计的要点之一是鲁棒性和灵活性,您可以在不更改/破坏其他代码的情况下更改特定实现的程度。

您想问某种模式是否理想?但问题是:什么是“理想”?我将引用 Scot Meyers 的文章 How Non-Member Functions Improve Encapsulation: When it comes to encapsulation, sometimes less is more. 这篇文章是关于 C++ 的,但他试图传达的概念适用于任何语言。

封装是一种手段,而不是目的。封装本身并没有什么可取的。封装之所以有用,只是因为它在我们的软件中产生了我们关心的其他东西。特别是,它产生了灵活性和鲁棒性。

你应该问的问题是:

可能会破坏多少代码是计算可能被破坏的函数 做作的。也就是说,如果改变一种实现会导致更多 可能会损坏的功能而不是更改另一个功能 实施。

关于你的例子,别人告诉你什么是理想的并不是特别容易。你应该公开ITexture 接口吗?您是否应该引入一个名为 IDrawable 的新接口,该接口由 Texture 扩展?目前的做法是可以的。但我实际上并不知道,因为我不知道实现!如果您更改纹理实现,也许一切都会中断! **这是一个只有您在考虑到我上面提到的要点时才能回答的问题:

  • 如果您更改 ITexture 实现,需要更改多少代码或会中断多少代码?
  • 当前的实现是否足够健壮。
  • 当前的实现可以扩展多少系统?

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2021-08-10
    • 2015-05-11
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多