自从入坑以来,七七八八的也用过了不少编程语言了。
一直都是处于学语法,写代码的程度。从来没有认真想过编程语言是什么。
也许是老了,有时候也不会闷头往前冲,而是停下来,静静的想一下,自己在写什么,为什么会这么写。
程序这种东西,最终的目的是让cpu来处理数据,只是因为过程太过复杂,慢慢的演变出来很多种语言。
[处理数据],很简单的一句话,那么就包括了[数据]和[处理]两个概念。复杂的程序,自然也会包括复杂的数据,也包括复杂的处理。
那么我们要做的就是合理的去归类数据,合理的安排处理的逻辑,这里的处理在程序上就是表现为方法。
一个语言要解决的问题,就是数据如何传递,另外一个是方法如何串联。
最早接触的是c和pascal这样的语言,这类语言比较初级,数据和方法比较零碎,完全由程序员自己去归类这些东西。
这时候,如果摆放不合理,就会发生方法依赖错综复杂,数据传递极其繁琐的情况。
后来开始接触面向对象语言,类似于java一类。
一个类就是数据和方法的组合。从某种程度上,帮助程序员进行了归类。
但是在实际使用中你会发现,大多数情况,一个类要么就是一个数据的组合,要么就是方法的组合,反而数据和方法同时出现的情况比较少。
用java开发web应用的情况非常多见,看看form,dto,entity等类型的类,基本就是pojo实际上是不带有任何处理方法的,而controller或action,
service,logic,dao等,又都是方法簇,并没有任何的数据,那么数据的传递却是通过方法参数以及返回值来实现。
这哪里体现了面向对象的优越性了?
当然,之所以这么做,也可能是妥协的结果,因为这样的设计比较好测试。
另外还有一些其它语言比如golang,暂且不去讨论它是不是属于面向对象语言,那么从数据和方法的安排上来看,数据用struct来描述,
方法当然可以独立存在,也可以作为类方法赋给struct,那么在实际应用中,会发现,很多struct是空的,它的目的只有一个,就是归类许多个类方法形成一个方法簇,
这样的实现给上面java web开发中的contoller的应用没有任何区别。
既然上面看起来并不是特别的完美,那么函数式编程呢?函数式编程同样数据是数据,但是方法调用的话,却是通过传递方法变量的方式,把方法调用串联起来。
这样的组合方式跟以前面向过程编程中的函数调用有啥不同呢?一个就是同类方法组合的重用,类似于面向对象编程中泛型的使用,另外一个就是柯里化。
其实挺讨厌柯里化的,因为使用了柯里化,也就意味着时刻注意context chain,如果搞不清楚这个的话,你就会迷失在调用深渊里,比起面向过程的编程方法难理解多了。
可见编程语言里没有银弹这不是说着玩的。
以上是这些年来的编程感受,语言匮乏,不一定能反映出内心的想法,同时描述也不甚准确,希望不会误导别人。