- 浏览: 495683 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
《重构-改善既有代码的设计》是一本好书,值得大家去反复看几遍,对后面学习设计模式有很好的帮助。设计模式猛一看,会很晕,云里雾里的,所以可以从重构开始,一点一点改善代码的设计,然后重构到模式,这样可以理解的更透侧,更容易消化。
书中会列举出很多的坏味道bad smell,然后重构这些bad smell,增加复用性。其中一个就是当你使用switch的时候,尤其是case的东西定义了枚举类型的话,很多时候都可以用面向对象的多态很好的解决。要不然就是当你多一个枚举值的时候,需要修改原来的每一个switch,在每个里面添加一个case。
近来在写一段程序的时候,大概需求是员工,有几个种类的员工,工程师,销售人员。设计好数据库就直接使用代码生成工具,生成了一大堆代码,设计的时候考虑到工程师或者销售人员数据量会很大,所以就放在了两个表中。
这样就生成连个类engineer和salesman,和一些类的操作代码,就是一些add、delete、modify和get。
就开始写后面的业务代码了,写的过程中发现engineer和salesman还是有很多是一样的,比如说username、password、logonname、birthday等等,就在业务层定义了一个employee类,类里面有一个属性叫做employeeType,初始化employee的时候会赋值,就是表明当前员工是engineer还是salesman。
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
enum employeeType1
{
engineer,
salesman
}
class employee11
{
private employeeType _empType;
private int _id;
public employee11(employeeType empType)
: this(empType, 0)
{
}
public employee11(int id)
: this(employeeType.engineer, id)
{
}
public employee11(employeeType empType, int id)
{
this._empType = empType;
this._id = id;
}
public void PrintSalary()
{
switch (_empType)
{
case employeeType.engineer:
engineer1 e = new engineer1();
e.PrintSalary();
break;
case employeeType.salesman:
salesman1 s = new salesman1();
s.PrintSalary();
break;
}
}
public void PrintName()
{
switch (_empType)
{
case employeeType.engineer:
engineer1 e = new engineer1();
e.PrintName();
break;
case employeeType.salesman:
salesman1 s = new salesman1();
s.PrintName();
break;
}
}
}
class engineer1
{
public void PrintSalary()
{
Console.WriteLine("your salary is {0}", 1000);
}
public void PrintName()
{
Console.WriteLine("your name is {0}", "shiwenbin");
}
}
class salesman1
{
public void PrintSalary()
{
Console.WriteLine("your salary is {0}", 2000);
}
public void PrintName()
{
Console.WriteLine("your name is {0}", "swb");
}
}
}
如果后面要添加一个新员工类型,比如说boss,这样的话,首先要修改枚举employeeType1,然后要建立一个boss类,然后写上操作代码,还要在员工类employee11中的所有switch中都添加一个case,判断是否boss,然后调用boss的方法。
新添加一个员工类型,修改代码是必然的,但是可以控制在一定的范围内,代码应该对修改封闭,对增加开发,这也是一个代码设计原则。有一种办法,例如面向对象的多态,可以很好的解决这个问题,使得下次增加员工类型的话,只是修改枚举量和新建一个员工类,其他的什么都不用动了。只要将上面的类改造为下面的内容。
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
enum employeeType
{
engineer,
salesman
}
class employee1
{
protected employeeType _empType;
protected int _id;
public employee1(employeeType empType):this(empType,0)
{
}
public employee1(int id):this(employeeType.engineer,id )
{
}
public employee1(employeeType empType, int id)
{
this._empType = empType;
this._id = id;
}
public virtual void PrintName()
{
}
public virtual void PrintSalary()
{
}
public virtual void Print()
{
Console.WriteLine("haha");
}
public override string ToString()
{
return string.Format("id is :{0}; type is {1}", _id, _empType);
}
}
class engineer : employee1
{
public engineer(int id)
: base(employeeType.engineer)
{
this._id = id;
}
public engineer()
: base(employeeType.engineer)
{
}
public override void PrintName()
{
Console.WriteLine("i am {0}", _empType.ToString());
}
public override void PrintSalary()
{
Console.WriteLine("your salary is {0}", 1000);
}
public override string ToString()
{
return string.Format("id is :{0}; type is {1}", _id, _empType);
}
}
class salesman : employee1
{
public salesman(int id)
: base(employeeType.salesman)
{
this._id = id;
}
public salesman()
: base(employeeType.engineer)
{
}
public override void PrintName()
{
Console.WriteLine("i am {0}", _empType.ToString());
}
public override void PrintSalary()
{
Console.WriteLine("your salary is {0}", 2000);
}
public override string ToString()
{
return string.Format("id is :{0}; type is {1}", _id, _empType);
}
}
class Program
{
static void Main(string[] args)
{
engineer emp1 = new engineer(123);
emp1.PrintName();
emp1.PrintSalary();
emp1.Print();
Console.WriteLine(emp1.ToString());
Console.WriteLine("------------------------------");
salesman emp2 = new salesman(456);
emp2.PrintSalary();
emp2.Print();
Console.WriteLine(emp2.ToString());
Console.WriteLine("------------------------------");
Console.ReadLine();
}
}
}
也就是利用了继承和虚函数来实现多态,来实现对修改封闭,对增加开放。
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 547如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 669组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 528本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5915 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 614前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 836企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 624首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 594概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 996概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 803我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8401 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9691、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 777引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 650oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 605经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 633今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 682我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 699今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 671题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
3.10 Switch Statements(switch惊悚现身) 82 3.11 Parallel InheritanceHierarchies(平行继承体系) 83 3.12 Lazy Class(冗赘类) 83 3.13 Speculative Generality(夸夸其谈未来性) 83 3.14 ...
3.10 Switch Statements(switch惊悚现身) 3.11 Parallel Inheritance Hierarchies(平行继承体系) 3.12 Lazy Class(冗赘类) 3.13 Speculative Generality(夸夸其谈未来性) 3.14 Temporary Field(令人迷惑的...
Switch Statements switch语句 Parallel Inheritance Hierarchies 平行继承体系 Lazy Class 冗余类 Speculative Generality 理论上的一般性 Temporary Field 临时字段 Message Chains 消息链...
Switch Statements switch语句 Parallel Inheritance Hierarchies 平行继承体系 Lazy Class 冗余类 Speculative Generality 理论上的一般性 Temporary Field 临时字段 Message Chains 消息链...
重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与...
Switch Statements switch语句 Parallel Inheritance Hierarchies 平行继承体系 Lazy Class 冗余类 Speculative Generality 理论上的一般性 Temporary Field 临时字段 Message Chains 消息链...
### 重构改善既有代码的设计 #### 一、重构的基本概念 重构是指在不改变软件外部行为的情况下,通过修改代码来优化其内部结构的过程。这一过程旨在提高代码的可读性、可维护性和可扩展性,使得软件开发人员能够...
Switch Statements switch语句 Parallel Inheritance Hierarchies 平行继承体系 Lazy Class 冗余类 Speculative Generality 理论上的一般性 Temporary Field 临时字段 Message Chains ...
Switch Statements switch语句 Parallel Inheritance Hierarchies 平行继承体系 Lazy Class 冗余类 Speculative Generality 理论上的一般性 Temporary Field 临时字段 Message Chains ...
《重构:改善既有代码的设计》是一本深入探讨重构技术的书籍,作者通过实际案例阐述了重构的重要性及其实施方法。书中提到的第一个案例详细展示了如何逐步对一个名为`statement()`的函数进行重构,包括分解、重组...
该项目遵循Martin Fowler在其1999年的著作《重构:改善既有代码的设计》中提出的五种主要的代码坏味道概念: 1. **数据块(Data Clumps)**:当多个变量经常一起出现,可能意味着应存在一个新的数据结构来封装这些...