【问题标题】:Java more methods or more functionality in a method? [closed]Java 更多方法还是方法中的更多功能? [关闭]
【发布时间】:2018-10-17 15:54:41
【问题描述】:

我是 Java 编程新手,目前正在开发一个移动理论机器人的程序。有这样的方法会更有效/更好的做法吗

public void turn(String direction, double power) { /* code */ }

或喜欢

public void turnLeft(double power) { /* code */ }
public void turnRight(double power) { /* code */ }

是纯符合preference/readability还是有标准?

【问题讨论】:

  • 为什么不全部三个?实现所有三个方法,因此用户可以调用turn(String, double),如果他/她喜欢,但您也可以提供turnLeft(double)turnRight(double) 以方便。一些评论:而不是传递一个String,你可以传递一个自定义的Direction枚举——而不是power,我会建议一个更容易说话的名字,例如rad(用于弧度)或degree(用于-井-度)。
  • 这取决于你。我在turnLeftturnRight 看到的一个问题是机器人可能会在这两个极端之间做一些事情。然后你可能很难用两种方法来表达这种行为。
  • 我认为是单转方法还是左转、右转完全取决于您...只需按照以后对您(或其他任何人)易于调试和理解的方法进行操作
  • 我只喜欢一种方法,因为没有方向的力量似乎没用,一种方法可以拥有所有逻辑,因此可维护性更好。如果这两种方法是完全独立的,那么就会保持分离以实现松散耦合。
  • 请注意,设计和风格问题通常比这里更适合Software Engineering;我们只关注特定问题。

标签: java code-cleanup clean-architecture


【解决方案1】:

public void turn(String direction, double power) 有一个问题,方向是String,因此调用者可以传递一个无效的值。建议在这里使用Enum

enum Direction {
  LEFT, RIGHT,...
}

我会说选择一个是主观的……不过,我更愿意为每个方向使用一种方法。也许如果枚举实例不止少数,那么只有一种方法是有意义的。如果您添加新方向(例如 ZIGZAG),则无需添加新方法(但您的实现仍需要处理该新枚举/方向)。

考虑来电者必须如何打电话并选择更有意义的电话。

【讨论】:

    【解决方案2】:

    我会建议,而不是左或右,该方法应该采用度数,无论是顺时针还是逆时针(只要我们停留在 2d 的上下文中),因此是一个布尔值。

    因此方法应该有以下签名,

    public void turn(boolean clockwise, double degree, double power) { /* code */ }
    

    这样机器人就不会被限制为只能进行 90 度的运动。

    将其分成两种方法在逻辑上似乎不正确。

    【讨论】:

    • 如果可以使用像Direction.(LEFT | RIGHT) 这样可读的东西,为什么要使用(n 不可读)boolean
    • @Turing85:如果机器人想顺时针移动 30 度怎么办?
    • 如果我们可以同意顺时针旋转是右旋转并且该方法将power解释为度数,那么它将是turn(Direction.RIGHT, 30.0d)
    • 当布尔值绰绰有余时,您不需要强制使用枚举。在旋转上下文中,只能有两个方向,顺时针或逆时针。争论是否使用 enum 和 boolean 是不值得的。 BTW boolean (native and just takes a bit) 比枚举快得多:)
    • "当布尔值绰绰有余时,您不需要强制使用枚举。" - 当然,但您仍然对 true 的含义有歧义(是顺时针?逆时针?左?右?...),这是通过使用带有描述性名称的Enum 来消除的——“BTW boolean 比 enum 快得多”——我怀疑。初始对象创建(即枚举实例)有一些边际开销。枚举的比较是内存地址的比较,因此是原子操作。你有一些性能数据来证明你的主张吗?
    【解决方案3】:

    第二个更易读。一般来说,自动描述的方法或变量是最好的。

    如果你想使用第一种方法,我的提示是使用Enum 而不是String。使用Enum,您可以避免输入错误(左与左),并且代码更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2010-11-18
      • 2016-10-09
      • 2021-03-05
      • 2013-02-27
      相关资源
      最近更新 更多