作为我目前正在进行的培训计划的一部分,我的任务是开发一个简单的基于命令行的帮助台应用程序。该项目的目的是培养我们使用设计模式,SOLID原则,MVC架构等的能力。
我在理解如何保持MVC结构的灵活性方面遇到了问题。以下是我的代码的一部分示例......
public class RegisterController
{
View view;
RegisterModel registerModel;
public RegisterController()
{
registerModel = new RegisterModel();
}
public void processRegistration(String username, String password, Role role)
{
if(registerModel.isRegisterable(username, password))
{
User newUser = new User(username, password, role);
registerModel.registerUser(newUser);
view = new LoginView(new LoginController());
}
else
{
System.out.println("ERROR during registration.");
view = new MainView(new MainController());
}
view.startView();
}
}
我理想地希望能够在以后进入并用不同的用户界面(视图类)替换它,例如一个网页,不改变我的模型或控制器。但是,目前您可以看到我正在编写命令行“MainView”和“LoginView”类的具体实现。
如何使此控制器代码更灵活,并允许使用不同的用户界面进行替换,只需最少的代码修改?在更改为不同的UI时,期望控制器代码保持不变是不现实的吗?
答案 0 :(得分:1)
MVC / MVP设计模式的一个主要好处是,它们允许您在模拟视图和模型的同时对演示者进行单元测试。
因此,我总是建议构造控制器/展示器,并将视图和模型作为参数传递给构造函数。如果视图和模型作为接口类型传递,则可以在具有模拟对象的测试场景中替换它们。在您当前的设计中,在控制器中选择具体实现,这打破了这种范例。
我通常将控制器和视图链接到一个中心位置。但是,这假设控制器不会在构建时立即启动昂贵的计算操作。我不确定是否有完美的答案,但我相信你应该调整你当前的设计以便进行测试。