浅释"面向xxoo"

来源:互联网 发布:咕咚刷步数软件 编辑:程序博客网 时间:2024/05/19 02:20

问:JAVA和C有什么区别?
答:JAVA面向对象,C面向过程。
        以上是我很久以前看到的一段对话,当时就觉得有点高深莫测的样子。近日又看到了同样的对话,一时有些不安。于是,就有了这篇小文。先声明本文不是妄论语言长短,只是对“面向xxoo”这种古怪的的说法浅作解释。
        话说自上古洪荒时期盘古抄起家伙劈开那混沌天地以来……很遗憾这与本文无关。
        先扯扯“过程”,这个其实不用解释太多。在我们人类的思想里,干什么事都得通过一个过程。一个过程是几个小过程按序拼凑成的,然后小过程又是小小过程……然后小小过程又是小小小…………(从前有座山……)。计算机也不例外,它解释并按照指令来运作,这里有个过程。程序就是这样,像一系列有序的过程,不管你的程序是用什么语言实现的,也不论你面向哪家闺女,咳~面向对象还是过程~。
        总之,程序设计语言都是用来向计算机表达我们人类的思想的“媒介”。各种奇形怪状的“媒介”会被编译器,或者解释器(JAVA混合两种方式)译成计算机能识别的指令序列。这些人类与计算机沟通的媒介,必然是既要贴合我们人类的表达方式,也要能被计算机所识别。后者是编译器和解释器的事。咱只扯前者,在我们人类的表达方式里很重要的信息载体——对象。
        OK,总算扯到“对象”了。跟“过程”一样,也是我们人类的表达方式。我们平日里听和说的都是“某人某物做某事某某某……”这样的各种对象在一个个的过程里交互着。我表达点具体的:               
        “胡小来开自行车回家。” 对象—胡小来、自行车,过程—开、回家的过程。
        “半路上自行车刹车坏了、踏板折了、轮子掉了。”对象—自行车、刹车阀、踏板、轮子,过程—坏了、折了、掉了的过程。
        “没刹车,胡小来放慢速度开。”对象—胡小来、自行车的刹车阀,过程—减速的过程。
        “没踏板,胡小来滑着走。” 对象—胡小来、自行车踏板,过程—滑的过程。
        “没车轮,胡小来扛着自行车走。”略…………
        “胡小来干脆买了辆新车”
        这便是我们人类的表达方式,各种对象在一个个的过程里交互着。或者说,无所谓什么对象和过程,都只是我们人类的表达方式。……鉴于我也只是个人类,看官请无视我 “无所谓什么对象和过程”这种大逆不道的话吧,毕竟我还得用“它”来表达。
        干扯淡结束,放点代码更有助于意淫~下面用C和JAVA来描述“胡小来开自行车回家”这个场景:
关于对象定义就略了~。

/* C代码*///实例化对象,用struct够拉轰嘛~~struct SHUAIGE *胡小来; //中文名只为方便表述struct BIKE   *bike;胡小来 = malloc(sizeof(SHUAIGE));bike = malloc(sizeof(BIKE));//初始化略……      while( ! BeReachedHome(胡小来) ) //坚定不移地在回家的路上{    if( ! BikeIsBroken( bike ))    {         DriveBike(胡小来, bike); //没坏?OK那就正常开    }    else    {        switch( CheckBike( bike ) ) //检查自行车出现哪些问题        {            case DEFINE_BIKE_BRAKE_BROKEN: //刹车坏了                if( ! RepairBike(胡小来,bike) ) //修不好,限速行驶~                {                    SetBikeSpeed( DEFINE_BIKE_LOW_SPEED );                    SetShuaiGeSpeed(DEFINE_BIKE_LOW_SPEED );                }                break;              case DEFINE_BIKE_FOOTBOARD_RIVED: //踏板折了                if( ! RepairBike(胡小来,bike) ) //修不好,当滑板车滑着走                {                    SkaleBike(胡小来, bike);                }                break;             case DEFINE_BIKE_CARTWHEEL_DROPED: //车轮掉了                if( ! RepairBike(胡小来,bike) ) //修不好,扛着走                {                    WalkWithBike(胡小来, bike);                }                break;                                       default:                printf(“BUG~这TMD破自行车到底坏成什么样了~”);        }    }    BreakBrake(bike.brake); //刹车坏了    RiveFootboard (bike.footboard); //踏板折了    DropCartwheel (bike.cartwheel); //车轮掉了}free(胡小来);free(bike);

/* JAVA代码*/Human 胡小来= new ShuaiGe(“好帅”); //中文名只为方便表述Bike bike =胡小来.buyNewBike(“便宜货”);while( !胡小来.isReachedHome())  //一定要回家~{    try{        胡小来.drive( bike ); //开车,用try catch,对不妙的情况可以挑个方便的地方集中解决        bike.brakeIsBroken(); //刹车坏了        bike.footboardIsRived(); //踏板折了        bike.cartwheelIsDroped(); //车轮掉了    } catch ( BrakeBrokenException e){        if(!胡小来.repair(bike)){            bike.setSpeed( Bike.LOW_SPEED ); //刹车坏了,限速开~            胡小来.setSpeed( Bike.LOW_SPEED );        }    } catch ( FootboardRivedException e){        if(!胡小来.repair(bike)){            胡小来.skale(bike); //踏板坏了,当滑板车开~        }    } catch ( CartwheelDropedException e){        if(!胡小来.repair(bike)){            胡小来.walkWith(bike); //车轮掉了,那就只好扛着走~        }    }}


咱们的两种程序代码其实描述的都是数据(对象)不断变化以实现某功能的过程,只是表达方式不同。
        C说:“在某过程里有一堆数据(对象)进行各种逻辑交互”,你会首先注意这个过程是怎么回事。
        但是JAVA说:“数据(对象)通过某一过程发生改变或与其他产生数据(对象)进行逻辑交互”,你会首先注意这个对象是怎么回事。语言之所以号称“面向对象”,只是它有些更贴合我们人类表达方式的特性,跟语法糖相似。有国外教授反对学校教“对象”语言,认为这让人偏离了真正的“道”。反正横竖都好,就看人怎么用了~
        好的,扯完~。
        区区半吊子,不敢议论长短的。若能减轻初学者的一丝丝疑惑,足矣~