繁体   English   中英

域模型和用户界面

[英]Domain model and the user interfaces

我不确定是否应该直接在用户界面中使用用户域对象。 例如,我希望为域实体用户设计用户界面,该用户具有用户ID,名称,密码和角色列表。 实体的设计方式使其永远不会处于无效状态(例如,无效的密码或空的UserId)

public class User {
    public User(String userId, String name, String password) {
        //Initialization and validation
    }

    public String getUserId {
        /*implementation*/
    }
    public void changePassword(String oldPassword, String newPassword) {
        /*Set new password if it complies with the rules
        and if the the old one is correct*/
    }

    public void setName(String Name) {
        /*implementation*/
    }
    public String getName() {
        /*implementation*/
    }

    public List<Role> getRoles() {
        /*implementation*/
    }

    public void addRole(Role role) {
        /*implementation*/
    }
}

设计用户界面的最合适方法是什么?

1)坚持领域模型:设计3个窗口。 窗口“ New user”使用给定的userId,名称和密码创建一个新用户。 另一个窗口“更改密码”用于更改密码,另一个窗口“修改用户”使您可以修改现有用户的名称和角色

2)可能希望仅使用一个窗口来创建具有给定userId,名称,密码和角色列表的用户。 即使我尚未输入userId,我也应该能够添加角色。

选项1是最容易实现的,因为我可以直接在用户界面中使用域对象。 但是用户界面使用起来可能很麻烦。 选项2是可取的,但是域对象不能直接使用。 如果尚未创建用户,我看不到如何添加角色。 我无法创建用户,因为那时我可能没有正确的信息,例如代表userId的临时空文本框。 我该如何实现?

我能想到的唯一干净的解决方案是创建要在用户界面中使用的类,这些类将模拟真实域对象中的信息。 因此,我将能够创建一个空用户来添加角色,然后在其后设置userId。 用户界面可以使用该信息来创建真实域对象。

有没有解决此问题的简单方法? 通常如何管理?

有很多问题,但是您问对了,因为当您开始研究如何在层之间传递对象时,它们是至关重要的问题。

让我们开始

“通常如何管理?”

您正确地指出,要向用户呈现域对象的方式并不总是以原始形式出现-有时您希望显示的对象少一些,例如在用户示例中,可以在与用户创建/修改不同的用户界面,有时您想要显示更多,并排同时显示2个对象,或呈现2个对象的混合数据。

顺便说一句,精度:您认为选项1(多个窗口)更多地依赖于域模型,而我认为它倾向于较少地模仿模型,因为它不会在单个屏幕中显示整个域对象-但是这是一个细节。

那么您通常如何处理呢? 正是您所说的那样-通过创建针对您的视图量身定制的特定于UI的对象

我能想到的唯一干净的解决方案是创建要在用户界面中使用的类,这些类将模拟真实域对象中的信息。 因此,我将能够创建一个空用户来添加角色,然后在其后设置userId。

这些通常在.NET / MVVM世界中称为DTO ,ViewModel对象等。

用户界面可以使用该信息来创建真实域对象。

通常,从UI对象创建/更新域对象不是UI本身的职责。 映射在另一层中完成。

现在,我们已经了解了基本的解决方案,让我们看看它是如何异常管理的;)

有几种选择。 其中之一是Naked Objects模式,其中所有用户界面都是域对象的直接表示。 这在很大程度上简化了问题,但是就工作流和易用性而言,这样的UI始终是最佳的,这还有待观察。

或者,您可以仅在表示层中使用域对象就可以摆脱困境。 最近的这篇文章指出了当您具有相同对象的多种表示形式时出现的问题,并研究了在所有层中使用相同域对象的可能性。 这里的问题是,您可能必须将一些与域完全不相关的数据强加到您的域对象中,并且您可能还必须放弃一些不变式(例如,“用户必须存在至少一个角色才能存在” ”(如果您将用户创建和角色分配用户界面分开)。

最后,回到用户/角色示例和“如果还没有创建用户,我不知道如何添加角色”:您不必为应用程序的最终用户使用现有的User对象。能够选择角色。 您可以仅在屏幕上选择角色并按住它们,直到完成User对象的实际实例化为止,并且仍然强制执行所有必填字段,例如ID。

选项2有什么问题? 您可以先创建一个新的User对象,然后向其中添加规则。 如果您没有所有必要的信息来创建新的User对象(例如,空的userid文本框),而不仅仅是给用户一个通知,指出必须填写此字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM