我之面向对象观

今天看码农周刊里有一篇文章介绍Borg,是关于大型企业资源管理的,里面提供了百度Matrix系统的InfoQ的视频链接。里面是百度Matrix团队的负责人做介绍,讲的是如何通过Matrix这个集群资源调度系统来管理几十万台服务器。当然了,大公司对服务器资源的利用率、错误的处理率、自动解决问题的要求确实很高,毕竟机子很多,从量上就有这个必要。看了这个,也让我拓宽了自己的视界。闲话少说,说一下个人的对于语言的面向对象观。

教科书书上通常都会提到面向对象的四大特性,多态性、封装性、继承性、抽象性。而我们开发中用得比较多的是多态性,解耦、组合。我们也知道,最开始的c是面向过程的。我相信很多人哪怕是会用C#、Java这种高级语言,他们写代码都还是面向过程的。所以面向过程是很好理解的,而且它是解决问题的一种方式,和面向对象相比,是没有孰优孰劣之分的。哪怕后来的软件开发提出了很多概念,比如面向方面、面向接口等,它们都有自己存在的理由。

正如当下机器学习比较热门,在那个曾经满天下都是c的年代,c++也很热门。计算机的不断发展,总会有新的问题出现,需要我们解决。c最开始是拿来写unix操作系统的,后来操作系统都差不多定型了,有了POSIX概念。人们在现实中尝试处理比如文档的编排工作,微软的word就是那个时候出现。人们尝试将软件伸向它所能解决的方方面面,各种实际的具体行业软件。在这些软件的开发中,发现面向过程开发起来太不方便了,于是c语言的发明者,也是c++的发明者,搞出了c++。我相信他必定是个哲学家,理解用计算机语言来为现实的问题对象建模(这里的对象非软件中的对象,可以通俗的理解为业务、东西)。后来vb这玩意儿也蹦出来了,尼玛,开发图形界面真是容易,面向对象真是太easy了。总之,这是对于软件开发的一场革命。而当下,很多行业软件都有成熟的解决方案。同时,一些新的问题油然而生,人工智能、数据挖掘。社会总是进步的,当技术提升到了一个层次,它所能解决的问题的难度也就跟着提升,这个进步是无穷止境的

面向对象抽象了自然界万事万物的个体特性,使之在软件开发中跃然于纸上,提升了开发的效率,问题理解起来也容易。我觉得这合乎人的思维常识,学起来也容易。c++是静态语言,意思是说,某个类在运行时生成的对象,它的行为已经确定了,哪怕它活得再久,都不会有所改变。那么动态语言呢,对象在存活以后是可以增加或者删除自己的行为、属性,比如js.那么为何会出现动态和静态之分呢?很多人会很顺溜的使用这两种语言,但是未必会对它的出现有所思考。比方一个婴儿,最开始的时候他能有什么行为,什么属性呢?比如吃奶、撒尿,有体温、有触觉。那么这个婴儿他长大以后呢,他还找他妈妈吃奶么?正常人而言,他不会了,他会吃饭了。他的行为已经改变了,这个用静态语言是不能描述清楚的。所以我觉得动态语言的出现,是为了反映世界万物的变化性。这个世界所不能停止的就是变化

