【问题标题】:Code design, method parameters代码设计、方法参数
【发布时间】:2014-01-29 12:58:07
【问题描述】:

我正在为 LWJGL 设计一个包装器,并且我有一个包装器类,它以类型安全的方式包装所有方法。但是,我遇到了一个我以前从未真正考虑过的问题。考虑我有这个方法,它接受一个枚举值和一个 int。

public static void glBindBuffer(Target target, int id) {
    GL15.glBindBuffer(target.glValue, id);
}

我有一个以面向对象的方式处理 OpenGL 缓冲区对象的类。它有一个静态方法(它是静态的,因为它处理全局状态),它只是将缓冲区对象与目标分离。我有两个选择;我可以接受 BufferObject 实例或 Target 作为参数,如下所示:

public static void detach(Target target) {
    GL.glBindBuffer(target, 0);
}

public static void detach(BufferObject bufferObject) {
    GL.glBindBuffer(bufferObject.getTarget(), 0);
}

哪个更好?

注意:我不希望用户必须直接调用 GL.glBindBuffer(..)

【问题讨论】:

  • 如果你想以面向对象的方式使用缓冲区,bufferObject.detach() 怎么样?
  • 两者都实现,让一个调用另一个。
  • @micha 整个类以面向对象的方式处理缓冲区对象,但是将 0 绑定到缓冲区对象并不特定于每个缓冲区对象。它还会给用户一个想法,即您必须从目标中分离所有缓冲区对象,但事实并非如此。
  • @helpermethod 我为什么要这样做?

标签: java wrapper lwjgl


【解决方案1】:

正如 helpermethod 提到的,最好的解决方案是像这样将一种方法包装到另一种方法:

public static void detach(Target target) {
    GL.glBindBuffer(target, 0);
}

public static void detach(BufferObject bufferObject) {
    detach(bufferObject.getTarget());
}

所以你支持程序员的两种方式。

如果你必须改变你的glBindBuffer行为,你只需要重写detach(Target)方法!

【讨论】:

  • 我会考虑的。它似乎解决了我对易用性的担忧,但我想知道它是否会引起混淆。
  • 这种方法重载在库中很常见,不应该造成任何混淆,因为方法做同样的事情。
  • 好的,那我就用这个(你已经说服了我:)),因为一般的观点似乎是两者都用。
【解决方案2】:

我建议选择第一个版本:

public static void detach(Target target) {
    GL.glBindBuffer(target, 0);
}

原因是这将BufferObjectdetach() 方法分离。这使您的代码更灵活一点,并使测试更容易。

【讨论】:

  • 这是我最初的想法,但我反对这样做是因为易于使用。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多