【问题标题】:Correctness of Java code [closed]Java代码的正确性[关闭]
【发布时间】:2015-07-30 00:52:44
【问题描述】:

我的问题是要编写漂亮干净的 Java 代码。 假设我有这个方法:

public static int getRealPosY() {
    realPosY = (matrix.length -1) - pos.getPosY();
    return realPosY;
}

我打电话给:

matrix[posX][getRealPosY()] = 1;

这对你来说又好又干净??我知道我的方法返回一个 Int 但是......我不知道为什么......调用这样的方法对我来说似乎“奇怪”。我只是想学习写这个的正确方法....

我也可以写:

int y = getRealPosY();
matrix[posX][y] = 1;

但是像这样似乎对变量的访问是无用的。

或者我可以使用相同的变量“private static int realPosY;”:

realPosY = getRealPosY();
matrix[posX][realPosY] = 1;

但是,再次使用 get 方法的完全相同的变量似乎很奇怪。

我是 Java 的新手,所以我当然有点困惑。顺便说一句,如果有人想教我,那就太好了。非常感谢。

【问题讨论】:

  • getRealPosY() 实际上进行计算并设置全局变量的事实是“副作用”——我们不喜欢副作用!
  • @John3136 看起来是故意的,不是副作用。你说的副作用是什么意思。他本可以这样做,所以它只是这样做并且不返回值。我想返回一个值是一种更受欢迎的设计模式,但另一种方式也可以。它在那里完成了两种设计模式..
  • 方法是“获取一些东西”,而不是“计算一些东西设置一个全局变量然后返回它” - 在小型学习应用程序中肯定可以,但在“真实代码”中它是一个副作用和调试/维护很痛苦。在这种情况下,更好的解决方案可能是calculateRealPosY() { realPosY = (matrix.length -1) - pos.getPosY(); },直接在代码中使用realPosY即可。
  • @John3136 这不仅仅是故意的。我在代码中经常使用 getRealPosY(),因为我只是需要它。对我来说,创建一个方法(也只是用于计算)来做到这一点看起来更好。对我来说,这比每次计算都要写好得多.....
  • 您的第二个通话版本是最好的。最好将诸如索引值之类的东西“公开”,这样您就可以在调试时看到它们的值。不要担心创建另一个局部变量——它们在 Java 中实际上是免费的——不要“花费”任何东西。

标签: methods coding-style correctness


【解决方案1】:

在我看来

public static int getRealPosY() {
    realPosY = (matrix.length -1) - pos.getPosY();
    return realPosY;
}

不好,因为它不仅仅是获得一些价值,它还有改变全局变量realPosY的值的副作用。这在您自己的小程序中是可以的,但如果您与其他人(或在大型代码库中)一起工作,那么它会使代码更难调试和维护。

“正常”的解决方案可能是一种 calculateRealPosY() 方法,它只是设置全局,然后直接使用全局(我们不会打开关于为什么你首先有全局的 can-o-worms ;- )

如果它确实使您的调用代码更容易,那么 calculateRealPosY() 可以返回 realPosY 的新值 - 它仍然有点模棱两可,但比完全隐藏在 getter 中的副作用要好得多!

【讨论】:

  • 谢谢! ;) 。对我来说,你的回答很有用。
【解决方案2】:

矩阵是一个二维数组。数组的数组。显然 getRealPosY() 返回一个 int,方法是 int 类型。

通过这段代码,您指出这是对变量的无用访问……对。除非您发现它更易于阅读,否则它对您有用。有时,如果代码即使对于专业人士来说也更容易阅读,那么即使它不那么简洁,它也很有用。

int y = getRealPosY();
matrix[posX][y] = 1;

你举个例子

realPosY = getRealPosY();
matrix[posX][realPosY] = 1;

好吧,是的,如果它是 public static int realPosY,那么即使得到你可以说 getRealPosY(); 而不是 realPosY=getRealPosY(); 的值也是没有意义的。 (自从我做java以来​​已经有一段时间了,但我确信它接受调用像过程这样的函数)

这似乎也是一个有趣的设计模式(你称之为“怪异”),让一个函数(返回一个值)也在它之外设置一个变量。通常人们会选择一个函数,以便(我认识的一位讲师称之为)“建设性”而不是“破坏性”,即返回一个新值而不是更改现有值。

如果 realPosY 是在函数中本地声明或同时声明的,那么函数就不会在外部设置它,那么说 realPosY=getrealPosY()) 就太浪费了,因为 realPosY 不会t 还没有值,但你仍然可以将函数调用放在数组的 [] 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多