English 中文(简体)
在处理考查表和相关业务逻辑时消除硬编码价值
原标题:Getting rid of hard coded values when dealing with lookup tables and related business logic
  • 时间:2009-10-30 14:56:58
  •  标签:

例:

我们利用服务器重建租赁服务。 关于可以租用的物品的信息储存在一张桌上。 每个项目都有一个可以“易受灾”、“被侵吞”或“被打”的国家。 各州都居住在调查表中。

表格:

id name
1 Available
2 Rented
3 Broken

Adding to this we have a business rule which states that whenever an item is returned, it s state is changed from "Rented" to "Available".
This could be done with a an update statement like "update Items set state=1 where id=@itemid". In application code we might have an enum that maps to the ItemState id:s. However, these contain hard coded values that could lead to maintenance issues later on. Say if a developer were to change the set of states but forgot to fix the related business logic layer...

What good methods or alternate designs are there for dealing with this type of design issues?
Links to related articles are also appreciated in addition to direct answers.

问题回答

在我的经验中,你实际上用了“Enum”来打硬编码,最好是使用一种与你看管表相匹配的Enum。 我看不出任何错误,说“1”永远是“可移动的”等等。

我所看到的大多数制度都难以规范,看望表的价值观,并与之共存。 这是因为在实践中,法典表格很少像你认为的那样变化。 如果他们发生变化,你一般需要重新编制任何依靠DDL的任何方案。

尽管如此,如果你想要使该法典能够维持下去(一个值得称赞的目标),最好的办法是将这些价值观纳入财产档案。 之后,你可以在不必再照抄全部内容的情况下编辑这一档案。

这里的限制因素在于,你自己的内部状态取决于你从调查桌上获得的价值,这意味着一定数量的政变。

如果 appdoesn t依靠该代码,(例如,如果你的代码表列有两字母的国家代码清单,用于地址 drop倒时),那么你就可以 la忙把这些代码装入物体,只有在需要时才能查阅。 但是,这为你重新做的工作赢得了回报。

当你在《法典》中界定了研究表格和图象时,你总是要把他们放在一席上。 做不到很多工作。 两者都有效地生活在两个不同的世界之中,而且普遍不了解彼此。

您不妨拒绝使用审查表,只允许你的商业逻辑运用这些价值观。 在此情况下,你错失了依赖参考性完整性支持你掌握数据完整性的选择。

另一种选择是,以你从未在你的法典中需要这些价值观的方式扩大应用。 这意味着将你的部分业务逻辑转移到数据库层,意思是将其置于储存程序和触发器。 这对客户也是有益的。 任何人都可以援引特殊产品,获得数据保证,也将按照你的商业逻辑规则保存在统一状态。

你们需要具有一些事先界定的价值,而这种价值永远不会改变,无论它是一种愤怒、扼杀还是其它东西。

在你看来,国家的数字是国家代号<代码>。 简言之KEY,不应改变设计完善的数据库。

如果您对一致性表示担忧,请使用<代码>CHAR代码:A,RB

但是,你应当坚持这一条以及数字代码,以便<代码>。 A总指Available等。

你们的数据库结构应当记录下来,法典也应当记录下来。

答案完全取决于你所使用的语言:在 Java、公共卫生和社会福利部、小塔勒克或甚至议会中,这种解决办法并不相同。

但我要告诉大家:虽然我们珍视真正的硬规范价值观不是一件大事,但有时你们确实需要这些价值观。 而这正是其中之一:你需要在你的法典中宣布你目前对业务逻辑的了解,其中包括这些硬编码国家

因此,在这种特殊情况下,我很难将这些价值观加以规范。

不要设计。 在试图找到解决这一问题的办法之前,如果它甚至成为一个问题,你就需要指出。 您能想到一下,在什么情况下你会改变项目国的价值观? 不仅“如果某人改变这一表格?”而且“有些人想以X方式改变这一表格,因为Y原因,会有什么影响? 你们需要保持现实。

New state? you add a row, but it doesn t affect the existing ones. Removing a state? You have to remove the references to it in code anyway. Changing the id of a state? There is no legit reason to do that. Changing the name of a state? There is no legit reason to do that.

因此,没有理由对此表示担忧。 但是,如果在非理性人士任意决定改用2个,因为这更适合他们的天花,那么,如果你必须保持这种清洁,那么所有表格都是通过文字制作的,该文字从一个组合档案中读到这些数值,然后确保所有代码都从同一组合文件中读取。 然后,你有一个定义地点,你想改变你对配置文件而不是行文/编码的价值。

我认为,这是一个共同的问题,是一个有效的关切,因此,我首先 go开了这个条款。

建立一个公开的静态类别以掌握所有研究价值,但不是硬编码,而是在应用装满和使用名称以提及这些价值观时,我们先入这些价值观?

在我的申请中,我们尝试了这一努力。 也可以做一些检查,例如,在法典中进行考查的不同可能价值数目应当与在(b)中相同,如果不做的话,则与记录/电子邮件/etc相同。 但是,我不想为40多个“双筒”实体的地位人工编码。

此外,这可能是其他资源制图的最大问题之一。 我们以太多细节再次暴露了持续存在的层面,因此我们必须予以关注。 有了像实体框架这样的技术,我们不需要担心“合成”部分,因为它是自动的,我是正确的吗?

感谢!

我使用了与你所描述的类似方法,即数据库中包含价值和描述的表格(可用于报告等)和编码表格。 我先处理的是,在编码方面,如“从ABC数据库表X中提取这些数值”的意见是同步的,以便方案管理员了解数据库需要更新。 为了防止数据库方面的变动而没有对代码进行相应的修改,我在表格上设定了许可,以便只有某些人(希望他们也记得他们需要修改守则)能够进入数据库。

这些数值必须硬编码,这实际上意味着这些数值可能不会在数据库中改变,这意味着储存在数据库中是多余的。

因此,数据库没有硬编码,也没有查询表。 相反,这些物品直接存放在项目表中。

您可以建立自己的数据库,以便您的申请实际上不必关注这些守则本身,而是要关注这些守则背后的业务规则。

我做了以下两项工作:

  1. Do one or more of your codes have a certain characteristic, such as IsAvailable, that the application cares about? If so, add it as a flag column to the code table, where those that match are set to true (or your DB s equivalent), and those that don t are set to false.
  2. Do you need to use a specific, single code under a certain condition? You can create a singleton table, named something like EnvironmentSettings, with a column such as ItemStateIdOnReturn that s a foreign key to the ItemState table.

如果我想避免在申请中宣布一席之地,我将用第2号来说明问题的例子。

您是否采取这种做法取决于您的运用优先事项。 这种结构的代价是额外开发和寻找间接费用。 此外,如果每个法典都有自己的商业规则,那么按要求制定新一栏并不可行。

但是,如果你不希望担心你的申请与法典表格内容同步,则可能值得。





相关问题
热门标签