那么静态语言的用武之地呢?我认为是很瞬时的事物,比如网站的订单,在某一刻产生,它的相关信息就确定了,在后期不会出现很多变化。静态语言擅长的是业务对象在后期不会出现大的变化的情况,这种在现实中很多。但是,业务对象在后期变化的更多。简而言之,用静态语言开发自然而然会提升复杂性。因为变化是必然的,需求不是确定的,那么你定义的对象在后期的行为属性的改变提升了其复杂性。复杂性只是变化的另一种表达。规避复杂性的一个措施就是解耦,注重代码的维护性、伸缩性、复用性。设计模式就是解耦的一种手段,而模式就是用的多、总结下来的比较通用的手段。同时,静态语言的简单明了性,使得多个开发人员同时开发,理解业务、理解工作提供了便利性,但是代价就是其隐藏的复杂性。各种开发手段都意图分摊开发的复杂性,比如TDD.基于测试,但是开发人员也花了时间来写测试,测试也有其复杂性。软件开发的复杂性在需求已有的情况下是恒定的,后期添加需求是不断的提升复杂性。所以不同的开发方式不过是分摊复杂性,减少因复杂性而带来的不必要的时间和精力的浪费。一个对象,当它代表一种事物,比如一个人,人是很复杂的,方方面面的,你很难用一个类来刻画她,很难描述清楚。似乎我说的这些,都在为动态语言献花,都在说静态语言是蹩脚而有失自然的。

那么动态语言呢,若是没有良好的定义,良好的规约,那么开发人员可以在任意的地方,为其动态的添加行为属性,那么维护不啻于一场灾难。曾经看过阮一峰的介绍Lisp的文章,说全世界会Lisp的不多,可能这门语言太学术、太有内涵了,尽管其开发效率高,有很多有意思的特性,学起来依然不容易,这门语言是何方神圣我也不了解。动态语言通常来说,开发的过程中,也会学习静态语言的特点,最开始就定义好行为属性,后期的改动也会考虑一些可维护性的举措。腾讯的soso地图js api我接触过,就是这种设计,有命名空间层级的概念,对象中也有相互组合的行为。动态语言无疑是优秀的,静态语言也有它的美好之处。

说到这里,有没有一种好的语言能够降低当下语言的复杂性,能尽可能真实的表示世间的万事万物呢。至少目前我了解的是没有,请恕我孤陋寡闻。语言在目前来说是死的,如果把它弄成活的,那应该是软件开发的第三次革命(第一次、第二次是面向过程和面向对象的出现)。怎么说呢?我认为是以动态语言为主体,加入自描述信息(稍后我会给出我的概念),对象在行为和属性的动态改变的时候,能有意识的认可或者阻止这个改变。自描述信息,可以理解为一个对象对于自身的自我认识,它知道自己能做什么,它知道自己不能做什么,它知道自己有哪些行为特征,它依赖于知识库(这个知识库所有对象共享),与其他的对象能够彼此通信、协作。好吧,这是一种有生命的语言,而我的描述也不尽全面。可以这么说,这种语言依赖于庞大的知识库,依据自描述信息来创建,从知识库中拿到自己需要的信息。这种语言的实现让我想到了搜索引擎,从知识库中拿自己的信息不就是检索么。而语言行为特征的判断让我想到了机器学习,前面说了,语言有能力认可或者阻止自身行为属性的改变。

看书、看博客决不能盲从,要结合自己的亲身体会来思考。“择其善者而从之,其不善者而改之”!这里,我写下了自己的思考,绝不是从别人的书上照抄过来,我也相信这些认识在以后会改变。最后,我认识到,我的这些想法在那些搞机器人的眼里只是起步,他们的研究早就跨过了我这个认识。那么,如果有这样一种活的语言,开发机器人,让机器人具备灵魂,也是迟早的事了。So,Keep Stupid!

时间: 2024-10-27 06:51:24

我之面向对象观的相关文章

《Java 从入门到精通(第二版)》 观书有感

笔者今天认真试读了下此书,首先,按照笔者看书的习惯来说,喜欢先看看前面的部分.作者在前言里放了张学习java的路线图,是一个比较标准的学习流程.可是为什么在编程进阶那里放了个设计模式,然后下次才是抽象类与接口,包及访问权限(这名字和java编程思想好熟悉啊),个人认为,设计模式不应该放上来的,可能作者这里的设计模式有其它的含义吧.         全书文字和图像布局都比较合理,看着也挺舒服的.并且发现书还不是一个人写的,不由好几个不同的人共同撰写的.接下来就是目录了,从目录的结构来看,知识点很全

