所做的是系统中的一个模块A,为了程序的扩展性,使用了3层结构,如下图所示:

这样是比较容易扩展和修改的结构,数据的展现和数据的持久化相互不会影响,并把业务逻辑封装在一起。
模型代码为:
由于开始数据库的设计不是很合理,把A模块的信息都集中存放在一个表中,用一个对象来表示,结果到现在变得不易与其他模块共用数据,所以就把这个表拆成几个小表,形成多个小对象,并关联起来。
由于我思维定势,在修改了数据持久层后又去修改业务逻辑层。把原本好的设计的优势浪费了 。
改动为(不好的修改):
本来这样的改动是不用修改界面展现层和业务逻辑层的,只要在业务逻辑层和数据持久化层插入一个数据对象转换层就能很好的解决问题。
比较好的解决方法是:

模型代码为(好的修改):
即是说,好的修改应该是内聚的。

这样是比较容易扩展和修改的结构,数据的展现和数据的持久化相互不会影响,并把业务逻辑封装在一起。
模型代码为:
1
using System;
2
3
namespace Example
4
{
5
/**//// <summary>
6
/// 示例
7
/// </summary>
8
class Example
9
{
10
/**//// <summary>
11
/// 应用程序的主入口点。
12
/// </summary>
13
[STAThread]
14
static void Main(string[] args)
15
{
16
PageView view = new PageView() ;
17
view.Show() ;
18
}
19
#region 20050712
20
/// <summary>
21
/// 对象
22
/// </summary>
23
public class Person
24
{
25
private string name = String.Empty ;
26
private string telephone = String.Empty ;
27
28
public Person() {}
29
30
public string Name
31
{
32
set{ name = value ; }
33
get{ return name ; }
34
}
35
public string Telephone
36
{
37
set{ telephone = value ; }
38
get{ return telephone ; }
39
}
40
}
41
/// <summary>
42
/// 界面展现层
43
/// </summary>
44
public class PageView
45
{
46
public PageView() {}
47
48
public void Show()
49
{
50
string name = BusinessRule.GetPersonName() ;
51
string telephone = BusinessRule.GetPersonTelephone() ;
52
Console.WriteLine( string.Format( "{0}的电话是{1}." , name ,telephone ) ) ;
53
}
54
}
55
/// <summary>
56
/// 业务逻辑层
57
/// </summary>
58
public class BusinessRule
59
{
60
public BusinessRule() {}
61
62
public static string GetPersonName()
63
{
64
//业务逻辑代码
65
return ( new Data() ).GetPerson().Name ;
66
}
67
public static string GetPersonTelephone()
68
{
69
//业务逻辑代码
70
return ( new Data() ).GetPerson().Telephone ;
71
}
72
}
73
/// <summary>
74
/// 数据持久化层
75
/// </summary>
76
public class Data
77
{
78
public Data() {}
79
80
public Person GetPerson()
81
{
82
Person person = new Person() ;
83
person.Name = "冯超" ;
84
person.Telephone = "88888888" ;
85
return person ;
86
}
87
}
88
#endregion
89
}
90
}
using System;2
3
namespace Example4
{5
/**//// <summary>6
/// 示例7
/// </summary>8
class Example9
{10
/**//// <summary>11
/// 应用程序的主入口点。12
/// </summary>13
[STAThread]14
static void Main(string[] args)15
{16
PageView view = new PageView() ;17
view.Show() ;18
}19
#region 2005071220
/// <summary>21
/// 对象22
/// </summary>23
public class Person24
{25
private string name = String.Empty ;26
private string telephone = String.Empty ;27

28
public Person() {}29

30
public string Name31
{32
set{ name = value ; }33
get{ return name ; }34
}35
public string Telephone36
{37
set{ telephone = value ; }38
get{ return telephone ; }39
}40
}41
/// <summary>42
/// 界面展现层43
/// </summary>44
public class PageView45
{46
public PageView() {}47
48
public void Show()49
{50
string name = BusinessRule.GetPersonName() ;51
string telephone = BusinessRule.GetPersonTelephone() ;52
Console.WriteLine( string.Format( "{0}的电话是{1}." , name ,telephone ) ) ;53
}54
}55
/// <summary>56
/// 业务逻辑层57
/// </summary>58
public class BusinessRule59
{60
public BusinessRule() {}61

62
public static string GetPersonName()63
{64
//业务逻辑代码65
return ( new Data() ).GetPerson().Name ;66
}67
public static string GetPersonTelephone()68
{69
//业务逻辑代码70
return ( new Data() ).GetPerson().Telephone ;71
}72
}73
/// <summary>74
/// 数据持久化层75
/// </summary>76
public class Data77
{78
public Data() {}79

80
public Person GetPerson()81
{82
Person person = new Person() ;83
person.Name = "冯超" ;84
person.Telephone = "88888888" ;85
return person ;86
}87
}88
#endregion89
}90
}由于开始数据库的设计不是很合理,把A模块的信息都集中存放在一个表中,用一个对象来表示,结果到现在变得不易与其他模块共用数据,所以就把这个表拆成几个小表,形成多个小对象,并关联起来。
由于我思维定势,在修改了数据持久层后又去修改业务逻辑层。把原本好的设计的优势浪费了 。
改动为(不好的修改):
1
using System;
2
3
namespace Example
4
{
5
/**//// <summary>
6
/// 示例
7
/// </summary>
8
class Example
9
{
10
/**//// <summary>
11
/// 应用程序的主入口点。
12
/// </summary>
13
[STAThread]
14
static void Main(string[] args)
15
{
16
PageView view = new PageView() ;
17
view.Show() ;
18
}
19
#region 20050712
20
21
/// <summary>
22
/// 原person对象拆分为2个对象BasicPerson 和 Link
23
/// 去掉原对象person
24
/// </summary>
25
public class BasicPerson
26
{
27
private string name = String.Empty ;
28
29
public BasicPerson() {}
30
31
public string Name
32
{
33
set{ name = value ; }
34
get{ return name ; }
35
}
36
}
37
public class Link
38
{
39
private string telephone = String.Empty ;
40
41
public Link() {}
42
43
public string Telephone
44
{
45
set{ telephone = value ; }
46
get{ return telephone ; }
47
}
48
}
49
50
/// <summary>
51
/// 界面展现层
52
/// </summary>
53
public class PageView
54
{
55
public PageView() {}
56
57
public void Show()
58
{
59
string name = BusinessRule.GetPersonName() ;
60
string telephone = BusinessRule.GetPersonTelephone() ;
61
Console.WriteLine( string.Format( "{0}的电话是{1}." , name ,telephone ) ) ;
62
}
63
}
64
/// <summary>
65
/// 业务逻辑层
66
/// </summary>
67
public class BusinessRule
68
{
69
public BusinessRule() {}
70
71
public static string GetPersonName()
72
{
73
//业务逻辑代码
74
return ( new Data() ).GetBasicPerson().Name ;
75
}
76
public static string GetPersonTelephone()
77
{
78
//业务逻辑代码
79
return ( new Data() ).GetLink().Telephone ;
80
}
81
}
82
83
/// <summary>
84
/// 数据持久化层
85
/// </summary>
86
public class Data
87
{
88
public Data() {}
89
90
public BasicPerson GetBasicPerson()
91
{
92
BasicPerson basic = new BasicPerson() ;
93
basic.Name = "冯超" ;
94
return basic ;
95
}
96
public Link GetLink()
97
{
98
Link link = new Link() ;
99
link.Telephone = "88888888" ;
100
return link ;
101
}
102
}
103
#endregion
104
}
105
}
using System;2
3
namespace Example4
{5
/**//// <summary>6
/// 示例7
/// </summary>8
class Example9
{10
/**//// <summary>11
/// 应用程序的主入口点。12
/// </summary>13
[STAThread]14
static void Main(string[] args)15
{16
PageView view = new PageView() ;17
view.Show() ;18
}19
#region 2005071220
21
/// <summary>22
/// 原person对象拆分为2个对象BasicPerson 和 Link23
/// 去掉原对象person24
/// </summary>25
public class BasicPerson 26
{27
private string name = String.Empty ;28

29
public BasicPerson() {}30

31
public string Name 32
{33
set{ name = value ; }34
get{ return name ; }35
}36
}37
public class Link 38
{39
private string telephone = String.Empty ;40

41
public Link() {}42
43
public string Telephone 44
{45
set{ telephone = value ; }46
get{ return telephone ; }47
}48
}49

50
/// <summary>51
/// 界面展现层52
/// </summary>53
public class PageView54
{55
public PageView() {}56
57
public void Show()58
{59
string name = BusinessRule.GetPersonName() ;60
string telephone = BusinessRule.GetPersonTelephone() ;61
Console.WriteLine( string.Format( "{0}的电话是{1}." , name ,telephone ) ) ;62
}63
}64
/// <summary>65
/// 业务逻辑层66
/// </summary>67
public class BusinessRule68
{69
public BusinessRule() {}70

71
public static string GetPersonName()72
{73
//业务逻辑代码74
return ( new Data() ).GetBasicPerson().Name ;75
}76
public static string GetPersonTelephone()77
{78
//业务逻辑代码79
return ( new Data() ).GetLink().Telephone ;80
}81
}82
83
/// <summary>84
/// 数据持久化层85
/// </summary>86
public class Data87
{88
public Data() {}89

90
public BasicPerson GetBasicPerson()91
{92
BasicPerson basic = new BasicPerson() ;93
basic.Name = "冯超" ;94
return basic ;95
}96
public Link GetLink()97
{98
Link link = new Link() ;99
link.Telephone = "88888888" ;100
return link ;101
}102
}103
#endregion104
}105
}本来这样的改动是不用修改界面展现层和业务逻辑层的,只要在业务逻辑层和数据持久化层插入一个数据对象转换层就能很好的解决问题。
比较好的解决方法是:

