所做的是系统中的一个模块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}
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}
由于开始数据库的设计不是很合理,把A模块的信息都集中存放在一个表中,用一个对象来表示,结果到现在变得不易与其他模块共用数据,所以就把这个表拆成几个小表,形成多个小对象,并关联起来。
由于我思维定势,在修改了数据持久层后又去修改业务逻辑层。把原本好的设计的优势浪费了 。
改动为(不好的修改):
1using System;
2
3namespace 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}
2
3namespace 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}
本来这样的改动是不用修改界面展现层和业务逻辑层的,只要在业务逻辑层和数据持久化层插入一个数据对象转换层就能很好的解决问题。
比较好的解决方法是:
模型代码为(好的修改):
1using System;
2
3namespace 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}
2
3namespace 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}
即是说,好的修改应该是内聚的。