作者:伍迷 http://cj723.cnblogs.com
http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html
整理:秦韶华
作者:伍迷 戏说面向对象程序设计
C#版
目 录
代序.............四大发明之活字印刷——面向对象思想的胜利
第一章............面试受挫——代码无错就是好?
第二章............代码规范、重构
第三章............复制VS复用
第四章............业务的封装
第五章............体会简单工厂模式的美妙
第六章............工厂不好用了?
第七章............用“策略模式”是一种好策略
第八章............反射——程序员的快乐!
第九章............会修电脑不会修收音机?——聊设计模式原则
第十章............三层架构,分层开发
第十一章...........无熟人难办事?——聊设计模式迪米特法则
第十二章...........有了门面,程序员的程序会更加体面
第十三章...........设计模式不能戏说!设计模式怎就不能戏说?
1
四大发明之活字印刷 ——面向对象思想的胜利
话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,
曹操大悦,于是大宴众文武,在酒席间,曹操诗性大发,不觉吟道: “喝酒唱歌,人生真爽。 …………”。众文武齐呼: “丞
相好诗!” 于是一臣子速命印刷工匠刻版印刷,以便流传天下。
样张出来给曹操一看,曹操感觉不妥,说道: “喝与唱,此话过俗,应改为‘ 对酒当歌’ 较好! ”,于是此臣就命工匠重
新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不喋。只得照办。
样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:“ 人生真爽太过直接,应改问语才够意境,因此应
改为‘ 对酒当歌,人生几何? …………’!” 当臣转告工匠之时,工匠晕倒…………!
可惜三国时期活字印刷还未发明,所以类似事情应该时有发生,如果是有了活字印刷。则只需更改四个字就可,其
余工作都未白做。实在妙哉。
2
第一,要改,只需更改要改之字,此为 可维护 ;第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复
使用,此乃 可复用 ;第三,此诗若要加字,只需另刻字加入即可,这是 可扩展 ;第四,字的排列其实有可能是竖有可能
是横排,此时只需将活字移动就可做到满足排列需求,此是 灵活性好 。
而在活字印刷术之前,上面的四种特性都无法满足,要修改,必须重刻,要加字,必须重刻,要重新排列,必须重
刻,印完这本书后,此版已无任何可再利用价值。
小时候,我一直奇怪,为何火药、指南针、造纸术都是从无到有,从未知到发现的伟大发明,而活字印刷仅仅是从
刻版印刷到活字印刷的一次技术上的进步,为何不是评印刷术为四大发明之一呢?
做了软件开发几年后,经历了太多的客户(曹操)改变需求,更改最初想法的事件,才逐渐明白当中的道理。其实
客观的说,客户的要求也并不过分(改几个字而已),但面对已完成的程序代码,却是需要几乎重头来过的尴尬,这实
在是痛苦不堪。说白了,原因就是因为我们 原先所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用,因
此面对需求变化,加班加点,对程序动大手术的那种无耐也就非常正常的事了 。
之后当我学习了面向对象分析设计编程思想,开始考虑 通过封装、继承、多态把程序的耦合度降低 (传统印刷术的
问题就在于所有的字都刻在同一版面上造成耦合度太高所制),开始 用设计模式使得程序更加的灵活,容易修改,并且
易于复用 。体会到面向对象带来的好处,那种感觉应该就如同是一中国酒鬼第一次喝到了茅台,西洋酒鬼第一次喝到了
XO一样,怎个爽字可形容呀。
再次回顾中国古代的四大发明,另三种应该都是科技的进步,伟大的创造或发现。而唯有活字印刷,实在是思想的
成功,面向对象的胜利。不知您是否也有所感呢?
3
第一章 面试受挫——代码无错就是好?
小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单
位。当投递了无数份简历后,终于收到了一个单位的面试通知,小菜欣喜若狂。
到了人家单位,前台小姐给了他一份题目,上面写着,“ 请用C++ 、Java 、C# 或 VB.NET任意一种面向对象语言实
现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。”
小菜一看,这个还不简单,三下五除二, 10分钟不到,小菜写完了,感觉也没错误。交卷后,单位说一周内等通知
吧。于是小菜只得耐心等待。可是半个月过去了,什么消息也没有,小菜很纳闷,我的代码实现了呀,为什么不给我机
会呢。
小菜找到工作三年的师哥大鸟,请教原因,大鸟问了题目和了解了小菜代码的细节以后,哈哈大笑,说道:“ 小菜
呀小菜,你上当了,人家单位出题的意思,你完全都没明白,当然不会再联系你了” 。
小菜说: “我的代码有错吗?单位题目不就是要我实现一个计算器的代码吗,我这样写有什么问题。”
class Program
{
static void Main(string[] args)
{
Console.Write("请输入数字A:");
string A = Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):");
string B = Console.ReadLine();
Console.Write("请输入数字B:");
string C = Console.ReadLine();
string D = "";
if (B == "+")
D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C));
if (B == "-")
D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C));
if (B == "*")
D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C));
if (O == "/")
D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C));
Console.WriteLine("结果是:" + D);
}
}
小菜的代码有什么问题呢?
4
第二章 代码规范、重构
大鸟说: “且先不说出题人的意思,单就你现在的代码,就有很多不足的地方需要改进。比如变量命名,你的命名
就是ABCD ,变量不带有任何具体含义,这是非常不规范的;判断分支,你这样的写法,意味着每个条件都要做判断,
等于计算机做了三次无用功;数据输入有效性判断等,如果用户输入的是字符符号而不是数字怎么办?如果除数时,客
户输入了0 怎么办?这些都是可以改进的地方。”
“哦,说得没错,这个我以前听老师说过,可是从来没有在意过,我马上改,改完再给你看看。”
class Program
{
static void Main(string[] args)
{
try
{
Console.Write("请输入数字A:");
string strNumberA = Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("请输入数字B:");
string strNumberB = Console.ReadLine();
string strResult = "";
switch (strOperate)
{
case "+":
strResult = Convert.ToString
(Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB));
break;
case "-":
strResult = Convert.ToString
(Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB));
break;
case "*":
strResult = Convert.ToString
(Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB));
break;
case "/":
if (strNumberB != "0")
strResult = Convert.ToString
(Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB));
else
strResult = "除数不能为0";
break;
}
5
Console.WriteLine("结果是:" + strResult);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("您的输入有错:" + ex.Message);
}
}
}
大鸟:“ 吼吼,不错,不错,改得很快吗?至在目前代码来说,实现计算器是没有问题了,但这样写出的代码是否
合出题人的意思呢?”
小菜:“ 你的意思是面向对象?”
大鸟:“ 哈,小菜非小菜也!”
6
第三章 复制VS 复用
小菜:“ 我明白了,他说用任意一种面向对象语言实现,那意思就是要用面向对象的编程方法去实现,对吗?OK ,
这个我学过,只不过当时我没想到而已。”
大鸟:“ 所有编程初学者都会有这样的问题,就是碰到问题就直觉的用计算机能够理解的逻辑来描述和表达待解决
的问题及具体的求解过程。这其实是用计算机的方式去思考,比如计算器这个程序,先要求输入两个数和运算符号,然
后根据运算符号判断选择如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只为满足实现当前的需
求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。”
小菜:“ 鸟哥呀,我有点糊涂了,如何才能容易维护,容易扩展,又容易
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论


















