资讯专栏INFORMATION COLUMN

区分 procedure 和 function:返回值是函数最大的资产

lemanli / 3298人阅读

摘要:在当年流行的学院式语言也是我第一种实际使用的语言中,特意区分了有无返回值的过程有返回值的是函数,无返回值的叫做过程。但是,纯粹的比这样的方法有重大的优势仅仅使用参数表和返回值和外界沟通的函数是最独立复用性最高的函数。

在阅读一些 Java 代码中,发现有无数方法的返回值类型是 void:没有返回值。

在当年流行的学院式语言 Pascal (也是我第一种实际使用的语言)中,特意区分了有无返回值的过程:有返回值的是 function (函数),无返回值的叫做 procedure (过程)。对于过程式的语言,procedure 意味着必须通过某种全局变量或者直接的 IO 过程来实现它的目标,当然是邪恶的了。这也是区别这两种语义的设计原因。对于 Pascal 程序员,尽量提高 function 的比例、降低 procedure 的数量,是一个设计的目标。

可是到了 OO 时代,大量使用的成员变量让程序员们有了某种幻觉:既然可以通过成员变量来和外界沟通,对象的方法就可以光明正大地使用 void 返回值,使用 procedure 了。但是,纯粹的 function 比这样的方法有重大的优势:

仅仅使用参数表和返回值和外界沟通的函数是最独立、复用性最高的函数。它对环境无要求,非常容易查错。

它没有多线程同步的问题:由于没有共享的数据,所有内部变量都不需要通过锁定等复杂机制来保护。

因此,即使使用 Java 这样的 OO 语言,尽量提高 function 的数量,让程序中大多数代码都是 function 的一部分仍然是非常值得提倡的美德。

public class Greeter {
  private String sentence;
  public void hello(String name) {
    sentence = "Hello, " + name;
  }
  public void greeting(String name) {
    hello(name);
    System.out.println(sentence);
  }
  public void sendGreeting() {
    MailSystem.sendMessage(sentence);
  }
}

简单得过分的一个 Hello, world 例子,但里面的 hello 方法仍然变得依赖具体的成员变量。如果改成这样:

public class Greeter {
  public String hello(String name) {
    return "Hello, " + name;
  }
  public void greeting(String name) {
    sentence = hello(name);
    System.out.println(sentence);
  }
  public void sendGreeting() {
    MailSystem.sendMessage(sentence);
  }
}

这个 hello 方法就可以随意复制到其他地方去了。当然,你可能注意到现在这个方法可以标识为静态,你甚至不需要一个对象实例就可以使用它。

  public static String hello(String name)

现在开始就请欣赏你代码中增多的 static function,将 void 返回值的 procedure 视作代码中应尽力避免的坏味道吧!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64097.html

相关文章

  • PHP面试:尽可能多说出你知道排序算法

    摘要:良好的排序算法具有进行最少的比较和交换的特征。冒泡排序是一个基于比较的排序算法,被认为是效率最低的排序算法之一。现在让我们使用实现冒泡排序算法。插入排序到目前为止,我们已经看到了两种基于比较的排序算法。 预警 本文适合对于排序算法不太了解的新手同学观看,大佬直接忽略即可。因为考虑到连贯性,所以篇幅较长。老铁们看完需要大概一个小时,但是从入门到完全理解可能需要10个小时(哈哈哈,以我自己...

    objc94 评论0 收藏0
  • 学习promise编写使用

    摘要:实现是中的一种异步编程实现方式,中异步编程主要是指浏览器事件处理,等,通过传入回调函数来实现控制反转。对象符合编程规范,目的是为异步编程提供统一接口,它最大的优点就是避免了回调金字塔。 promise实现 Promise是Javascript中的一种异步编程实现方式,js中异步编程主要是指浏览器DOM事件处理,setTimeout/setInterval,ajax等,通过传入回调函数来...

    aaron 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<