结构化方法与面向对象方法的比较

结构化方法与面向对象方法的比较 引言 结构化方法(SD方法)是一种传统的软件开发方法,它是由结构化分析.结构化设计和结构化程序设计三部分有机组合而成的.它的基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内. 面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在"对象"

PHP面向对象(一)

一.类和对象 1.什么是类:类(class)是对一类事物的描述,是抽象.概念上的定义.是具有某些相同属性和功能行为的一些对象集合. 在面向对象的编程中,类是应该有一个类名并包括属性书名和功能说明两个主要部分. 2.对象是系统中用来描述客户观事物的一个实体/实例. 3.类的实例化结果就是对象,而对一类对象的抽象就是类.类描述了一组有相同特性(属性)和相同行为(方法)的对象. 二.类的声明和对象的创建 1.类的声明 //声明类 class 类名{ //code (属性.方法)... } 规范:类名首

生活中的OO智慧——大话面向对象五大原则

世间万物,以俗眼观纷纷各异,以道眼观种种是常.面向对象思想不仅是编程的智慧,同样也是人生的智慧.通过生活去领悟面向对象的智慧,以面向对象的智慧来指导生活. (部分图片取自How I explained OOD to my wife) 一·单一职责原则(Single-Responsibility Principle) 定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中. 宿舍里并不能好好学习,自习还是得去图书馆.这是一条颠扑不破的真理!被无数学子千百次的实践所证明!我就想不通了,

《面向对象葵花宝典》阅读笔记

满满的干货!推荐大家购买的一本书,里面很多的内容,都是我编程过程经历过的困惑(相信大家都会遇到),如果早点看到这本书,相信当时我也不会困惑那么久了~所以记录总结一下. PS.欲看此书,不必自宫…… 面向对象理论面向过程与面向对象为什么要面向对象类对象接口抽象类抽象封装继承多态需求模型需求分析518方法,我要发~用例方法要画UML图吗?功能提取领域模型设计模型类模型动态模型实现模型设计原则内聚耦合高内聚低耦合设计模式面向对象架构设计业务架构领域架构软件建构面向对象架构设计技巧原则拆与合 面向对象理

【Python3之面向对象进阶】

一.isinstance和issubclass 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj=Foo() print(isinstance(obj, Foo)) 输出 True 2.issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass print(issubclass(Bar, Fo

UML(一)——面向对象方法与软件过程模型

1.软件的实质:程序+数据+文档. 2.软件工程的三维空间观:过程+方法+工具. 3.面向对象方法之于软件工程的意义: 从软件工程三维空间观看面向对象方法: 属于软件工程空间的方法维 不是方法维的唯一 4.面向对象方法与软件过程模型 1)基本模型 线性顺序模型:瀑布模型 迭代模型:原型法模型 基于构件的开发模型 2)迭代模型 3)其他 5.瀑布模型 缺点 实际的项目很少按照该模型给出的 流程进行.虽然线性容许迭代,但是这种迭代是间接的,且极容易导致混乱. 客户常常很难清楚地给出所有需求,但该模型

Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)

一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass print(issubcla

由几道JS笔试题引发的知识点探究十五——JS面向对象编程

JS初学者大都没有认识到其强大的面向对象编程的特性,只是把JS当作一门简单实用的脚本语言来用.也正因如此,JS程序员往往处于程序员鄙视链的最低端,很多人觉得JS是HTML一类的语言,甚至连语言都称不上.事实完全不是如此,你若也有这种想法,说明你对JS的认识太浅薄了.要想正真迈入JS的大门,你必须深入了解JS面向对象编程的特性.下面就让我为大家一一道来. 一.创建对象 既然是面向对象,那肯定先得有对象吧,要有对象,肯定得知道对象是什么吧,那JS中的对象是什么呢?在C++里我们知道,对象就是类或结构