【问题标题】:When exactly does a method have side effects?一个方法究竟什么时候有副作用?
【发布时间】:2010-10-23 01:21:22
【问题描述】:

正如我一直理解的那样,对程序状态(或与 IO 相关的任何事情)的任何更改都是副作用。更改是发生在全局变量中还是发生在调用该方法的对象的私有字段中都没有关系。因此,所有不返回任何内容的方法要么什么都不做,要么有副作用。
我的困惑来自我们大学的一位讲师(他还是一名学生,因此还不是全知的;))告诉我设置者没有副作用。

【问题讨论】:

    标签: language-agnostic oop definition side-effects


    【解决方案1】:

    你的导师弄错了。对于没有在此处粘贴整篇文章的 SO 编辑表示歉意,这就是维基百科要说的:

    http://en.wikipedia.org/wiki/Side_effect_(computer_science)

    金钱报价#1:

    在计算机科学中,如果一个函数或表达式除了产生一个值之外,还修改了某些状态或与调用函数或外部世界有可观察的交互,则称其具有副作用。

    金钱报价#2:

    在存在副作用的情况下,程序的行为取决于过去的历史;也就是说,评估的顺序很重要。

    非 NOP 设置器始终满足该标准。

    【讨论】:

      【解决方案2】:

      getter 和 setter 只是 get_ 和 set_ 方法的语法糖。它们可能绝对有副作用(尽管当调用者想要增加一个计数器或其他东西时开始调整大量字段可能是个坏主意)。

      【讨论】:

        【解决方案3】:

        首先:我知道与语言无关的标签!“runako”非常正确地回答了这个问题。但通常你想将你的知识应用到现实世界中,所以我想我也很乐意提供一个以更务实的方式解决这个问题的答案。

        在处理像 c++、c# 或 java 这样的现实世界语言时,即使是 nop 函数也会有实际的副作用,可能导致代码被执行!

        想想静态构造函数。尽管规范并不总是指定为类运行静态构造函数的时间,但大多数时候它将是第一次访问该类的方法或成员的时间点。

        C# 中的示例:

        class NotSoObvious
        {
            static NotSoObvious()
            {
                CauseSomeSideEffects();
            }
        
            // calling this can cause the constructor to run first!
            public static void DoNothing()
            {
                return;
            }
        }
        

        更重要的是,即使是一个根本没有被调用的方法也会导致副作用! 想想反射(程序查询有关其自身结构的信息的能力)。 当一个方法存在但未被调用时,它仍然可以通过反射检测到。

        一个没有调用它的方法肯定会对输出内部方法数量的程序产生副作用!

        这一切都归结为:如果您想了解一个方法的实际副作用,您首先必须确定您甚至认为是什么“副作用”。

        【讨论】:

          猜你喜欢
          • 2014-09-09
          • 2023-02-25
          • 2015-10-12
          • 2019-12-31
          • 2021-04-15
          • 2017-12-11
          • 2011-11-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多