检查同学们的制作的UML图时,同学们提出了很多的疑问, 其中问题最多的是时序图部分。
开始大家都是采用工厂创建接口,业务逻辑层调用接口层,接口再调用实现类的顺序来画图。
后来想了想,接口层与接口的实现层没有调用关系。在时序图中不应该体现接口对实现的调用。既然没有调用关系,那么画图时,业务逻辑层是调用到接口呢,还是去调用接口的实现呢。
这个问题我也不清楚,于是开始参考VS2010生成的时序图,但是每个人生成的图也不相同。有的图是调用接口,接口以后的时序图是没有的。有的图则是调用的接口的实现。
自己写了一个小Demo,模拟各层之间的调用,发现生成图不同的原因,在于上一层对下一层的引用位置。
举个例子来说,我们现在有如下几个类,Form1 窗体类,Bll类,IDal(接口)类,Dal(接口实现)类,SqlHelper类
这些类分别模拟了各层之间的调用关系,调用关系为Form1—>Bll.Add()—>Idal<—Dal—>SqlHelper
Bll类中有一个Add()方法,为方便描述,其余几个类分别有一个Add()方法。
如果Bll类这样调用IDal接口
public class Bll
{ //引用在类体中
IDal dal = new Dal();
public string Add()
{
return dal.Add();
}
}
生成的图如下:
这时候Bll类与IDal(接口)类是关联关系,生成的时序图到IDal类就结束了。
如果Bll类这样调用IDal接口
public class Bll
{
public string Add()
{ //引用在方法中
IDal dal = new Dal();
return dal.Add();
}
}
生成的图如下:
这时候Bll类与IDal(接口)类是依赖关系,Bll 类会调到接口的实现类Dal 上
总结:不同的设计带来不同的系统实现。在画图时,如果有接口和接口的实现,推荐在时序图中用接口的实现来描述方法的调用。这样实现类后面一系列方法的调用,均可以通过时序图反应出来。