函数参数最佳实践

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(使用前将#替换为@)

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

  • 使用 EntityFramework 使用空参数值调用存储过程

    我在 sqlserver 2008 上有一个存储过程 其中一个参数接受空值 我不知道如何使用参数上的空值来调用该 SP 为了获得更多上下文 我正在使用 EntityFramework 6xx 在下一个示例中 参数 status Compat
  • Lockfree 标准集合和教程或文章

    有人知道用于无锁常用数据类型的实现 即源代码 的好资源吗 我正在考虑列表 队列等 锁定实现非常容易找到 但我找不到无锁算法的示例以及 CAS 的工作原理以及如何使用它来实现这些结构 查看 Julian M Bucknall 的博客 他 详细
  • 在 r 中的 unique() 函数中使用管道不起作用

    我在使用管道运算符 gt 和 unique 函数时遇到一些麻烦 df data frame a c 1 2 3 1 b a unique df a no problem here df gt unique a not working her
  • 为什么这个函数指针赋值在直接赋值时有效,但在使用条件运算符时无效?

    本示例未使用 include 在 MacOS10 14 Eclipse IDE 上编译 使用 g 选项 O0 g3 Wall c fmessage length 0 假设这个变量声明 int fun int 这无法通过 std touppe
  • 在 Python IDLE 会话中显示用户定义函数的列表

    是否可以在 IDLE 会话中显示所有用户功能的列表 我可以看到它们在自动完成中弹出 所以也许还有其他方法可以只显示为会话定义的用户功能 当您忘记函数名称时 它很有用 而且当您想确保在会话关闭时不会丢失函数的源代码时 这应该为您提供全局范围内
  • 从 jQuery 事件访问函数中的参数*和*事件

    这是我不久前问的另一个问题的后续问题 通常 您可以从 jQuery 事件的函数调用中访问事件 如下所示 item live click functionToCall 并在函数中 function functionToCall ev do s
  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID
  • C++ 从模板参数中解压参数包

    如何实现下面我想要的 我要解压的参数包不在函数参数列表中 而是在模板参数列表中 include
  • 将参数传递给基类构造函数

    如果基类和派生类都有带参数的构造函数 那么我们在哪里将参数传递给基类构造函数 像这样 public class DerivedClass BaseClass public DerivedClass int derivedParam Stri
  • 将命名参数传递给 Javascript 函数[重复]

    这个问题在这里已经有答案了 使用类似的方法调用 Javascript 函数 someFunction 1 true foo 不熟悉功能的话不是很清楚 我已经看到并使用了插入注释来命名参数的样式 someFunction itemsToAdd
  • 如何确定函数是否不返回任何内容?

    有没有办法在 PHP 中使用反射或其他方法来做到这一点 function a return null function b a a null b b null 如果您没有显式返回某些内容 则函数将返回null默认情况下 这就是 PHP 中函
  • 将 Repeater Container.ItemIndex 传递给 Javascript 函数

    在 C Asp Net 中 我需要将中继器出现索引传递到 Javascript 函数中OnClientClick从 ASP 按钮按下 这是我的代码
  • 渲染:带参数的动作

    我有一个有 2 种方法的类 第一个方法由视图使用一些 GET 参数 params page 调用 我想保存这些参数并通过渲染操作将它们发送到我的第二个方法 class exemple def first sql save of params
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • python:函数中的变量,点前面是函数名

    我需要理解这个概念 其中我们可以在函数定义中的变量名中使用点 这里没有类定义 也没有模块 Python 不应该接受包含点的变量名 def f x f author sunder f language Python print x f aut
  • 将 < 或 > 运算符作为参数传递给函数?

    我的函数里面有一个if 像这样的声明 if passedValue lt staticValue 但我需要能够传递一个参数来指示 if 表达式是像上面那样还是 if passedValue gt staticValue 但我真的无法通过 l
  • 接收字母并返回字母表中(从 0 开始)数字位置的 Python 函数

    我正在尝试创建一个 Python 函数 它接收一个字母 只有一个字母字符的字符串 并返回该字母在字母表中从 0 开始的数字位置 它不应该区分大小写 而且我不能使用导入 所以输入 a 应该返回 0 输入 A 也应该返回 0 输入 O 应该返回
  • JasperReports Server 参数依赖关系

    我有一份有两个输入参数的报告 两者都有一个保管箱 我可以在其中选择值 假设参数A 和参数B 是否可以使 ParameterB 依赖于 ParameterA 例如 如果我在 ParameterS 中选择汽车品牌 Honda 我应该只能看到 H
  • JavaScript - 声明嵌套函数的全局作用域?

    我尝试为嵌套 JavaScript 函数提供全局范围的尝试不起作用 DECLARE FUNCTION B IN GLOBAL SCOPE function B function A DEFINE FUNCTION B INSIDE NEST
  • 负整数的基数排序

    我正在尝试对整数 包括负整数 实现基数排序 对于非负整数 我计划为数字0 9创建一个10个队列的队列 并实现LSD算法 但我对负整数有点困惑 我现在的想法是继续为它们创建另一个包含 10 个队列的队列 并分别对它们进行排序 然后在最后 我将

随机推荐