RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1220773
Accepted
Сергей Мишин
Сергей Мишин
Asked:2021-12-19 01:01:21 +0000 UTC2021-12-19 01:01:21 +0000 UTC 2021-12-19 01:01:21 +0000 UTC

更改方法的输入参数是不好的做法吗?

  • 772

一些编程语言允许您更改作为参数传递给方法的对象。但这可能会导致其他使用该代码的程序员根本没有预料到的副作用。

这是JS中的一个例子

let hierarchy = []; // Массив объектов
let hierarchyStack = []; // Массив объектов

let endConnection = function(currentConnection) {   
    addConnToParent(currentConnection);
    addToHierarchy(currentConnection);
    addPointsToConnection (currentConnection);  
};

let addToHierarchy = function(currentConnection) {  
    currentConnection = {'foo': 'bar'};
    hierarchy.push(currentConnection);  
};
    
let addConnectionToParent = function(currentConnection) {
    let parentConn = hierarchyStack[hierarchyStack.length - 2];
    // ... some code
    parentConn.children.push(currentConnection); // children - массив объектов
};

let addPointsToConnection = function(connection) {
    // ... some code
    connection.points = schemaData.slice(2, 4);  // points - массив объектов
};

在每个方法中,都修改了传递的对象。结果,在原来的方法中,经过三种方法,原来的阵列可能根本不像自己,被肢解得面目全非。


这是Java

class Test {
    public int hello = 111;
}

//....

public static void main (String[] args) throws java.lang.Exception  {
    Test a = new Test();
    System.out.println(a.hello);
    
    changeObjectValue(a);
    System.out.println(a.hello);
}

public static void changeObjectValue(Test b) {
    changeObjectValue2(b);
}

public static void changeObjectValue2(Test c) {
    changeObjectValue3(c);
}

public static void changeObjectValue3(Test d) {
    d.hello= 888;
}

底线:通过所有这些方法,这个对象“浮出水面”发生了变化。并且在不同的类中可以有不止一种这样的方法。

如果在流类型方法中不使用这个对象,那么这样使用和编写方法是否正确?什么时候返回修改后的参数而不产生副作用是正确的?

在什么情况下你可以改变论点并且它会很方便?

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    VladD
    2021-12-19T01:44:31Z2021-12-19T01:44:31Z

    不,这本身并不是坏习惯。关键是您和其他用户应该以一种明显的方式(最好从名称中)理解该功能究竟发生了什么变化。

    例如,如果函数具有签名

    void Setup(Connection connection)
    

    那么很明显,这样的函数除了副作用之外不能做任何事情,它建立了一个连接,并且只需要改变它的参数。

    如果函数看起来像一个纯函数,只从参数接收信息,并且只将结果作为返回值返回,那么它应该有相应的行为。例如,这里是加法函数:

    Point operator+ (Point& other)
    {
        this.X += other.X;
        this.Y += other.Y;
        return *this;
    }
    

    (熟悉,嗯?)完全没用。

    我建议不要混淆概念,并尝试制作这样的功能:

    • 或者你的函数只产生副作用,在这种情况下它是 void 类型(或者如果你不喜欢异常的想法,至少是一个表示成功或失败的 bool ),
    • 您的函数是纯函数或接近纯函数,根据传入的参数评估结果,并仅返回返回值。

    然而,这不是教条:例如,一个外在的纯函数可以在里面安排缓存。主要的是混合语义不应该是函数的公共契约。

    • 7

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5