我在做某些事情时遇到过这个问题。我的一般结论是,每当我觉得我需要一个领域的班级,我做错了。这是我的思维过程:
问题: - 我需要大量的字段来保存这些数据 - 所有这些领域需要的样板巨额
解决方案:
- 使用反射来降低样板<“你在这里”
- 使用元数据指定字段应如何使用
个
新问题:
- 反思是很难理解,当有人以全新的面貌在代码
- 一旦你足够的元,以消除更多的样板,该领域往往在代码中没有提及,除非通过metadata-他们为什么是田地?
- 指定在码元数据变成庞大的相当快(最简单的方式是一个字符串数组,顺便)
解决方案:启动一个集合中的存储数据和在外部数据文件指定元数据
新问题:错误很难找到
请谨慎对待错误检查,并非常明确地表明您的错误消息。确保其他可能使用您的代码的程序员阅读错误消息。尝试指示元数据何时缺失或错误以及程序员应如何更新metdata - 包括元数据文件的位置。
问题:无类型安全
呀,这成了时代有些烦人。我最终在元数据中包含了类型信息,这样如果有人在字段中输入了错误的值,可能会发现它 - 从本质上讲,这会将类型安全从构建时间移动到运行时间,这对我来说是很好的。
问题:重复所需的元数据在整个对象的生命
而不是每次它的使用时间寻找它的名字,我会解析开头的元数据,并把它放在一个对象(电话它是一个IntHolder)。这个持有者最终将在散列表中,它将包含当前值以及对解析元数据的引用。
例
这里是我的元数据最终将用于样式表的一个字段:
FieldName: Age
FieldType Integer
ScreenBinding: AgeTextField
DBBinding: User.age
Validation: IntRange(0, 120); "Age is out of range"
字段名称可能是如何显示给用户,或者只是在你的程序中使用。一般来说,你不需要直接操纵这种类型的数据名称 - 但当然你有时会这样做。
当你确实需要使用时,使用getInt(“Age”)和setInt(“Age”,12)而不是getAge()和setAge(12) - 稍微更冗长,但并不是真正的问题。
如果这是一个问题,你可以使getAge/setAge辅助方法,你永远不需要知道它不是一个字段,但是它不会再次在样板上堆积。
FieldType:指定它的存储方式,可以实现类型检查。
ScreenBinding和DBBinding用于将值复制到其他系统和从其他系统中复制出来。我也使用这种机制将数据从服务器传输到客户端并返回。
有趣的是验证。当从屏幕上提取数据时,它可以以非常有计划的方式传递给验证器。提交到数据库之前可以使用相同的验证器。
验证器可以做更多的事情,它们可以充当触发器(如果值更改,执行此操作)或操作(当用户提交屏幕时,执行此操作)。这些是一个简单的对象,能够通过接口获取值 - 它们可以像您喜欢的那样灵活或强大,但除了通过元数据外,不会直接绑定到任何对象。
这种方法的唯一问题是你必须是喜欢书写夹具而不是容易出错的样板的程序员。 (是的,我发现时间大致相等,但当我不得不实施样板时,我倾向于变得非常慢)
经过这样的几次我真的很喜欢这个模式,但它很难实现。下次我这样做时,我会尝试将它变成某种类型的库。
它们必须有一个默认的(无参数)构造函数(+1) – Bozho 2010-04-28 19:53:29