3

我正在使用带有 Eclipse 的 ObjectAid 为我最新的 Java 项目生成 UML 类图,我目前有一些这样的情况,其中我有两个接口之间的依赖关系,以及其中一个接口的实现之一. 这foo是我正在使用的图形库。

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

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

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

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

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

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

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

4

1 回答 1

3

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

您想问某种模式是否理想?但问题是:什么是“理想”?我将引用 Scot Meyers 的文章非成员函数如何改进封装:谈到封装,有时少即是多。这篇文章是关于 C++ 的,但他试图传达的概念适用于任何语言。

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

你应该问的问题是:

可能会破坏多少代码是计算可能受到影响的功能。也就是说,如果更改一个实现比更改另一个实现会导致更多潜在的功能损坏。

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

  • 如果您更改了 ITexture 实现,需要更改多少代码或会中断多少代码?
  • 当前的实现是否足够健壮。
  • 您可以通过当前实施扩展多少系统?
于 2013-11-11T07:35:59.787 回答