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

openkk 12年前
   <p> 英文原文:<a href="/misc/goto?guid=4958343836024720318" rel="bookmark">My brain can’t handle OOP anymore</a></p>    <p> 今天我意识到已经没有什么比面向对象编程更困扰我了。尤其是 Java。人们确实都在用它吗!?</p>    <p> — Swizec (@Swizec) April 29, 2012</p>    <p> 前几个星期我在做一个编译器的作业——语义分析部分要用到面向对象,简直是噩梦。需要用访问者模式去遍历树,并做些奇怪的事情。</p>    <p> 这让我一度想在角落里蜷缩起来,在卧室里边自言自语,边来回摇晃。这让 River Tam 在逃离房间前大喊:“太拥挤了!”</p>    <p> <strong>OOP 像什么</strong></p>    <p style="text-align:center;"><img title="20120612_084443_1.jpg" border="0" alt="20120612_084443_1.jpg" src="https://simg.open-open.com/show/df37f7a1d8265d8c71112fcfd71faf46.jpg" width="300" height="225" /></p>    <p style="text-align:center;">神经病?</p>    <p> 在面向对象编程里,一切都搅在一起。函数和数据绑在一起,所有的一切都相互依赖,当你要调用一个函数时根本就不知道这个函数用来做什么。</p>    <p> 而且这是在假设单个对象是没有什么错误的情况下的。不然谁又知道会发生什么呢?这个世界就要爆炸了!</p>    <p> 面向对象写出来的软件根本没办法理解。我曾经觉得我可以理解,但我写了几个月的面向过程的程序后,我发现我已经没有脑力去理解面向对象的代码了。太乱了。</p>    <p> 当你要使用单态模式时,并且一个对象要使用另外一个对象时。让我给你看个实例:</p>    <div class="cnblogs_code">    <pre> foo: <span style="color:#0000ff;">object</span> {         i: <span style="color:#0000ff;">private</span> integer = <span style="color:#800080;"></span>;         add: function (a:integer) {            i += a;            <span style="color:#0000ff;">return</span> i;         }      }      <span style="color:#008000;">/*</span><span style="color:#008000;"> lots of code happens here, foo has been passed around, things happened </span><span style="color:#008000;">*/</span>   <span style="color:#008000;">/*</span><span style="color:#008000;"> foo is not a singleton though, just used a lot </span><span style="color:#008000;">*/</span>   a:integer = foo.add (<span style="color:#800080;">5</span>);      <span style="color:#008000;">//</span><span style="color:#008000;"> What is the value of a?</span></pre>   </div>    <p> 要回答这个简单的问题需要知道一切:foo 的整个执行历史,整个代码。是你命名的,你必须记住名字。</p>    <p> 噢,我有提到 bar 类吗?它依赖于 foo。哦耶,它们去年因为利益而成为了朋友。相当有趣。尽管 bar 曾经用 baz 骗过 foo(译者注:foo 和 bar 在计算机世界里常被用于例子中的变量名,函数名。)没有人知道 foo 将会如何反击!</p>    <p> <strong>面向过程编程</strong></p>    <p> 在@sbelak 的数次激励下,我在两年前开始学习面向过程编程。</p>    <p> 有人说面向过程可扩展性更高,几乎不需要更多的代价就可以扩展到多处理器上,清晰的代码,可以写出更容易开发、更容易维护、更少 bug 的软件。</p>    <p> 我虽然没有体会到所有的这些好处,但我现在已经可以用一种新的思维来思考我写的代码了,那是一种更容易理解的方法。</p>    <p> 最初写函数式程序时,就像对我进行前脑切除手术一样痛苦,就像用热红的烙铁烧我的脚一般让我挣扎不堪。你确定这里不需要用循环语句?但我需要变量,不是吗?至少要一点可变性吧?真的吗?不需要吗?这就像一种仪式,任何时候你们都可能会跳起来,对我说“给你个惊喜”,然后开始嘲笑我。</p>    <p> 但我坚持下来了。虽然我的代码看上去很可怕,但我爱上了它了。</p>    <p> 函数式代码首先吸引我的地方就是在于写 python 函数时仅需要传递数据。不需要储存中间变量,仅仅传递一个函数的结果给另外一个函数。</p>    <p> 谁又在乎中间的步骤?我关心的仅仅是这一大块代码创建了X,而不是它首先做了Y,然后Z,然后把A和B合并成了X。</p>    <p> 当然,你当然可以定义一个X的函数,将Y,Z,A,B都包含在内,但为什么要创建一个仅仅被调用过一次的函数呢?仅仅像这样</p>    <p> X = A+B(Y(Z))不是更好么?</p>    <p> <strong>数据的瀑布</strong></p>    <p style="text-align:center;"><img title="20120612_084444_2.jpg" border="0" alt="20120612_084444_2.jpg" src="https://simg.open-open.com/show/577985af7a921570a2680d1036402799.jpg" width="500" height="333" /></p>    <p style="text-align:center;">普莱维斯瀑布</p>    <p> 我现在思考代码的方式是就像是数据的瀑布。</p>    <p> 你有了数据,函数链上的函数都是一个暗礁。数据持续的下落,可能改变了某些属性,然后落到了下一个函数上。</p>    <p> 最后你有一个水池了。就在这里你的数据在经历了许多函数后,最后落进了水池。可能它还会下落到下一个函数,或者你在需要的时候可以使用它。</p>    <p> 你可以说这就是面向过程式编程啊。但它也是函数式编程,这就是我如何理解代码的。你的想法可能不同。</p>    <p> 不论你是如何理解你的代码的,不管你在你脑中如何运行代码——但如果你能处理复杂的面向对象,我就要脱帽对你致敬。你是真的比我厉害。</p>    <p> 我想你应该试试“函数式编程”。你会喜欢它的。</p>    <p> 原文:<a href="/misc/goto?guid=4958343836024720318" rel="nofollow" target="_blank">swizec.com</a>  编译:<a href="/misc/goto?guid=4958338613453938753">伯乐</a>在线 — <a href="/misc/goto?guid=4958343838315799840" target="_blank">唐小娟</a></p>