函数参数最佳实践

2024-01-13

我对函数参数的使用有疑问。

过去,我总是编写代码,将函数所需的所有信息作为参数传入。 IE。不使用全局参数。

然而通过查看其他人的代码,不带参数的函数似乎是常态。我应该注意到,这些是类的私有函数,并且作为参数传入的值实际上是该类的私有成员变量。

这会导致代码看起来更整洁,我开始倾向于将其用于私有函数,但希望了解其他人的观点。

E.g.

Start();  
Process();  
Stop();  

比以下内容更简洁、更具可读性:

ParamD = Start(paramA, ParamB, ParamC);  
Process(ParamA, ParamD);  
Stop(ParamC);  

从方法的角度来看,它确实破坏了封装,但从类的角度来看,它没有破坏封装。


原则上让函数访问对象字段没有任何问题,但是您给出的特定示例让我感到害怕,因为简化函数调用的代价是您混淆了数据的生命周期。

要将您的 args 示例转换为字段,您将具有以下内容:

void Start() {
    // read FieldA, FieldB, and FieldC
    // set the value of FieldD
}

void Process() {
    // read FieldA and do something
    // read FieldD and do something
}

void Stop() {
    // read the value of FieldC
}

Start() sets FieldD通过副作用。这意味着调用可能无效Process()直到你打电话之后Start()。但代码并没有告诉你这一点。你只有通过搜索才能知道在哪里FieldD已初始化。这是在寻求错误。

我的经验法则是,函数应该只访问对象字段,如果它是always可以安全地访问该字段。如果它是在构造时初始化的字段,那么最好,但存储对协作者对象或其他内容的引用(可能会随着时间的推移而改变)的字段也可以。

但是,如果除非另一个函数产生了一些输出,否则调用一个函数是无效的,则应该传入该输出,而不是将其存储在状态中。如果您将每个函数视为独立的,并避免副作用,您的代码将更易于维护且更易于理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数参数最佳实践 的相关文章

  • $_GET 作为 PHP 函数中的参数

    我有同样的问题 但是 我根据使用标头的 if 语句将用户重定向到通过函数构造的动态页面 为了使该函数正常工作 需要在标头的 GET 部分中传递参数 根据提供的答案 这是一种不好的做法 我应该用什么方式来做呢 function page ti
  • R - 获取与用户函数中的正则表达式模式匹配的表列表

    我希望在 R 中创建一个用户函数 它合并多个使用正则表达式来查找这些表的表 在我的情况下 我想合并我的环境中以 m 开头的所有表 这正是我想要的 Reduce function merge all TRUE mget apropos m 但
  • 如何获取函数内的函数对象(Python)

    我想要有类似的东西 def x print get def name 但不一定知道名字x 理想情况下它会返回 x 其中 x 是函数的名称 您可以使用 Python 的内置检查库来完成此操作 如果您想处理更复杂的情况 您可以阅读更多其文档 但
  • 如何将惰性变量传递给函数参数而不对其求值,除非返回

    这个问题是针对python的 尽管我不介意用户分享其他语言的经验 基本上我的问题是尝试将惰性变量传递给函数 就我而言 我可能无法控制该函数 因此无法更改它以将生成器作为输入 示例 请注意 dict get 是函数的示例 但它很可能是 foo
  • Rails 3:使用 AJAX 请求更新 URL 参数

    我有一个过滤器和一个产品列表 id 名称 创建日期 我可以按 ID 名称或创建日期进行过滤 通过 AJAX 请求 我更新了内容 div 但显然 URL 没有改变 如何将参数附加到 URL 例如 localhost 3000 dashboar
  • 如何在 Swift 方法中将字典作为参数传递?

    我在代码中创建了以下方法 func SignIn objDictionary Dictionary
  • 将数据框列作为参数传递给 mutate 函数

    我有一张表 其中有五列 年份 GDP 收入 收入 和 工资 通过这张表 我用下面的代码进行了计算 library dplyr DATA TEST lt data frame Year c 2000 2001 2002 2003 2004 2
  • 函数声明的返回类型中的 & 符号如何工作? [复制]

    这个问题在这里已经有答案了 在这段代码中 为什么 f 被声明为 double f 它是什么意思以及它是如何工作的 我什至不知道要谷歌什么才能找到我的问题的答案 请帮忙 double a 1 b 2 double f double d d 4
  • 查找提供的 Sum 值的组合

    我有一系列这样的数字 myvar 57 71 87 97 99 101 103 113 114 115 128 129 131 137 147 156 163 186 现在我想计算所有这些可能的组合 长度为1到20 其总和等于给定的数字m
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • 如何在 jQuery 中声明和使用函数

    我想知道如何在 jQuery 脚本中声明函数 我现在拥有的 function adjust menu alert test test 但是当我这样称呼它时 first link click function adjust menu 它不起作
  • 在ASP CLASSIC中使用SQL参数,对象定义不正确错误

    我试图使用参数保护我的 INSERT 语句免受 SQL 注入 但由于某种原因我收到错误 Parameter object is improperly defined Inconsistent or incomplete informatio
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 为什么在我的函数输出后打印“None”?

    我尝试编写这段代码 def smaller x y if x gt y print y else print x print smaller 2 3 我得到这个结果 gt gt gt 2 None 哪里去了None来自 这是什么意思 See
  • 使用自定义服务的编译器传递加载 Symfony 的参数

    根据这个问题如何从数据库加载 Symfony 的配置参数 Doctrine https stackoverflow com q 28713495 8945214我有一个类似的问题 我需要动态设置参数 并且我想提供来自另一个自定义服务的数据
  • 为什么我的函数将布尔值更改为“on”?

    所以我是 php 编程世界的新手 我正在在线学习和其他形式等 但我找不到任何东西来帮助回答我的问题 这就是我在这里的原因 任何帮助当然不胜感激 谢谢 我想将下面的代码变成我可以调用的函数 它的工作原理如下所示 如果我选中表单中的复选框 它会
  • 从函数体内访问函数对象的属性

    JavaScript 中的函数也是一个对象 并且可以具有属性 那么有没有办法从它自己的函数体内部访问它的属性呢 像这样 var f function console log some way to access f a f a Test f
  • 什么是异地退货?

    什么是非本地退货 什么场景下有用 请举个例子来解释一下 这是一篇好文章 http yehudakatz com 2010 02 07 the building blocks of ruby 关于在 ruby 块的上下文中使用非本地返回 Ru
  • CodeIgniter:My_Lang 中的 get_instance

    我发现这个有用的国际化代码 http pastebin com SyKmPYTX http pastebin com SyKmPYTX 一切正常 除了我无法在此类中使用 CI 函数 我想从 DB 设置 languages 和 special
  • 奖励*完整*初学者的代码项目[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为刚接触编程的人提供的课程通常包括一个代码项目 我认为这是一种很好的学习方式 然而 这样的项目往往让人感觉过于做作 因此做起来并没有多大回

随机推荐