【问题标题】:Using Enums for Range Selection in OO Application在 OO 应用程序中使用枚举进行范围选择
【发布时间】:2011-10-16 13:16:48
【问题描述】:

我正在开展一个项目,该项目包含大量表单,用户将填写这些表单以创建最终报告。这些问题中的大多数是多项选择题。我正在为应用程序中的类的正确架构而苦苦挣扎。

为了方便起见,我们假设这是一份车祸报告。面向对象的方法将要求我们根据每个问题中包含的信息创建结构。所以我们有诸如“车辆”、“事故”等类。但是对于诸如“车辆在碰撞时的行驶速度”之类的问题,用户可以选择 4 个答案呢?

  • 不到 10 英里/小时
  • 11-30mph
  • 31-50mph
  • 超过 50 英里/小时

在类中存储这些信息的正确方法是什么?我首先考虑的是枚举:

enum CollisionSpeed {
   LessThan10,
   ElevenToThirty,
   ThirtyOneToFifty,
   MoreThanFifty
}

但这感觉很脏,因为它是基于演示文稿的数据结构。此外,如果他们改变了范围,我们也必须改变枚举。

所以问题是,您如何使用面向对象的方法处理这样的范围选择?

谢谢!

【问题讨论】:

    标签: oop architecture class-design


    【解决方案1】:

    如果它真的是通用的并且您有大量问题,您可以调查非规范化是否是正确的方法。您可以提供一个抽象层,而不是逐个建模每个单独的主题,例如业务用户以后无需 IT 参与即可添加更多问题。简单示例(伪编码):

    class QuestionEntity {
        String question;
        enum type; // e.g. open question (freetext), closed question (check boxes), etc.
        String[] values // if it's a closed question
    }
    

    如上所述,这是相当简化的。由于我确实知道您的确切要求,因此我无法判断这对您的情况是否有意义。事实上,它是为您的特定业务用例开发 DSL。

    也许答案没有你想象的那么具体,但是当我读到你的问题时,我想到了......

    【讨论】:

    • 感谢您的建议。我考虑过这种类型的实现,但担心数据库架构(如果它遵循类似的架构)。因此,不能像SELECT * FROM Accidents WHERE CollisionSpeed=1 那样在逻辑上查询表,而您最终会得到SELECT * FROM Answers WHERE QuestionID=4,这对于数据库管理员来说很难在应用程序之外轻松提取数据。此外,我们最终使用 ID 来提取 QuestionEntities 集合,在整个过程中,我可以看到与枚举本身的魔法 #s 一样有问题。
    • @100acrewood:当然,我理解你的论点。这就是我们必须为抽象付出的代价。顺便说一句:关于枚举;我不会使用枚举,而是规范化数据模型(如表 COLLISION_SPEED_VALUES),这再次使模型更加复杂:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多