基于智能化对象的软件开发的相关思考

最近我在读C#2.0本质论(essential c#2.0 written by Mark Michaelis)一书时,突然对面向对象的编程有些奇怪的想法,   这个想法是我在阅读书中关于面向对象一些成员函数的归类时偶尔想到的。

   我在想,面向对象编程是继面向过程和基于对象编程之后的一种新的编程方法,目的是为了解决由于大规模软件开发所带来的项目管理问题而提出的解决方案,使得软件的开发和管理能更加集成和高效。于是,我想面向对象的编程不仅仅是一种方法,更重要的是一种思想的运用----一种更加抽象和自动化的编程思想!由此我想到了在面向对象编程出现之前,甚至更早的基于机器语言和汇编语言的程序设计阶段,由于没有在编程思想的突破,使得大规模程序开发无法顺利进行,即使后来的面向过程的编程方法出现之后,然后不能适应软件的大规模开发,从而导致了以美国阿波罗登月计划的失败为标志的软件危机。除去软件管理理念的更新不谈,单就编程思想而言,模块化的程序设计是不可能胜任的。后来随着新的软件管理理念的更新和面向对象程序设计思想的引入,软件危机得以缓解,似乎面向对象编程便是一种可以应对任何情况的万能方案。

    先说一下面向对象的优点。除了我们熟知的它自身的特性,即:封装性,多态性(即重载和覆盖)和继承性,这些特性可以为我们的软件开发免去很多的麻烦,但是我认为,它最为根本的思想便是对应软件开发的工程管理理念。通过对象和类机制的支持,面向对象编程通过把一些功能相近的方法和必要的数据进行集成封装,使之成为一个整体,即我们所说的类,这可以很好的跟我们自然社会中的一些自然事物对应的很好,我想这也许是面向对象编程的缘由。对于封装成的这个整体,我们自然可以对其进行再次利用,即重载和继承。因此,在软件开发过程中,除了免去大量不必要的代码的重复编写(可通过重载和继承完成),更重要的是它为我们提供了一个非常好的开发理念:功能的分类管理!当我们需要到某些功能的时候,我们可以调用对象(这里可以理解为一类方法的抽象集合),甚至是更为抽象的类,直接进行处理。为此,我们可以这么理解,面向对象的编程是一种自动化的,当我们构建了必要的功能部件之后,我们就可以通过调用让程序自动完成某些指定的功能。

    由此便令我想到了人类社会的发展和生产工具的关系,在漫长的人类社会中,生产工具可以说是这一发展的标志。先是极为简单的工具,随后是石器和简单的铜铁工具,但这些归根到底都是一些完全没有自动化或自动化性能极差的工具。而蒸汽机的出现标志了具有半自动和自动化性能较好的工具的正式出现,而它的出现使得人类社会以一种飞跃式的发展节奏向前推进。随后的智能工具--电子计算机的出现使得人类从复杂的脑力劳动中迅速解脱,使得我们可以全身心的投入到创新中来,而非简单的对于知识的应用,所以我们当今的社会便以极其快的速度向前发展,而这也恰恰印证了生产工具对于社会发展的重要意义。

   反观软件工程的开发,突然发现如此的相似,在这个过程中程序设计语言和编程思想便是我们的工具,而软件的功能和复杂性以及重用性和可维护性则对应着人类社会发展的状况。然而,根据我的理解,如果机器语言和汇编语言的应用算是简单的编程工具,面向过程的软件开发可称之为半自动化,因为它实现了模块化,那么在软件开发中我们才只是走到了自动化的阶段---面向对象软件开发。

 

    说到自动化,那么我在想,软件开发的智能化在哪里?这便令我想到了面向对象的一些潜在的缺陷。继承的思想可以说是一个很大的进步,但我认为它似乎正像一个瓶颈束缚了我们的思想。因为,我对于继承的理解是一种垂直的,自上而下的线性关系,可以认为是一种纵向的扩展。当我们面对一个项目的时候更多的是考虑这个项目可以细分为几个模块,各模块的关系是怎样的,并继续细化使相应的功能得以实现。那么我们是否可以探讨一下能不能实现程序的横向扩展呢?应该说,面向对象的软件开发更像是建立在没有智能对象之上的且基于物体的自然属性和人为的有目的地使用。比如,汽车这么一个对象,除了自身的体积和大小等外部特征,它还能够被驱动,但是它的驱动毕竟是被动的,如果我们不用钥匙来驱动它,它是不可能走动的。

     那么如果我们把这种思想建立在一些有智能的对象之上呢?比如说,我们命令一个人去完成一项工作,我们很少说具体的每一个细节和步骤应该如何去做,道理很明显,他自己知道如何有步骤的来做,即使是一件他从来没有去做的事情。那么我们可不可以建立一种软件开发的机制或是一种程序设计的思想呢?但是,智能生物的智能的拥有和开发是有前提的,除了自身的自然属性之外,那就是学习。

    所以我想如果我们能提供一种程序开发的机制,能让程序自我学习的话,也许这个问题是有解的。这听起来似乎有些匪夷所思,那么试想如果我们在现在的面向对象程序设计中在每一个对象或类中若封装的不是具体的成员函数,而是一些抽象的类,每一种类中有完成某类活动的大致步骤,当在处理具体问题的时候,这些“类”中的抽象类不只是简单的按照显示的调用完成具体的工作而是由程序自身根据自身的功能特性来自我分析应该如何处理,使之返回更为完备的处理结果似乎应该是可能的。当然这中间的具体的实现机制现在还不能得到支持。举个例子,

     现在我们需要完成对一些字符的搜索,需要编写一个程序,若按照传统的面向对象的程序设计,大致的结构应该是这样的:

        class _main

{

        public static string main(string[] args)

          {

              string t,s;

               class_sort  sort1=new class_sort();

               return sort1.sort(t,s);

           }

}

       class class_sort

{

        //...data        

        string sort(string r,string s)

       {

         //...implement

         return result;

        }

      ...

}

而如果我们使用下面的机制:

   we_donot_know_what_it_is

{

    memory_unit

   {

   //记录程序曾完成的操作及上下文(context)的条件

   }

   template _class_A

  {

    //相应的操作

  }

  template _class_B

  {

   //implement

  }

  ...

}

也许实现的过程和最后的结果会更为理想。

如果我们能实现这样一种语言和编译机制的话,那么最初的疑问或许可以解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值