那位老师能给我解释一下:什么是面向过程,什么又是面向对象

解决方案 »

  1.   

    简单地说,面向接口编程、经常用多态的思想来将成百上千的耦合关系简化为7、8种以下的关系(子类重写父类的个别方法而继承父类的大多数耦合功能),这就是面向对象设计。软件界有两个人:Ivar Jacobson、James Martin,他们是最近20比较著名的人,许多人说他们的方法是面向对象的。前者是UML的三位创始人之一,是Rational的老资格人物;后者则是号称敏捷开发之父,是个了解号称精通UML而又背叛UML/RUP的人。但是我看着两个人都是一丘之貉,他们两个分析系统时首先从行为出发,他们画出的对象类型关联图中有大量的command,而对真正业务领域对象反而很少谈论。我举出这两个反例,说明我对面向对象设计的观点,它远没有20年前的OMT时期成熟,反而因为UML/RUP过分强调形式规范(而不讲解方法)的原因害了好几代人,如此才会出现XP之类反对RUP到了极端程度的流派。面向对象设计是一种方法,它说明对象类应该优先注重接口协议、可以继承、支持多态,如此而已。它注重从应用领域的“自然”的模型出发,而不是从什么编程模式出发。基于这种观点,再看用例分析、数据分析、控制流程,等等,我们就不需要纠缠于一次性地把需求说的多么完美。我们可以成功地开发一套基本系统,然后通过高明地引入继承和多态来扩展它,在成功的基础上小步快跑快速改进系统。当我们去考虑需求千变万化的时候,我们原来的结构关联图、流程图、消息图、时序图、用例图、状态图、活动图、功能图,又是怎么面对继承和多态的需求的呢?知道这写就足够了。而XP等技术则用TDD、重构等技术来从最细节保证了这种工程思想不是停留在“奢谈迭代”而是真的可以为客户不断发布永远兼容的产品,因为我们总是在1、2天内即时开发软件(而不是消耗半年时间来设计软件),所以更加需要精简的符号化设计思想。
      

  2.   

    他们是最近20比较著名的人,许多人说他们的方法是 -->  他们是最近20年比较著名的人,许多人说他们的方法是
    很奇怪地,James Rumbaugh等人的OMT是面向对象真正灵魂,但是后来加入了Rational为了钱而被Jacobson等人河蟹成了UML,于是就越来越庸俗;Kent Beck的XP则是另一种RUP杀手级的软件工程技巧,可是为了扩大影响而任由Robert C. Martin随意添油加醋河蟹成了敏捷开发的主流之一。我本人认为,想了解面向对象设计技术的本质,需要把最近15年的过于注重官样文章的东西去掉,去花2年时间学好OMT。想了解敏捷开发,需要把那些只重没有技术含量的行政手段的敏捷思潮去掉,去花3个月时间学好XP。
      

  3.   

    老p的观点非常正确。如果非要追究对象这个概念,只能返回“自然”,去谈哲学了。当然我也不反对后面两个东西。对象是我们头脑对现实世界的那个自然认知。问题是这个认知是否正确,是否存在曲解,还是要有手段来证明的。UML,TDD倒是一个不错验证手段,让我们可以通过“图形演变”和“代码演变”来观察这个棋下的好不好,不好我还可以“悔棋”去修正原始的认知至于lz困惑的“过程”和“对象”,实际区别在于是否存在这个返回“自然”的认知。如果不返回自然,那么所追求的就是算法,而返回自然所最求的是“对象结构”lz可以去google一下:“有道难题 萝卜园问题”,这个在博客园上曾经有过一次大规模的代码大比拼。你可以看到 “过程”和“对象”两种方式的实现,比较一下这两种方式的实现,你就会发现他们有明显的不同,过程的强调的算法效率,而对象的强调是返回自然的认知。
      

  4.   

    实际上有关“对象”这样的问题,非常难以回答这也是这两天,连续都有人发帖问“对象”,却基本没人回答的原因(包括今天又被挖坟挖出来的那个09年的老帖,争论那么激烈却没任何结果)讨论对象,最终会被上升到认知,哲学,思想,方法学-----这类形而上的东西,所以对于新人来说,我的建议是放下这些无关紧要的东西,学自己该学的,做自己该做就是以前侯捷(台 湾 人,写的有《深入浅出MFC》和翻译过其他基本c++领域的重量级书)老师书上的几句话对我帮助很大,我可以转送给你
    1.好读书不求甚解
    2.山高月小、水落石出
    3.勿在浮沙筑高台这几句合起来的意思是:不拘泥,要广泛涉猎!对于不懂的东西,不需要强行弄懂,你不懂是经验或历练问题,一旦经验足够,你就会自然而自然的领悟。当下最重要的事情不是去追浮沙上的高台,而是弄懂你能弄懂的,实践你能实践的
      

  5.   

    呵呵,我想除了sp1234大哥敢批判这样出著作的人,而不被大家批判,在csdn是没有其他的大牛了。。收藏了,这是复习功课资料。
      

  6.   

    恩,的确!老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楼是算法,根据题意直接考虑算法求解而对象解法第一步 并不是考虑如何算,而是考虑构造一个可排序的对象,在认识上我们说我们抽象了一个临时对象,这个对象包含一个本身值的属性,同时包含随机的标签属性。我们按随机标签属性排序即可实现原题的要求,这里就是我们的一个“自然”回归过程,我们不再关心他如何算。我们心里的自然原型是:“我要把一些东西放进一些贴着乱起八遭标签的盒子,然后整理这些盒子让他们看着更顺眼点”
      

  7.   

    当你开发完一个UML建模工具之后,相信你就能理解什么是面向对象了。
    可以仿照Jude开发