在我的工作中,我需要格式化付款文件以便能够与银行进行通信。问题是所有银行都要求采用不同的格式。现在,我们使用模板方法模式[GOF]试图尽可能地做泛型,但是对于每种格式都会重复相同的3个类。
一个继承自asbtract absPaymentFile的类(带有Inversion of Control) 从Pay继承的类(包含有关付款的信息有时会有1或2个属性与其他付款类别不同) 一个继承自absMerchant的类(包含有关商家的信息和一些要实现的方法)
有没有办法格式化文件,“几乎”相同的信息,在几个方面比我们现在做的更好?
此链接应为您提供我需要做的基本线:https://www.vancity.com/lang/fr/SharedContent/documents/CPA_Std005_Specs.doc
这是一个.doc!
谢谢!
答案 0 :(得分:2)
我已经走上了尝试制作只需要微调以支持多种格式的东西的道路,但我会说不这样做。 DRY原则并不适用于此,因为每种新格式都真正独立于其他格式并且可能会发生变化。
是的,这可能意味着复制/粘贴相当数量的代码,但老实说,一旦完成一种格式,那么在接收软件更新其规范之前,您不必担心它。此外,如果该格式发生更改,您通常不希望任何这些更改影响您的其他输出代码。
简而言之,这是仅应该封装到具有某种类型的插件架构的那些领域之一。这意味着,所有类都应该实现一个基本接口,该接口只定义主应用程序如何向其传输数据。之后,这些课程应该能够彼此显着地发生分歧。一个课程中的更新应该对其他人没有影响。
答案 1 :(得分:1)
我会考虑使用C#库支持的格式,例如XML或JSON,这样您在读取或写入文件时就不必重新发明轮子。这两种格式都允许您拥有可选属性。例如
<elements>
<element name="name1" value1="somevalue" company1specific="something" />
<element name="name1" value1="somevalue" specificToAnotherCompany="something" />
</element>
或
{
"elements" : [
{ "name":"name1", "company1specific":"something" },
{ "name":"name1", "specificToAnotherCompany":"something" }
]
}
希望这有帮助。
答案 2 :(得分:0)
如果使用平面文件格式,请查看此库:http://www.filehelpers.com/。该库允许您使用具有类和成员属性的类来表示格式。
此外,在这种粒度级别重复使用很容易。如果生成文件格式不是您正在处理的核心,那么更重要的是要注意更高级别的体系结构,然后再重复使用文件生成。此外,保持格式化例程彼此隔离可能会有所帮助,因此一种格式的更改不会影响另一种格式。结合单元测试将进一步提高可维护性。
答案 3 :(得分:0)
您需要一个内部“主格式”,然后是一个DocumentConverter,它接受MasterFormatFile并将其转换为所需的输出。
使MasterFormatFile公开一个通用api,几乎就像一个获取键值作为一个字典,但有一些其他的支持。
扩展到新的FileFormatter将是简单和模块化的。