Android MVP 对验证的怀疑
Android MVP doubts about validating
我开始在一个 Android 项目上实施 MVP 模式,我对在执行任何操作之前应该在哪里验证字段有一些疑问。
例如,如果我必须发送包含三个字段(姓名、电子邮件、文本)的表单。
我应该验证 activity 中的字段还是应该将它们发送给 Presenter 进行验证?
我还不能 100% 确定与演示者的交流是否必须仅使用已经验证的正确数据。
这真的取决于,我的建议是(以及我通常做的):
- 如果字段可以验证无需访问数据库或复杂操作,我会在activity.此类字段的示例包括:密码(密码需要至少包含 7 个字符)、年龄(年龄必须是数字)
- 如果字段需要通过访问数据库(或通过网络服务)或操作需要复杂的逻辑和资源来验证,在演示者中进行。此类字段的示例是:用户名(通过访问数据库检查它是否是重复的用户名)
把它想象成一个网站的前端和后端,虽然不完全一样,但确实可以帮助你理清容易混淆的概念。
您可以在 activity 中这样做:
private Presenter mPrensenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mPrensenter.load(name,email,text);
}
});
}
@Override
public void onRightDataValidated(){
}
然后就是MainView和Prensenter两个界面:
public interface MainView{
void onRightDataValidated();
}
public interface Presenter{
void load(String name,String email,String text);
}
Presenter的impl,在load方法中需要使数据失效时,可以使用MainView.onRightDataValidated回调,可以在我的github MVP Demo中找到更多
好吧,我相信您应该在 activity 中进行验证。并且 Simply presenter 将调用验证方法来检查验证是否通过然后它将完成操作,否则显示错误。!
在我的一个客户项目中,有详细信息页面,单击提交按钮时,它应该检查详细信息页面是否已填写,然后它将保存包含详细信息的订单,否则会显示错误。
这就是我实施的方式——
在这里你可以看到isDetailFilledOut()
是一种验证方法,如果验证通过,它将returntrue
否则false
。
如果它 return 为真,它会检查互联网是否也可用,然后它会通过调用模型的 saveOrder 方法来保存订单,否则会显示填写详细信息警告。
View 永远不应该自己决定做事,presenter 一直在等待 view 通知的事件,然后 presenter 决定做什么,view 只保留来自 presenter 的等待命令。
所以,不,验证是一个演示者任务,即使它是一个非常简单的任务,例如验证一个字段。
MVP 的部分目的是使测试更容易。如果你处理这些问题,"What if I never tested the view," 那么这就给出了正确的观点,即哪些逻辑应该或不应该去那里。 Presenter 应该有助于快速 JUnit 测试,并使开发人员无需编写 Android 仪器测试。
最重要的是,您需要测试您的验证逻辑以确保它是正确的,如果您将它放在 Presenter 中,它会让生活更轻松。
我开始在一个 Android 项目上实施 MVP 模式,我对在执行任何操作之前应该在哪里验证字段有一些疑问。
例如,如果我必须发送包含三个字段(姓名、电子邮件、文本)的表单。 我应该验证 activity 中的字段还是应该将它们发送给 Presenter 进行验证?
我还不能 100% 确定与演示者的交流是否必须仅使用已经验证的正确数据。
这真的取决于,我的建议是(以及我通常做的):
- 如果字段可以验证无需访问数据库或复杂操作,我会在activity.此类字段的示例包括:密码(密码需要至少包含 7 个字符)、年龄(年龄必须是数字)
- 如果字段需要通过访问数据库(或通过网络服务)或操作需要复杂的逻辑和资源来验证,在演示者中进行。此类字段的示例是:用户名(通过访问数据库检查它是否是重复的用户名)
把它想象成一个网站的前端和后端,虽然不完全一样,但确实可以帮助你理清容易混淆的概念。
您可以在 activity 中这样做:
private Presenter mPrensenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mPrensenter.load(name,email,text);
}
});
}
@Override
public void onRightDataValidated(){
}
然后就是MainView和Prensenter两个界面:
public interface MainView{
void onRightDataValidated();
}
public interface Presenter{
void load(String name,String email,String text);
}
Presenter的impl,在load方法中需要使数据失效时,可以使用MainView.onRightDataValidated回调,可以在我的github MVP Demo中找到更多
好吧,我相信您应该在 activity 中进行验证。并且 Simply presenter 将调用验证方法来检查验证是否通过然后它将完成操作,否则显示错误。!
在我的一个客户项目中,有详细信息页面,单击提交按钮时,它应该检查详细信息页面是否已填写,然后它将保存包含详细信息的订单,否则会显示错误。
这就是我实施的方式——
在这里你可以看到isDetailFilledOut()
是一种验证方法,如果验证通过,它将returntrue
否则false
。
如果它 return 为真,它会检查互联网是否也可用,然后它会通过调用模型的 saveOrder 方法来保存订单,否则会显示填写详细信息警告。
View 永远不应该自己决定做事,presenter 一直在等待 view 通知的事件,然后 presenter 决定做什么,view 只保留来自 presenter 的等待命令。
所以,不,验证是一个演示者任务,即使它是一个非常简单的任务,例如验证一个字段。
MVP 的部分目的是使测试更容易。如果你处理这些问题,"What if I never tested the view," 那么这就给出了正确的观点,即哪些逻辑应该或不应该去那里。 Presenter 应该有助于快速 JUnit 测试,并使开发人员无需编写 Android 仪器测试。
最重要的是,您需要测试您的验证逻辑以确保它是正确的,如果您将它放在 Presenter 中,它会让生活更轻松。