模型代码为(好的修改):
1
using System;
2
3
namespace Example
4
{
5
/**//// <summary>
6
/// 示例
7
/// </summary>
8
class Example
9
{
10
/**//// <summary>
11
/// 应用程序的主入口点。
12
/// </summary>
13
[STAThread]
14
static void Main(string[] args)
15
{
16
PageView view = new PageView() ;
17
view.Show() ;
18
}
19
#region 20050712
20
/// <summary>
21
/// 原对象person
22
/// </summary>
23
public class Person
24
{
25
private string name = String.Empty ;
26
private string telephone = String.Empty ;
27
28
public Person() {}
29
30
public string Name
31
{
32
set{ name = value ; }
33
get{ return name ; }
34
}
35
public string Telephone
36
{
37
set{ telephone = value ; }
38
get{ return telephone ; }
39
}
40
}
41
/// <summary>
42
/// 原person对象拆分为2个对象BasicPerson 和 Link
43
/// </summary>
44
public class BasicPerson
45
{
46
private string name = String.Empty ;
47
48
public BasicPerson() {}
49
50
public string Name
51
{
52
set{ name = value ; }
53
get{ return name ; }
54
}
55
}
56
public class Link
57
{
58
private string telephone = String.Empty ;
59
60
public Link() {}
61
62
public string Telephone
63
{
64
set{ telephone = value ; }
65
get{ return telephone ; }
66
}
67
}
68
69
/// <summary>
70
/// 界面展现层
71
/// </summary>
72
public class PageView
73
{
74
public PageView() {}
75
76
public void Show()
77
{
78
string name = BusinessRule.GetPersonName() ;
79
string telephone = BusinessRule.GetPersonTelephone() ;
80
Console.WriteLine( string.Format( "{0}的电话是{1}." , name ,telephone ) ) ;
81
}
82
}
83
/// <summary>
84
/// 业务逻辑层
85
/// </summary>
86
public class BusinessRule
87
{
88
public BusinessRule() {}
89
90
public static string GetPersonName()
91
{
92
//业务逻辑代码
93
return ( new Data() ).GetPerson().Name ;
94
}
95
public static string GetPersonTelephone()
96
{
97
//业务逻辑代码
98
return ( new Data() ).GetPerson().Telephone ;
99
}
100
}
101
/// <summary>
102
/// 数据对象转换层
103
/// </summary>
104
public class Combination
105
{
106
public Combination() {}
107
108
public static Person GetPerson( BasicPerson basic , Link link )
109
{
110
Person person = new Person() ;
111
person.Name = basic.Name ;
112
person.Telephone = link.Telephone ;
113
return person ;
114
}
115
}
116
/// <summary>
117
/// 数据持久化层
118
/// </summary>
119
public class Data
120
{
121
public Data() {}
122
123
public Person GetPerson()
124
{
125
Person person = new Person() ;
126
BasicPerson basic = new BasicPerson() ;
127
Link link = new Link() ;
128
129
basic.Name = "冯超" ;
130
link.Telephone = "88888888" ;
131
//组合被拆分的小对象
132
person = Combination.GetPerson( basic , link ) ;
133
return person ;
134
}
135
}
136
#endregion
137
}
138
}
using System;2
3
namespace Example4
{5
/**//// <summary>6
/// 示例7
/// </summary>8
class Example9
{10
/**//// <summary>11
/// 应用程序的主入口点。12
/// </summary>13
[STAThread]14
static void Main(string[] args)15
{16
PageView view = new PageView() ;17
view.Show() ;18
}19
#region 2005071220
/// <summary>21
/// 原对象person22
/// </summary>23
public class Person24
{25
private string name = String.Empty ;26
private string telephone = String.Empty ;27

28
public Person() {}29

30
public string Name31
{32
set{ name = value ; }33
get{ return name ; }34
}35
public string Telephone36
{37
set{ telephone = value ; }38
get{ return telephone ; }39
}40
}41
/// <summary>42
/// 原person对象拆分为2个对象BasicPerson 和 Link43
/// </summary>44
public class BasicPerson 45
{46
private string name = String.Empty ;47

48
public BasicPerson() {}49

50
public string Name 51
{52
set{ name = value ; }53
get{ return name ; }54
}55
}56
public class Link 57
{58
private string telephone = String.Empty ;59

60
public Link() {}61
62
public string Telephone 63
{64
set{ telephone = value ; }65
get{ return telephone ; }66
}67
}68

69
/// <summary>70
/// 界面展现层71
/// </summary>72
public class PageView73
{74
public PageView() {}75
76
public void Show()77
{78
string name = BusinessRule.GetPersonName() ;79
string telephone = BusinessRule.GetPersonTelephone() ;80
Console.WriteLine( string.Format( "{0}的电话是{1}." , name ,telephone ) ) ;81
}82
}83
/// <summary>84
/// 业务逻辑层85
/// </summary>86
public class BusinessRule87
{88
public BusinessRule() {}89

90
public static string GetPersonName()91
{92
//业务逻辑代码93
return ( new Data() ).GetPerson().Name ;94
}95
public static string GetPersonTelephone()96
{97
//业务逻辑代码98
return ( new Data() ).GetPerson().Telephone ;99
}100
}101
/// <summary>102
/// 数据对象转换层103
/// </summary>104
public class Combination105
{106
public Combination() {} 107
108
public static Person GetPerson( BasicPerson basic , Link link )109
{110
Person person = new Person() ;111
person.Name = basic.Name ;112
person.Telephone = link.Telephone ;113
return person ;114
}115
}116
/// <summary>117
/// 数据持久化层118
/// </summary>119
public class Data120
{121
public Data() {}122

123
public Person GetPerson()124
{125
Person person = new Person() ;126
BasicPerson basic = new BasicPerson() ;127
Link link = new Link() ;128
129
basic.Name = "冯超" ;130
link.Telephone = "88888888" ;131
//组合被拆分的小对象132
person = Combination.GetPerson( basic , link ) ;133
return person ;134
}135
}136
#endregion137
}138
}即是说,好的修改应该是内聚的。


浙公网安备 33010602011771号