收起资源包目录





































































































共 121 条
- 1
- 2
资源评论

- zhangyuli12020-11-25还不错的资源
- qq_348215452020-03-06骗子!你一个CS程序,谈什么在线预览?而且用的AxDSOFramer

tone1128
- 粉丝: 32
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于规则算法的功率跟随控制:燃料电池汽车能量管理策略及其MATLAB数据分析
- (源码)基于C++的贪吃蛇游戏.zip
- 基于模态计算与声振耦合仿真的玻璃隔声量研究及其工程应用
- (源码)基于Python和Arduino的复古LED条形音频可视化器.zip
- 基于Matlab的ESMD信号分解算法:极值点驱动的数据处理与分析 · 时频分析
- 基于MATLAB的特征子集选择(FSS)与前后搜索法实现及应用
- (源码)基于Arduino的JoystickBuzzer音乐控制器项目.zip
- 模块化多电平换流器MMC的载波移相调制及PLECS仿真研究:工况参数为AC3.3kvDC6kv,采用N=6配置,优化双闭环控制与均压策略
- 基于UDP千兆以太网协议栈的纯FPGA Verilog OV5640图像采集系统实现
- (源码)基于Android的学习应用.zip
- CNG加气站设计:从背景到工艺流程的全面解析与实施方案
- (源码)基于C++的面试算法学习项目.zip
- 基于MATLAB的石川公式法齿轮时变啮合刚度计算及应用 宝典
- 基于MATLAB的EKF-GMPHD与UKF-GMPHD多目标跟踪算法研究及仿真 v4.0
- (源码)基于C++语言的RGB到YCbCr颜色空间转换系统.zip
- 永磁同步电机接地故障检测与处理的技术解析及Python代码实现 信号处理 (07月)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
