来一点敏捷
这两天在看敏捷的相关东西。看来看去,大体上敏捷的设计原则讲的都是一个东西。以前对开放-封闭原则(Open-Closed Principle)总是感觉模糊,现在感觉也就是利用接口隔离,依赖于稳定的抽象的另一种说法。
来点例子
我们有一个网页,需要根据报表页面生成PDF供用户下载。
void ResponseToUser(string fileName)
{
PDFGenerator pdfGenerator = new PDFGenerator();
Send(pdfGenerator.Generate(fileName)));
}
然而没过多久,用户需要生成XLS表——因为用户需要利用XLS来进行统计。
void ResponseToUser(string fileName)
{
XLSGenerator xlsGenerator = new XLSGenerator();
Send(xlsGenerator.Generate(fileName)));
}
分析变化
在满足这个需求时,我们的改动点有两个:一个是实现XLSGenerator类,另一个是改动ResponseToUser函数。此时ResponseToUser函数依赖于生成器的细节。由于需求变化,我们知道这个细节不是稳定的,我们必须找一个相对稳定的抽象,基于这个稳定的抽象来保持ResponseToUser函数的稳定性,同时确保可扩展性。
来看看代码吧:
void ResponseToUser(IGenerator generator, string fileName)
{
Send(generator.Generate(fileName)));
}
此时Send依赖于稳定的抽象来生成不同类型报表。对于OCP原则来说,ResponseToUser函数此时是可扩展——传入不同的生成器。不可修改——ResponseToUser函数不需要修改,而由调用者来决定是需要PDF来是需要XLS。
浙公网安备 33010602011771号