代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

在哪里存储价值,以便传输到业务层?

  •  0
  • Ian Boyd  · 技术社区  · 14 年前

    想象一个具有多个属性的假设对象:

    伪代码:

    code>class student
    {
    名称:字符串;
    出生日期:日期时间;
    高度:int;//英寸
    GPA:浮动;/“平均成绩点”
    公民身份:字符串;
    }
    < /代码> 
    
    

    现在,用户输入值,对象获取这些值:

    姓名:shelby lake
    出生日期:6/19/1991
    高度:63
    GPA:5.6
    公民身份:United States

    具有所有业务逻辑的层可以验证它:

    businesslayer.validatestudent(student);
    < /代码> 
    
    

    例如,在本例中,它可以引发异常:

    clientException
    GPA不能超过4.00(5.60)
    < /代码> 
    
    好的,很好。但并非用户键入的所有内容都能“适应”对象内部:

    姓名:shelby lake
    出生日期:19年前
    高度:5'3
    GPA:n/a
    公民身份:n/a

    我们的用户可以在业务决策中输入更友好的值。同时,还存在决定某些输入何时有效的全局业务规则,例如

    GPA:5.6(invalid)
    GPA:n/a(valid)
    公民身份:n/a(valid)
    公民身份:(invalid)
    高度:tall(invalid)
    高度:5'3(valid)

    我的问题是,我在哪里存储这些stringvalues,因为我不能将它们纯粹存储在对象中。他们需要到达业务层,该层知道如何将输入的文本解析为值。

    我的第一个想法是改变课堂:

    code>class student
    {
    名称:字符串;
    出生日期:日期时间;
    生日自由形式:字符串;
    高度:int;//英寸
    高度自由形式:弦;
    GPA:浮动;/“平均成绩点”
    gpafreeform:字符串;
    公民身份:字符串;
    }
    < /代码> 
    
    

    这允许将更任意的值发送到业务层:

    姓名:shelby lake
    BirthdateFreeform:19年前
    高度自由形式:5'3
    GPA:4.6 公民身份:n/a

    businesslayer.validatestudent(student);
    < /代码> 
    
    

    业务层可以将自由形式的值转换为规范值,报告任何错误:

    clientException
    必须输入国籍(“不适用”)。
    < /代码> 
    
    

    但这似乎是一个难看的答案,我甚至不想考虑它。

    用业务规则解析用户输入的企业方法是什么?

    pseudocode:

    class Student
    {
       Name: String;
       Birthdate: DateTime;
       Height: int; //inches
       GPA: float; //"Grade Point Average"
       Citizenship: string;
    }
    

    现在,用户输入值,对象获取这些值:

    姓名:Shelby Lake
    出生日期:6/19/1991
    高度:63
    GPA:5.6
    公民身份:United States

    具有所有业务逻辑的层可以验证它:

    BusinessLayer.ValidateStudent(student);
    

    例如,在本例中,它可能引发异常:

    ClientException
    GPA cannot exceed 4.00 (5.60)
    

    好的,很好。但并非用户键入的所有内容都能“适应”对象内部:

    姓名:谢尔比湖
    出生日期:19 years ago
    高度:5'3
    GPA:n/a
    公民身份:N/A

    我们的用户可以在业务决策中输入更友好的值。同时,还存在决定某些输入何时有效的全局业务规则,例如

    GPA:五点六(无效)
    GPA:N/A(有效)
    公民身份:N/A(有效)
    公民身份:(无效)
    高度:tall(无效)
    高度:5’3(有效)

    我的问题是,我把这些放哪string值,因为我不能将它们纯粹存储在对象中。他们需要到达业务层,该层知道如何将输入的文本解析为值。

    我的第一个想法是改变课堂:

    class Student
    {
       Name: String;
       Birthdate: DateTime;
       BirthdateFreeForm: string;
       Height: int; //inches
       HeightFreeform: string;
       GPA: float; //"Grade Point Average"
       GPAFreeform: string;
       Citizenship: string;
    }
    

    这允许将更任意的值发送到业务层:

    姓名:谢尔比湖
    出生日期自由格式:19年前
    HeightFreeform:5’3
    GPA:4.6 公民身份:N/A

    businesslayer.validatestudent(学生);
    

    业务层可以将自由形式的值转换为规范值,报告任何错误:

    ClientException
    Country of citizenship must be entered ("n/a")
    

    但这似乎是一个丑陋的答案,我甚至不想考虑它。

    用业务规则解析用户输入的企业方法是什么?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Ryan Brunner    14 年前

    当用户输入的数据与模型表示数据的方式显著不同时,我采用的一种方法是使用视图模型的特定类,并在此类中提供助手方法,以将该视图模型转换为适当的域对象:

     class StudentViewModel {
        StudentViewModel(Student s) {
           // map the properties of Student to the appropriate view model 
           // properties.
        }
    
        StudentViewModel() {
           // use this for creating a new student.
        }
    
        Name: string
        Height: string
        GPA: string
        // etc.
    
        Student GetUpdatedStudent() {
            // map your view model properties to the Student class 
            // and return an updated Student.
        }
     }
    

    这种方法非常灵活,尽管还涉及一些额外的工作。您可以直接对viewModel而不是域对象进行验证,并确保您的模型不需要适应无效数据,这使它们能够专注于表示您的域的真正目的,而不是不断地防范无效数据。

    此外,当您有一个“平面”用户体验,转换成一个深度对象图时,这种方法变得非常有用。

    推荐文章