面向对象思想 那位老师能给我解释一下:什么是面向过程,什么又是面向对象 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单地说,面向接口编程、经常用多态的思想来将成百上千的耦合关系简化为7、8种以下的关系(子类重写父类的个别方法而继承父类的大多数耦合功能),这就是面向对象设计。软件界有两个人:Ivar Jacobson、James Martin,他们是最近20比较著名的人,许多人说他们的方法是面向对象的。前者是UML的三位创始人之一,是Rational的老资格人物;后者则是号称敏捷开发之父,是个了解号称精通UML而又背叛UML/RUP的人。但是我看着两个人都是一丘之貉,他们两个分析系统时首先从行为出发,他们画出的对象类型关联图中有大量的command,而对真正业务领域对象反而很少谈论。我举出这两个反例,说明我对面向对象设计的观点,它远没有20年前的OMT时期成熟,反而因为UML/RUP过分强调形式规范(而不讲解方法)的原因害了好几代人,如此才会出现XP之类反对RUP到了极端程度的流派。面向对象设计是一种方法,它说明对象类应该优先注重接口协议、可以继承、支持多态,如此而已。它注重从应用领域的“自然”的模型出发,而不是从什么编程模式出发。基于这种观点,再看用例分析、数据分析、控制流程,等等,我们就不需要纠缠于一次性地把需求说的多么完美。我们可以成功地开发一套基本系统,然后通过高明地引入继承和多态来扩展它,在成功的基础上小步快跑快速改进系统。当我们去考虑需求千变万化的时候,我们原来的结构关联图、流程图、消息图、时序图、用例图、状态图、活动图、功能图,又是怎么面对继承和多态的需求的呢?知道这写就足够了。而XP等技术则用TDD、重构等技术来从最细节保证了这种工程思想不是停留在“奢谈迭代”而是真的可以为客户不断发布永远兼容的产品,因为我们总是在1、2天内即时开发软件(而不是消耗半年时间来设计软件),所以更加需要精简的符号化设计思想。 他们是最近20比较著名的人,许多人说他们的方法是 --> 他们是最近20年比较著名的人,许多人说他们的方法是很奇怪地,James Rumbaugh等人的OMT是面向对象真正灵魂,但是后来加入了Rational为了钱而被Jacobson等人河蟹成了UML,于是就越来越庸俗;Kent Beck的XP则是另一种RUP杀手级的软件工程技巧,可是为了扩大影响而任由Robert C. Martin随意添油加醋河蟹成了敏捷开发的主流之一。我本人认为,想了解面向对象设计技术的本质,需要把最近15年的过于注重官样文章的东西去掉,去花2年时间学好OMT。想了解敏捷开发,需要把那些只重没有技术含量的行政手段的敏捷思潮去掉,去花3个月时间学好XP。 老p的观点非常正确。如果非要追究对象这个概念,只能返回“自然”,去谈哲学了。当然我也不反对后面两个东西。对象是我们头脑对现实世界的那个自然认知。问题是这个认知是否正确,是否存在曲解,还是要有手段来证明的。UML,TDD倒是一个不错验证手段,让我们可以通过“图形演变”和“代码演变”来观察这个棋下的好不好,不好我还可以“悔棋”去修正原始的认知至于lz困惑的“过程”和“对象”,实际区别在于是否存在这个返回“自然”的认知。如果不返回自然,那么所追求的就是算法,而返回自然所最求的是“对象结构”lz可以去google一下:“有道难题 萝卜园问题”,这个在博客园上曾经有过一次大规模的代码大比拼。你可以看到 “过程”和“对象”两种方式的实现,比较一下这两种方式的实现,你就会发现他们有明显的不同,过程的强调的算法效率,而对象的强调是返回自然的认知。 实际上有关“对象”这样的问题,非常难以回答这也是这两天,连续都有人发帖问“对象”,却基本没人回答的原因(包括今天又被挖坟挖出来的那个09年的老帖,争论那么激烈却没任何结果)讨论对象,最终会被上升到认知,哲学,思想,方法学-----这类形而上的东西,所以对于新人来说,我的建议是放下这些无关紧要的东西,学自己该学的,做自己该做就是以前侯捷(台 湾 人,写的有《深入浅出MFC》和翻译过其他基本c++领域的重量级书)老师书上的几句话对我帮助很大,我可以转送给你1.好读书不求甚解2.山高月小、水落石出3.勿在浮沙筑高台这几句合起来的意思是:不拘泥,要广泛涉猎!对于不懂的东西,不需要强行弄懂,你不懂是经验或历练问题,一旦经验足够,你就会自然而自然的领悟。当下最重要的事情不是去追浮沙上的高台,而是弄懂你能弄懂的,实践你能实践的 呵呵,我想除了sp1234大哥敢批判这样出著作的人,而不被大家批判,在csdn是没有其他的大牛了。。收藏了,这是复习功课资料。 恩,的确!老P的斧头一向比较狠,不是把人砸醒了,就是把人砸的更晕了我们来看一个具体的例子吧http://topic.csdn.net/u/20100303/18/2057e726-300d-46b1-8bfa-8af06483cc56.html原题要求:今天写了个随机配对的代码,感觉效率不行。问题如下:20个数(放一个数组),随机两两配对。有没有什么效率比较高的算法5楼过程的解法using System;namespace csdnTest{class Program{static void Main(string[] args){int[] Items = new int[20];for (int i = 0; i < Items.Length; i++)Items[i] = i;Random rnd = new Random();for (int i = Items.Length - 1; i >= 0; i--){int k = rnd.Next(i);Swap(Items,k, i);}for (int i = 0; i < Items.Length >> 1; i++)Console.WriteLine("{0} {1}", Items[i * 2], Items[i * 2 + 1]);Console.ReadKey();}static void Swap(int[] array, int indexA, int indexB){int value = array[indexA];array[indexA] = array[indexB];array[indexB] = value;}}}6楼对象解法var input = Enumerable.Range(1, 20).ToArray(); var res1=input.Select(c=>new {i=c,guid=Guid.NewGuid()}); var res2=res1.OrderBy(c=>c.guid);你可以看到明显的不同,5楼是算法,根据题意直接考虑算法求解而对象解法第一步 并不是考虑如何算,而是考虑构造一个可排序的对象,在认识上我们说我们抽象了一个临时对象,这个对象包含一个本身值的属性,同时包含随机的标签属性。我们按随机标签属性排序即可实现原题的要求,这里就是我们的一个“自然”回归过程,我们不再关心他如何算。我们心里的自然原型是:“我要把一些东西放进一些贴着乱起八遭标签的盒子,然后整理这些盒子让他们看着更顺眼点” 当你开发完一个UML建模工具之后,相信你就能理解什么是面向对象了。可以仿照Jude开发 未将对象引用到对象的实例 net用什么加密源码软件??? 新手请教:看看这段数据库更新代码为什么不执行? 多边形 膨胀 收缩 算法 如何用DomainService1操作数据库(主要是写入) 如何使用时间控件 添加字段 c#中html页面里我做了个动态图片的css冲突问题 在c#中实现类的抽象很容易,但是在asp.net界面中怎样实现界面的抽象比较好呢,请高手进来指点和讨论 300分求C#之好书!(网络版) 我的机器上没有Tlbimp.exe datagridview导出成excel时,页眉和页脚
很奇怪地,James Rumbaugh等人的OMT是面向对象真正灵魂,但是后来加入了Rational为了钱而被Jacobson等人河蟹成了UML,于是就越来越庸俗;Kent Beck的XP则是另一种RUP杀手级的软件工程技巧,可是为了扩大影响而任由Robert C. Martin随意添油加醋河蟹成了敏捷开发的主流之一。我本人认为,想了解面向对象设计技术的本质,需要把最近15年的过于注重官样文章的东西去掉,去花2年时间学好OMT。想了解敏捷开发,需要把那些只重没有技术含量的行政手段的敏捷思潮去掉,去花3个月时间学好XP。
1.好读书不求甚解
2.山高月小、水落石出
3.勿在浮沙筑高台这几句合起来的意思是:不拘泥,要广泛涉猎!对于不懂的东西,不需要强行弄懂,你不懂是经验或历练问题,一旦经验足够,你就会自然而自然的领悟。当下最重要的事情不是去追浮沙上的高台,而是弄懂你能弄懂的,实践你能实践的
http://topic.csdn.net/u/20100303/18/2057e726-300d-46b1-8bfa-8af06483cc56.html原题要求:
今天写了个随机配对的代码,感觉效率不行。
问题如下:20个数(放一个数组),随机两两配对。有没有什么效率比较高的算法5楼过程的解法
using System;namespace csdnTest
{
class Program
{
static void Main(string[] args)
{
int[] Items = new int[20];for (int i = 0; i < Items.Length; i++)
Items[i] = i;Random rnd = new Random();for (int i = Items.Length - 1; i >= 0; i--)
{
int k = rnd.Next(i);
Swap(Items,k, i);
}for (int i = 0; i < Items.Length >> 1; i++)
Console.WriteLine("{0} {1}", Items[i * 2], Items[i * 2 + 1]);Console.ReadKey();
}static void Swap(int[] array, int indexA, int indexB)
{
int value = array[indexA];
array[indexA] = array[indexB];
array[indexB] = value;
}
}
}6楼对象解法
var input = Enumerable.Range(1, 20).ToArray();
var res1=input.Select(c=>new {i=c,guid=Guid.NewGuid()});
var res2=res1.OrderBy(c=>c.guid);你可以看到明显的不同,5楼是算法,根据题意直接考虑算法求解而对象解法第一步 并不是考虑如何算,而是考虑构造一个可排序的对象,在认识上我们说我们抽象了一个临时对象,这个对象包含一个本身值的属性,同时包含随机的标签属性。我们按随机标签属性排序即可实现原题的要求,这里就是我们的一个“自然”回归过程,我们不再关心他如何算。我们心里的自然原型是:“我要把一些东西放进一些贴着乱起八遭标签的盒子,然后整理这些盒子让他们看着更顺眼点”
可以仿照Jude开发