什么设计模式适合这种代码气味?

时间:2011-09-07 17:29:40

标签: design-patterns

我有一个包含450个字段的PDF表单,我将使用我的数据库中的数据填写它。 PDF中的每个字段都有一个唯一的名称,我可以执行以下映射:

switch (fieldname)
{
    case "Name":
        value = GetData(Name);
        break;  // Etc...
    case "Date":
        value = Date();
        break;
    default:
        value = "";
        break;
}

现在看起来这将变得非常复杂,快速拥有450个分支,如果添加其他文档,它可能会大量增长。有哪些潜在的模式可以解决这类问题?基本上我想将PDF字段绑定到数据库字段。

*编辑 * 因此,我只想说我有一个巨大的switch语句~450个分支,它将PDF字段名称(如'Name''Address''Phone')路由到正确的数据库查询以供执行。除了根据最终用户选择的文档而变量字段名称时,还可以通过其他方式解决此问题。

*最终修改 * 我想了一天,并提出了解决方案,感谢所有的建议。我有一个名为GetElement()的函数。它将PDF字段名称作为参数,并执行将数据库列和另一个过程名称作为映射返回的存储过程。然后使用一些动态SQL我传递我正在寻找的过程名称和列并返回结果。很难在这里选择正确的答案,但我会赞扬那个让我最接近的人。

6 个答案:

答案 0 :(得分:4)

从我对你的整体问题知之甚少,似乎最容易将字段名称与数据库中的值一起存储。这是一个简单的名称 - 值对循环结构,并且您也不会在代码中硬编码名称字符串。更通用?希望这会有所帮助。

答案 1 :(得分:1)

我认为你正在尝试实现一个Object-Property-Value系统,这里的对象是一个具有各种属性的文档......在不同的实例中具有不同的值。

这是一个非常常见的模型,但最好是保存在除传统RDBMS之外的存储中,可能是xml数据库。

答案 2 :(得分:1)

不仅仅是一种设计模式,我会采用更简单的方法,如果我做出错误的假设,请纠正我:

  • 您有不同类型的文档,每个文档都有不同的映射。
  • 在申请期间,用户可以选择任何这些文件
  • 可以更改文档的映射并添加新文档

一个选项是拥有一系列地图(带有键,值对),用于保存文档的配置。

当从某些配置文件(某些属性或xml文件)启动应用程序时,地图会初始化,并且地图会被缓存,因此您无需一直重新创建它们。

处理文档时,只需选择正确的地图对象并进行循环:foreach($field in $document): $field['value'] = getData(pdfMap.getValue($field));

如果您需要更改或添加某些配置,只需更改映射文件并重新启动应用程序(如果您不想重新启动,则更新地图)

答案 3 :(得分:0)

作为结构化文档,我认为Visitor将是您的最佳选择。

答案 4 :(得分:0)

您是否可以使用SELECT从数据库返回所有450个数据项,然后使用fieldname将其编入索引?你使用哪种语言?

例如

datarow dr = GetAllData();
foreach field in document {
  field.value = dr[field.Name];
};

答案 5 :(得分:0)

您可以使用与pdf字段名称相同的名称创建数据库表。然后,您可以使用此一对一映射来填充pdf文件中的值。我假设你在pdf中设置的所有内容都是字符串。

另一种方式: 如果需要关注数据类型,则需要在某处进行fie​​ld->数据类型映射(例如java中的ENUM)。然后创建一个名为getValue(fieldName)的函数,该函数根据数据类型调用getString(fieldName)或getDate(fieldName)或getCurrency(fieldName)。

您的数据类型的开关案例最多为5-10。