【问题标题】:(void method type vs method that returns) for altering a private global variable [closed](void方法类型与返回的方法)用于更改私有全局变量[关闭]
【发布时间】:2015-07-01 18:18:10
【问题描述】:

假设我们有一个名为 x 的全局变量,如下所示:

public class test
{
    private int x = 0;
    //lots of code here...
}

现在假设我们希望在某个任意点更改类测试内的 x 值(而不是从类外部)。

有两种方法可以做到这一点:

使用 void 方法:

public class test
{
     private int x = 0;
     //lots of code here...
     changeX();

     private void changeX()
     {
         // calculate stuff
         this.x = newXValue;
     }
}

使用 int 类型方法:

public class test
{
     private int x = 0;
     //lots of code here...
     x = changeX();

     private int changeX()
     {
         // calculate stuff
         return = newXValue;
     }
}

有什么理由让我选择一个而不是另一个?安全原因?可读性?

我在整个程序中都发生了这种情况,并且无法决定使用哪种约定。

【问题讨论】:

  • 您显示的代码在您标记问题的任何语言中均无效。所以,哪一个更好,因为两者都无法编译。
  • 您的示例都不会在 C# 中编译。
  • 不是一个与语言无关的问题 - 如果它是“正确”的,环境会影响很大。
  • 这是一个与列出的语言有关的逻辑问题,而不是特定于代码的问题。
  • 您提供了一些代码,就好像在类的主体中执行了一些“主”代码。事实并非如此。在一个方法中运行这个“主要”代码会破坏我相信的问题的目的,因为它会在一个 void 方法本身中运行,进而调用另一个方法。请通过提供的编译代码阐明您想要什么。

标签: java c# c++ oop


【解决方案1】:

如果我们在这里清楚地谈论私有的东西(私有方法和私有字段),那么我几乎总是更喜欢方法的函数版本:返回值。

如果您可以将所有计算封装在此方法的主体中,那么我认为没有理由强制它也更新私有字段。方法应该做一件事,并且做好。只需计算并返回该值,然后让类中其他地方的调用代码随心所欲地使用它,因为该代码将了解总体情况。

但是,您显然会将方法的名称更改为 calculateY() 之类的名称,其中 Y 不会引用您的字段名称,而是它所包含的数据(字段 X 将命名描述它对类的用途,而 Y 描述它是如何计算的,这可能是也可能不是 2 个不同的东西,具体取决于用例。

【讨论】:

  • 但由于副作用,它不是“功能性”版本;不管它叫什么。一些语言(以及围绕此类的生态系统)是严格的修改/读取拆分,而另一些则鼓励修改+返回..
  • @user2864740 该方法没有副作用,它只是计算并返回一个值。然后调用者将该值分配给该字段与否,但这取决于调用者,这不是调用该方法的副作用。也许我说的不是很清楚,我想我现在已经澄清了。
  • @user2864740 关于您评论的第二部分,我认为这更多地取决于精确的用例和计算,而不是语言/生态系统。我可能是 Java 或 C,我仍然会发现最好将计算与你用它做的事情解耦(我必须在这里准确地说我们正在谈论一个 private 方法,这不能一概而论到公共方法)。
【解决方案2】:

只要您的代码对班级保持私有,我认为没有理由会出现安全问题。我个人会选择该方法的 void 版本,因为任何调用 changeX() 方法的人也可以直接访问 x (都在同一个类中)。返回 int 开启了对局部变量执行的操作的可能性,而这些操作应该在类变量上执行。

【讨论】:

  • 是什么让你认为它“应该[总是]在类变量上执行”
猜你喜欢
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2023-03-18
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多