功能参数最佳实践

Kil*_*are 3 language-agnostic parameters function

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

在过去,我总是编写我的代码,以便函数所需的所有信息都作为参数传递.即不使用全局参数.

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

这导致更整洁的代码和我开始倾向于私人功能,但希望其他人的意见.

例如

Start();  
Process();  
Stop();  
Run Code Online (Sandbox Code Playgroud)

更整洁,更可读:

ParamD = Start(paramA, ParamB, ParamC);  
Process(ParamA, ParamD);  
Stop(ParamC);  
Run Code Online (Sandbox Code Playgroud)

它确实从方法的角度来打破封装,但不是从类的角度来看.

Dav*_*les 6

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

要将您的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
}
Run Code Online (Sandbox Code Playgroud)

Start()FieldD由副作用设定.这意味着Process()在你打电话之后打电话可能无效Start().但是代码并没有告诉你.您只能通过搜索来查看FieldD初始化的位置.这是在寻找错误.

我的经验法则是,如果访问该字段始终是安全的,则函数应该只访问对象字段.如果它是在构造时初始化的字段,那么最好,但是存储对协作者对象或类似物的引用的字段(可能随时间变化)也是可以的.

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