Oop 将信息传递给内部方法:使用字段还是参数?

Oop 将信息传递给内部方法:使用字段还是参数?,oop,architecture,Oop,Architecture,我有一个带有公共方法的类,该方法需要几个参数,如下所示: Process方法需要调用不同的私有方法来实际处理数据。传递所有参数更好,还是应该使用字段向私有方法提供信息 // Variant 1: Parameters public void Process(string param1, string param2, int param3) { processStep1(param1, param2, param3); processStep2(param1, param2);

我有一个带有公共方法的类,该方法需要几个参数,如下所示:

Process方法需要调用不同的私有方法来实际处理数据。传递所有参数更好,还是应该使用字段向私有方法提供信息

// Variant 1: Parameters
public void Process(string param1, string param2, int param3)
{
   processStep1(param1, param2, param3);
   processStep2(param1, param2);
   processStep3(param1, param2, param3);
}

// Variant 2: Fields
public void Process(string param1, string param2, int param3)
{
   m_Param1 = param1;
   m_Param2 = param2;
   m_Param3 = param3;

   processStep1();
   processStep2();
   processStep3();
}
在我看来,变体1的优点是没有副作用(方法无法更改字段的值)。如果涉及到单元测试,它可能会有优势,因为测试特定功能更容易

变体2在我看来更清晰。您不必传递任何参数,必要时可以更改字段的内容


有明确的赢家吗?这两种方法都有效吗?何时使用哪种方法?

根据您对问题的描述,我认为变体1是一个明显的赢家,因为正如您正确指出的那样,它比变体2有更多的优势。副作用和可测试性是巨大的因素

我要补充的是,变量2是一种全局状态,没有必要。为什么要让对象中不需要的方法使用成员变量?这是什么东西?您有使用这些成员变量的其他方法吗? 变体1的每个步骤都有一个清晰的接口,您不会陷入访问其他状态的陷阱,而这些状态实际上无法从参数中获得

如果构造函数初始化函数过程所需的成员变量,并且仅用于此过程方法,我只会选择变量2