2011-09-07 105 views
3

我有一个PDF表格,其中有450个字段,我将使用数据库中的数据填写它。在PDF中每个字段都有一个独特的名字,我可以做一个映射:什么设计模式适合这种代码味道?

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

现在看来,这样是会得到非常复杂的快有450个分支,如果被添加其他文件也可能大规模增长。什么是可用于解决这类问题的潜在模式?基本上我想将PDF字段绑定到数据库字段。

*编辑* 所以让我们只说我有一个巨大的switch语句〜450个分支,即路线PDF场的名称,如“名称”“地址”“电话”,为正确的数据库查询执行。除了最终用户选择哪个文档时,字段名称可变时,还可以通过其他方式解决此问题,而不是切换字段名称。

*最后编辑* 我思考了一天,并感谢所有的建议解决方案上来。我有一个名为GetElement()的函数。它将PDF字段名称作为参数并执行一个存储过程,该过程将数据库列和另一过程名称作为映射返回。然后使用一些动态SQL,我传递过程名称和列查找并返回结果。很难在这里选择正确的答案,但是我会把那个推到最近的那个人归功于我。

+0

循环也许?或者你只是不包括他们在你的代码片段? – Bojangles

+0

“填写”是什么意思?为什么要将所有数据写入变量值?此外,您是否真的在寻找设计模式或者查询/数据库处理的工具或技术? – DaveFar

+0

我正在使用数据库中的数据来填充PDF文档。因此,如果在PDF文档中有一个名为'Name'的地方,我会从数据库中返回相应的名称并将其写入文档。我现在有Linq2Sql和iTextSharp用于获取数据和写入PDF的工具。所有的工作,我只能看到这个怪物开关语句从数据库路由数据到文件,它吓我= = – decompiled

回答

4

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

+0

我可以看到在数据库中存储字段名称的位置会很有帮助,但如果值根据用户输入而变化会怎样?并且,如何从应用程序中检索它们而不使用大型开关/如果其他基于存储在数据库中的内容? – decompiled

+0

现在我们看到了细节中的魔鬼。用户输入未在您的OP中提及。 :)你说,“...我要用我的数据库中的数据填写它。” – joebalt

+0

谢谢乔,我编辑了第一篇文章。希望这有些帮助。我所说的用户输入是他们可以选择的文档。根据文档的不同,“字段”的名称也会有所不同。 – decompiled

0

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

1

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

这是一个非常常见的模型,但最好是坚持在一个非常规的RDBMS,也许是一个XML数据库的存储。

+0

或者一个noSQL数据库,如couchDB或任何其他类型的文档数据库。你甚至可以使用git和文件系统作为数据库 – Raynos

0

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

不是一种设计模式,我会去一个更简单的方法,纠正我,如果我做了错误的假设如

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

更多:

  • 将有更多不同类型的文档,每一个有不同的映射。
  • 在应用程序的用户可以选择任何这些文件
  • 文档的映射可以改变,也可以添加新的文件

一种选择是将有一系列的地图(带钥匙,价值对),它们保存文档的配置。

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

当你处理文档只需要选择合适的地图对象,并做一个循环:foreach($field in $document): $field['value'] = getData(pdfMap.getValue($field));

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

0

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

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

数据类型的开关盒最多为5-10个。