今天姜同学发表了http://www.cnblogs.com/ASPNET2008/archive/2008/08/13/1266942.html
这篇POST表达了对通过分层设计的概念无法解决系统耦合的问题。在之后andytao同学回复了对姜敏朋友的回复 一文作为回应
我在看回复的时候感觉说得不太透,所以忍不住发此文从另外一个角度来试着为姜同学做一次解答。
首先是从姜同学的疑虑开始。姜同学对分层主要是担心增加了工作量缺起不到消除系统耦合的目的。所以我们首先就来谈谈耦合。
-------------------------------------------------以下内容来至软件工程课本----------------------------------------------------------
在软件工程上,耦合指的是指两个实体相互依赖于对方的一个量度。分为以下几种:
非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的
数据耦合:一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的。
标记耦合 :一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。
控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。
外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
公共耦合:若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
内容耦合:如果发生下列情形,两个模块之间就发生了内容耦合
(1) 一个模块直接访问另一个模块的内部数据;
(2) 一个模块不通过正常入口转到另一模块内部;
(3) 两个模块有一部分程序代码重迭(只可能出现在汇编语言中);
(4) 一个模块有多个入口。
---------------------------------------------------以上部分定义来至软件工程课本---------------------------------------------------
举几个简单的例子
void main(string args[])
{
Console.Write(Console.Read());
}
以上的代码里,Console类的Write方法就和Read方法发生了非直接耦合,这种耦合需要有第三方作为控制方才能发生。
假设有一个类Book是一个DTO类(只有属性的类,用来传递数据的类)。如果在数据层提供了BookAccess类由一个Add的方法。那么在逻辑层里面调用
Book b=new Book();
//设值
BookAccess.Add(b);
那么这个时候逻辑层和数据层之间就是发生了标记耦合。
假设User类提供了一个Login()方法,方法的定义是
bool Login(string UserName,string Password);
那么如果我们在页面上这么写
User.Login(UserN.Text,PassWd.Text);
那么这个时候登陆页和User类就是发生了数据耦合。
如果
void output(bool flag)
{
if(flag)
{
Console.Write("OK!");
}
else
{
Console.Write("NO!");
}
}
那么这个时候调用output方法的时候就和他发生了控制耦合。
如果
public class a
{
private static string msg;
public static void main(string args[])
{
Read();
Write();
}
private static void Read()
{
msg=Console.ReadLine();
}
private static void Write()
{
Console.Write(msg);
}
}
这个时候就是外部耦合。
如果在逻辑层里面调用了HttpContext类,那么就是环境耦合了,因为这个DLL和Web环境已经不可分了。
Class DAL
{
public string sql;
public void ExecSql(string sql)
{
}
}
这样子的设计就容易发生内容耦合,本来sql是不该被外界访问的,但是这里可以非法访问,如果访问到了就发生了内容耦合了。
那么在知道了什么是耦合后我们再回到姜同学的疑问。根据我们对耦合的定义来看,耦合是无法被消除的。如果两个模块不存在耦合,那么也说明这两个模块之间就r无法发生互动。
我们所需要注意的是,虽然耦合是系统交互的必然结果,但是耦合的方式是有区别的。更具上边的介绍我们可以判断出,标记耦合,数据耦合是ok的,内容耦合是最糟糕的,控制耦合和环境耦合其次。所以我们要尽量使用标记耦合而不是后面糟糕的三种耦合方式。当然控制耦合有的时候是无法避免的,那么就能避免就避免了。
C#里比如还是可以用多态来解决控制耦合的问题。
---------------------------------------------------------我是可爱的分割线----------------------------------------------------------
所以我们在回过头来看看分层。分层能不能解决耦合的问题,就要看这个层怎么分,如何分,如何定义两个层次之间的交互界面。
那么如何才能定义良好的交互接口呢?
举个例子
Class AccessDAL
{
public void AddBook(Book newbook)
{
//数据操作的代码;
}
}
对于逻辑层来说AddBook方法就是一个界面了(用广义上来说也是接口)。这个接口和逻辑层发生的关系就是标记耦合。这种定义就应该优先于
public void AddBook(string ISBN,string BookName......);
这类定义,因为标记耦合要比数据耦合要好。当然参数很少的时候其实差不多。
最后说说修改数据库表结构的问题。如果数据库表结构都修改了那确实是大问题了。要么前期需求没做到位。如果要适应这样子的要求确实没有什么好办法避免表结构的改变给数据以上的各个层次带来的代码变更的工作量。但是如果采用的第一种标记耦合的定义方式的话,起码调用接口的那部分代码不用改动,接口的定义不用改动,只需要修改DTO类的定义就行了,自然数据层相关的代码需要改动。其余部分的在DTO改动后可以通过VS的重构功能来处理,其实还是能够减少不少工作量得了。
分享到:
相关推荐
电力—天然气耦合系统规划是研究该系统的另一个核心问题之一。该系统的规划需要考虑两个系统的耦合运行特性、安全约束和市场机理等因素。规划的目的是为了实现电力系统和天然气系统的高效、可靠和经济运营。在规划中...
耦合矩阵是一个二维数组,其中的元素表示系统中不同模块或组件之间的耦合程度。耦合度是衡量两个模块之间交互复杂性的度量,它可以分为强耦合和弱耦合。强耦合意味着一个模块对另一个模块的依赖性强,而弱耦合则表示...
RFID系统主要由读写器、电子标签和天线三部分组成,其核心是通过耦合方式来传递能量和信息。根据耦合方式的不同,RFID系统主要分为两大类:电感耦合系统和电磁反向散射耦合系统。 1. 电感耦合系统: 电感耦合是基于...
当两根或多根光纤靠近时,由于光纤芯和包层之间的折射率差,光线会在相邻光纤之间发生耦合,导致一部分光能量从一根光纤转移到另一根光纤中。 ##### 3.4 光纤耦合器与耦合长度的关系 耦合区长度是指光纤耦合器中光...
在信号处理领域,滤波器的设计与分析是一个关键环节,特别是在多滤波器系统中,滤波器之间的耦合效应不容忽视。耦合矩阵的提取是理解和优化这种系统性能的重要工具。本文将深入探讨"filter_final_耦合矩阵提取_耦合...
通过合理的线圈设计和优化,我们可以期待未来的电动汽车无线充电系统在传输效率、充电速度和便利性方面都将达到一个全新的水平。 关键词:无线充电;电动汽车;磁耦合线圈;耦合系数;电池性能。
耦合矩阵是另一个关键概念,特别是在多端口网络和耦合器设计中。它描述了网络中不同端口之间的能量流动。耦合矩阵可以表示为复数矩阵,其元素表示端口间的耦合强度。例如,在一个四端口耦合器中,每个端口的能量都...
在IT领域,特别是系统建模和仿真中,"耦合网络级联故障"是一个重要的研究主题。耦合网络指的是由多个相互关联、互相影响的子系统组成的复杂网络,这些子系统之间的连接可以是物理的、逻辑的或者功能性的。级联故障是...
隔离度是指从一个端口到另一个端口之间的信号传输隔离能力,而耦合度是指从主传输路径到耦合端口的信号传输能力。两者之差即为方向性。矢量网络分析仪可以用来测量这些参数,从而确定耦合器的方向性。 在具体计算中...
标题中的“光纤耦合MATLAB程序.rar”是一个包含MATLAB代码的压缩文件,主要用于计算单模光纤与发光二极管(LED)之间的耦合效率。这个程序可能涉及到光纤光学、光电子学以及数值模拟等领域的知识。下面我们将深入...
主要内容:代码主要做的是一个考虑电网、热网以及气网耦合调度的综合能源系统优化调度模型,考虑了电网与气网,电网与热网的耦合,算例系统中,电网部分为10机39节点的综合能源系统,气网部分为比利时20节点的配气...
在本文中,我们将深入探讨如何使用ABAQUS进行车桥耦合分析,以及MATLAB在这一过程中的作用。首先,我们需要理解"车桥耦合"的概念,它涉及到车辆与桥梁之间的相互作用,尤其是在动态荷载下的响应分析。这种耦合分析...
在ANSYS软件中进行车桥耦合分析是车辆工程与土木工程交叉领域的一个重要研究内容,主要用于评估车辆通过桥梁时对桥梁结构产生的动态影响。这个分析涉及到车辆系统的动力学模型和桥梁结构的静力或动力响应计算。下面...
在RFID(无线射频识别)系统中,定向耦合器是至关重要的组件,它主要用于分离Reader(阅读器)发出的信号与从Tag(电子标签)接收到的信号。定向耦合器的性能直接影响RFID系统的识别能力和效率。然而,传统的微带...