我应该将带有参数的私有状态传递给函数还是函数应该使用私有状态?

时间:2019-11-29 09:06:30

标签: angular architecture

我有一个具有以下情形的Angular应用程序,尽管我认为该情形也适用于其他框架/情形:

public export class FooComponent {
    private userId: number;

    constructor(private readonly authService: AuthService) { }

    ngOnInit() {
        this.userId = authService.GetUser().id;

        this.getDataByUserId(this.userId);    
    }

    private getDataByUserId(userId: number) { 
        // Load data using the param
    }

    public anotherFunction(fooId: number) {
       // Gets called by an event occurring or something
       // Perform an API Call

       // Now reload the data by using the private state variable.
       this.getDataByUserId(this.userId);
    }
}

getDataByUserId(userId: number)应该使用一个参数来接收userId还是应该没有参数,而只访问组件的private userId

在我看来,将变量作为参数传递的优点和缺点如下:

专业人士
-简化单元测试;如果组件更大,则可能不需要以特定方式设置组件即可工作,您只需要传递一个数字即可 -如果组件的许多功能都访问了该变量并对其进行了更改,那么您可能最终会遇到该变量处于无效状态的情况。

骗局
-如果您不再以特定方式设置组件,因为您只能将值作为参数传递,则在测试过程中组件的“状态”可能无法反映生产场景中的预期状态。由于您的测试不能反映实际的工作条件,因此它们可能被认为是脆性的。 -如果您输入了错误的值,事情将会/可能会出错。

在这里什么被认为是更好的选择?一个人划界线在哪里?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这取决于getUserDataById函数的实际用途。

是否总是使用存储在组件状态中的userId来调用它(所以它是某种currentUserId)?那么最好制作一个没有参数的getCurrentUserData方法,该方法将始终从状态中获取用户ID并对其进行测试。

如果您使用不同的用户ID源在组件或应用程序的不同部分中重用它,那么将其设为单独的功能并对其进行测试而没有组件状态的依赖似乎是合乎逻辑的。然后,当您测试anotherFunction时,应在需要时模拟getUserDataById