来一点敏捷

这两天在看敏捷的相关东西。看来看去,大体上敏捷的设计原则讲的都是一个东西。以前对开放-封闭原则(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。

@ 2010-06-10 08:00

Comments:

Sharing your thoughts: