设计帮助:基于输入的可配置行为

时间:2011-03-24 00:13:21

标签: python design-patterns configuration input

我正在使用Python,但这是一个通用的设计问题,所以欢迎一般的答案。我将解释上下文不是问题的一部分,而是作为一个例子:

我有一个接收CSV文件的脚本,它使用此文件中的字段进行自动电话呼叫。这些字段代表要说出的姓名,要说的日期以及要拨打的电话号码。例如,像“555-555-4321,Bob,Jill,3/30/2011”这样的输入可能会拨打电话555-555-4321并发送一条机器人消息说“Bob,别忘了Jills生日是下周三,从现在开始一周。“

我的问题是什么设计模式对于使这个系统可配置有用?更具体地说,我想指定输入行采用的格式,以及生成语音消息的一些行为。像“鲍勃”这样的某些领域可以像“说场”一样简单。其他字段,如日期,需要进行一些转换才能被说出(即“3/30/2011”如何成为“下周三”)。我也希望有各种线路格式,例如,“555-555-4321,Bob,6:00”等输入可能会在每天6:00致电Bob并说“醒来!”

我的目标是建立一个允许定义和配置这些类型的Web界面。我知道如何通过破解我的源代码来解决这些问题,但是从简单且用户友好的前端攻击源代码还有很长的路要走。

1 个答案:

答案 0 :(得分:1)

我目前正在解决一个相关但不完全相同的问题。

我的解决方案是创建一个与目标csv行长度相同的控制列表,其中控制列表中的每个元素都是useMethod的名称。在我的例子中,useMethod是一个编辑器小部件;在您的情况下,它将是一个函数,用于定义文本到语音引擎如何解释字段。对于每一行,您可以遍历字段,调用适当的处理小部件。

所以对于你的例子“555-555-4321,Bob,Jill,2011年3月30日”,

import csv
def phoneNumber(number):
    ...
def userName(name):
    ...
def targetDate(datestring):
    ...
control = [phoneNumber, userName, userName, targetDate]
with open("csvFile", "r") as inFile:
    reader = csv.reader(inFile)
    for row in reader:
        for op, item in zip(control, row):
            op(item)

我注意到这仅在csv文件每个元素具有常量解释时才有效,但如果它具有变体解释,那么csv文件是错误的存储方法。我还注意到你需要一些其他控制对象来生成句子的其余部分;这是留给读者的练习。 :)

这允许您拥有一个解释器函数库,只需更改控制字符串即可将其分配给csv文件中的字段。新的控制字符串将调用不同的字段解释顺序而无需更改源代码,新字符串可以在命令行中输入,存储在csv文件的第一行中,或以其他方式引入。 / p>

编辑:并注意到您使用网络界面进行配置的附录,这将是一种提供新控制列表的直接方式。