从模板

时间:2015-05-27 00:49:41

标签: design-patterns

我将不得不生成许多包含随机数据的CSV文件。将有关于字段的规则,例如一些将是整数,一些应该是从特定列表中挑选的名称,一些将是从具有给定源的马尔可夫链生成的文本等。

我想使其灵活,因此可以更改CSV规范/模板,而无需进行任何编码更改。我的第一个想法是让模板本身也是一个CSV,它将字段名称映射到生成数据的规则,因此模板可能类似于以下内容:

device id,randint,unique
description,markov,tech.source
vendor,choice,vendors.txt

由此我可以生成一个包含3个字段的CSV,第一个是由随机整数组成的ID,其中包含"唯一的"约束,第二个是使用" tech.source"的马尔可夫链的叙述性描述。作为链定义,供应商是从另一个文本文件中定义的随机选择。

由于单个生成的CSV中可能有80个左右的字段,并且可能有许多相关的CSV文件引用彼此的元素(例如,可能存在人员列表,并且硬件可能拥有所有者必须在人员列表中),我倾向于创建一个类,该类封装了生成的CSV的每一行。

该类将存储dict映射字段名称到值,然后可以将这些值传递给csv.DictWriter(这可能在Python中实现),该列表是使用正确顺序的字段列表创建的。这些类将能够实现比较运算符,以帮助映射不同的类型,并跟踪哪个软件在哪个主机上以及由谁负责的内部一致性。

主要的内脏挂断是字段名称到生成规则的映射。使用CSV和工厂似乎是我能想到的唯一选择,但只是唠叨我的东西,以某种方式所有这一切都可以更优雅地完成。任何人都可以帮我弄清楚,如果有更清洁,更容易扩展,我应该考虑的模式或其他结构吗?

也许有一点令人不安的是创建上面描述的CSV模板。一旦我定义了如何实现"设备ID"似乎每次我想制作另一个模板时,必须复制并粘贴它或重新键入它可能会变得很痛苦。那么,也许,我应该定义在公共文件中生成所有内容的规则,然后每个模板只提供字段名称。

1 个答案:

答案 0 :(得分:1)

  

主要的内脏挂断是字段名称到生成的映射   规则

为什么不直接映射到规则类?你可以像这样描述你的领域(json):

[
    {
        "field": "text_description",
        "rule": "MarkovChainGenerator",
        "params": {
            "source": "romeo_and_julliete.txt",
            "degree": 11
        }
    },
    {
        "field": "salary",
        "rule": "\\OtherNamespace\\SalaryGeneratory",
        "params": {
            "max": "1000.00"
        }
    }
]