Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何避免在使用MVP方法的方法中传递大量参数_Android_Mvp - Fatal编程技术网

Android 如何避免在使用MVP方法的方法中传递大量参数

Android 如何避免在使用MVP方法的方法中传递大量参数,android,mvp,Android,Mvp,我有一个包含大量注册字段的注册屏幕,当用户单击“注册”按钮时,我将字段值传递给演示者。在presenter中,我验证这些值并创建一个对象。问题是register()方法中有大量参数。我想我应该避免这种情况,但我不知道怎么做。也许你可以探索一下。 它允许在需要传递大量参数时保持代码干净。 当您不知道将要传递的参数的确切数量时,它也非常有用,因为其中一些参数可能不是强制性的 实际上,你会有这样的想法 MyObject myObject void register() { myObject =

我有一个包含大量注册字段的注册屏幕,当用户单击“注册”按钮时,我将字段值传递给演示者。在presenter中,我验证这些值并创建一个对象。问题是register()方法中有大量参数。我想我应该避免这种情况,但我不知道怎么做。

也许你可以探索一下。 它允许在需要传递大量参数时保持代码干净。 当您不知道将要传递的参数的确切数量时,它也非常有用,因为其中一些参数可能不是强制性的

实际上,你会有这样的想法

MyObject myObject
void register() {
    myObject = MyObject.Builder(<mandatory arguments>)
               .argument1(<argument 1>)
               .argument2(<argument 2>)
               ...
               .create();
    if (myObject == null) fail();
    else dosomething();
}
MyObject MyObject
无效登记册(){
myObject=myObject.Builder()
.1()
.2()
...
.create();
如果(myObject==null)失败();
else dosomething();
}

我之前做过的一种方法是在每个必须完成的字段上使用TextWatcher:

myEditText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}

    @Override
    public void afterTextChanged(Editable s) {
        presenter.myEditTextChanged(s.toString());
    }
});
然后让演示者中的相应方法更新您的实体。这样,当用户最后单击“注册”时,所有详细信息都将在演示者中等待

它还有一个优点,就是您可以在用户进行验证时进行验证,即在所有字段都有效之前,注册按钮不会启用


如果您使用的是ButterKnife、RxBinding或DataBinding,那么代码也会更简洁。

主要问题是不创建对象,而是将参数传递给演示者。我可以在视图中创建模型对象并将其传递给演示者,但根据MVP,我应该将所有逻辑(即验证和创建对象)移动到演示者层MMM也许我对MVP不够专业,但我认为如果您有一个视图要求用户提供一些数据,它必须将这些信息发送给演示者,但它不需要是对象本身。我可能错了,但如果在视图中使用生成器模式创建对象,则验证和逻辑在create()中进行,因此视图不需要知道任何逻辑,只需要检查创建的对象是否为null。但是,我不知道create()方法是否是presenter或model的一部分。如果我在视图中创建本地实体,则在不编辑视图的情况下,无法将此实体对象替换为另一个实体对象。视图不应该知道实体对象、业务逻辑等。我认为实体对象模型内部不应该有任何逻辑。我认为,正如我所说的,作为非专家,视图创建了一个在别处定义的对象,具有自己的逻辑。视图只是将其知识局限于创建它所需的参数,而不知道如何管理它们。在MVP逻辑中,您可以完全更改对象定义内部的逻辑,而无需更改一点视图,但是您仍然需要一个接口来使不同的层相互通信。我认为,无论您使用100个参数还是仅使用1个参数,这都是有效的:视图必须如何保存一些变量并将它们传递给其他层。