首页 > 技术文章 > 关于面向对象编程和函数式编程的一点新手的思考

distanceblog 2016-01-15 20:39 原文

学过C这样的函数式编程也学过C#,JAVA这样的OPP式语言。这里我只讲一些语言方面的东西不作深入的比如中间语言元数据之类的东西的探讨。

忽略基本数据类型,那么OPP语言到函数式语言依我新手之见有这样一个转换。

以我比较熟悉C和C#为例

比如C#这样一个类

class Test

{

    string str;

    int    num;

public Test()

{

    //init str num

}

public say(string temp)

{

  console.print(str+temp);

}

public static saysth()

{

    console.print("someth");

}

}

转换到C语言就成为这样

typedef struct Test

{

  string str;  //这里忽略语言基本数据类型,C里显然没有string只有char[]

  int      num;

}TEST

再将上类中的非静态方法全部换为静态方法。

C#中对实例化一个类也就变成了如下这样初始化一个结构体。

Test t = new Test()   ->   TEST t=0;  //默认初始化为0

调用静态方法就不用说了。跟C没什么两样。那么在调用非静态方法时也就相当于多传了一个结构体的指针如

t.say("mylove")     ->say("mylove",t);

于是this指针也就有了一个解释。指向初始化的结构体

这样对于类的整体就能作一个比如好的解释

接下来是对继承,重载的解释(多态我感觉应该在放在继承里面一起讲因为没有继承也就不存在多态)

1.方法的继承

    直接调用父类的函数

2.属性的继承

    类似于实现以下结构体

      struct son

        {

          struct parent;

          int      personal;

        }

    当实例化一个类时,首先初始化父类结构体,然后初始化本类的,如果是多重继承则依此类推。

3.多态

    多于多态有一个比较有趣的例子

    A类继承自B类   

    那么   B   temp  =new A();

    调用temp的一个方法。到底是调用A的方法还是B的方法(如果B类里也有一个和A同名的方法且不相同)

    C#,C++和JAVA给出了不同的解释。在JAVA中叫作后绑定在C#或者C++中叫做重写虚方法。结果不相同。C家族中调用父类的方法而JAVA中调用子类方法

    那么反应到函数式编程中,那会是怎样?肯定是线性地址上的两个函数。而具体调用哪个应该由编译器来决定。

4.反射机制(或者在C#中的委托及反射)

    之前我还一直不清楚。后来开始接触到<<windows核心编程>>一书后开朗

    不就是getprocaddress函数吗

    编译器编译原码后为每个函数命名或者编号然后如果是调用本类的方法则是loadlibary(null)如果是别的的JAVA包或者C#的DLL 则传入其他的参数

5.框架

    写代码到现在也接触过一些框架了,鼎鼎大名的.net,做JAVA课大实验的java swing

    具体起来用到现在真的感觉就是封装。隐藏你不需要的。曾经在学一个项目开发时一位帮助我很多  @lwn  

    我曾经在用他们给的框架时一直问,诶这个这个方法怎么实现的,那个方法原理是什么?导致很长时间写不了几句代码

    后来慢慢领悟到OPP的真谛,后来在写JAVA大实验的时候我仿照他们的框架也写了一个自己的,也曾提出做一个tab标签封装的构想(虽然没实现)(也是新手,一些很简单的东西),从外面往里写。我想这是一点心得。

 

函数式编程也有封装,不然在我一开始学汇编的时候我想到要打印一个对话框出来得多麻烦我得一个像素点一个像素点的out到指定寄存器。学这玩意干嘛。

从大到小,都有封装只是封装程序的不同,对于仅仅开发应用程序的程序猿来说,知道怎么用和解决问题比研究内部原理更重要,这里我要吐一下我们的计算机网络考,考的什么玩意,全是理论,犹记得我考CCNA的时候,就感觉到两边的教育差距,他们很重实践,几乎每个小题都会有图有情境。然后面对网络考试题目  现在网络搜索引擎分两大类哪两大类。跟网络几毛钱关系,网络攻击分哪四大类,又有几毛钱关系,如果学到了那个程序上,我不知道这几大类又有什么关系。

好好扯远了,总结一下

     函数式编程更加符合线性的地址空间也就是机器,面向对象更加符合正常人解决问题的思维。毕竟在情人节前夕C把C++的动态给屏蔽了,汇编笑着说

 

      在我眼里,你们都一样

    

    

推荐阅读