我的大脑不能再处理面向对象编程了

今天我意识到已经没有什么比面向对象编程更困扰我了。尤其是 Java。人们确实都在用它吗!? — Swizec April 29, 2012

前几个星期我在做一个编译器的作业——语义分析部分要用到面向对象编程,简直是噩梦。需要用访问者模式( visitor pattern)去遍历树,并做些奇怪的事情。

这让我一度想在角落里蜷缩起来,在卧室里边自言自语,边来回摇晃。这让River Tam在逃离房间前大喊:“太拥挤了!”

 

OOP像什么

神经病?

神经病?

在面向对象编程里,一切都搅在一起。函数和数据绑在一起,所有的一切都相互依赖,当你要调用一个函数( function)时根本就不知道这个函数用来做什么。

而且这是在假设对象单子(monad)是没有什么副作用(side-effect)的情况下的。不然谁又知道会发生什么呢?这个世界就要爆炸了!

面向对象写出来的软件根本没办法理解。我曾经觉得我可以理解,但我写了几个月的面向过程的程序后,我发现我已经没有脑力去理解面向对象的代码了。太乱了。

当你要使用单态模式时,并且一个对象要使用另外一个对象时。让我给你看个实例:

要回答这个简单的问题需要知道一切:foo的整个执行历史,整个代码。是你命名的,你必须记住名字。

噢,我有提到bar类吗?它依赖于foo。哦耶,它们去年因为利益而成为了朋友。相当有趣。尽管bar曾经用baz骗过foo(译者注:foo和bar在计算机世界里常被用于例子中的变量名,函数名。)没有人知道foo将会如何反击!

 

函数式编程

fp, by okeef creations

fp, by okeef creations

在@sbelak 的数次激励下,我在两年前开始学习函数式编程(functional programming)。

有人说面向过程可扩展性更高,几乎不需要更多的代价就可以扩展到多处理器上,清晰的代码,可以写出更容易开发、更容易维护、更少bug的软件。

我虽然没有体会到所有的这些好处,但我现在已经可以用一种新的思维来思考我写的代码了,那是一种更容易理解的方法。

最初写函数式程序时,就像对我进行前脑切除手术一样痛苦,就像用热红的烙铁烧我的脚一般让我挣扎不堪。你确定这里不需要用循环语句?但我需要变量,不是吗?至少要一点可变性吧?真的吗?不需要吗?这就像一种仪式,任何时候你们都可能会跳起来,对我说“给你个惊喜”,然后开始嘲笑我。

但我坚持下来了。虽然我的代码看上去很可怕,但我爱上了它了。

函数式代码首先吸引我的地方就是在于写python函数时仅需要传递数据。不需要储存中间变量,仅仅传递一个函数的结果给另外一个函数。

谁又在乎中间的步骤?我关心的仅仅是这一大块代码创建了X,而不是它首先做了Y,然后Z,然后把A和B合并成了X。

当然,你当然可以定义一个X的函数,将Y,Z,A,B都包含在内,但为什么要创建一个仅仅被调用过一次的函数呢?仅仅像这样

X = A+B(Y(Z))不是更好么?

 

数据的瀑布

普莱维斯瀑布

普莱维斯瀑布

我现在思考代码的方式是就像是数据的瀑布。

你有了数据,函数链上的函数都是一个暗礁。数据持续的下落,可能改变了某些属性,然后落到了下一个函数上。

最后你有一个水池了。就在这里你的数据在经历了许多函数后,最后落进了水池。可能它还会下落到下一个函数,或者你在需要的时候可以使用它。

你可以说这就是过程化编程(procedural programming),但我不喜欢副作用(side-effect)和指令代码等。虽然它仍是函数式编程,但这就是我如何理解代码的。你的想法可能不同。

不论你是如何理解你的代码的,不管你在你脑中如何运行代码——但如果你能处理面向对象编程的复杂度,我就要脱帽对你致敬。你是真的比我厉害。

我想你应该试试“函数式编程”。你会喜欢它的。

1 收藏 7 评论

关于作者:唐小娟

唐小娟:热爱互联网的程煦媛 个人主页 · 我的文章 · 12

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 恩,很久不用面向对象思想编程了。基本就是面向过程,函数式编程。突然又要用到面向对象时,我困惑了。举例,如果你要给一个对象设n个属性值,按照规范是不是要调用n个set方法?在函数式编程中,会有这样的必要性么?

    于是觉得 函数式和面向对象以及函数式和面向过程都是你中有我,我中有你的关系,在不同的环境中,应该选择更合适的方式,并不是,一个系统前中后全用同一种方式编程,而即便在前端,也要分层,考虑最优的编程方式。

  • 我个人观点:面向对象号称以适合人的大脑来思考软件,而面向函数或面向过程,则是让人的大脑以CPU方式去思考。该文作者的脑袋已经不是正常人脑袋,而是被改造成机器算法脑袋了。

    http://www.jdon.com/43996

  • michael   2012/06/14

    我最开始学习编程的时候使用的是“函数式编程”,当我接触到“面向对象编程”时我就知道,我再也不能进行“函数式编程”了。

  • 译文质量不过关,硬伤一堆:

    第二节标题Functional programming居然给翻译成“面向过程编程”,而后面又把procedual programing翻译成“面向过程编程”(这是个常见的不恰当的错译,“面向”在这里是子虚乌有),又混用“函数式”……无语。

    原文And that’s assuming there are no side-effects outside the object monad. Otherwise, who knows, the world might explode!错译成“而且这是在假设单个对象是没有什么错误的情况下的。不然谁又知道会发生什么呢?这个世界就要爆炸了!”显然译者不理解什么叫side-effects(副作用),也不知道monad(单子)。不了解后者说明欠缺函数式编程范型的理解,而不了解前者(居然能当成“错误”)说明连起码的指令式语言常识都不过关:C、C++、Java中,side effect都是解释程序执行的基本概念之一。

    原文You might say this is really procedural programming, but I don’t like side-effects, imperative bits of code and so on. It’s still functional programming, but this is how my brain understands code. Your mileage might vary.偷工减料成“你可以说这就是面向过程式编程啊。但它也是函数式编程,这就是我如何理解代码的。”关键词side-effects和imperative(指令式)都给扔了,云里雾里。

    这样的文章拿出来忽悠围观群众作甚?!

跳到底部
返回顶部