Scratch3.0中全局函数的意义


#1

Scratch3.0中的全局函数的功能需求如下描述:

Scratch3.0中,当前自制积木只能够应用在创建该积木的角色当中,我们希望创建一个函数,能够应用在每一个角色当中,当然,对于原有的参数功能,务必保留。

Scratch3.0自身是没有全局函数的功能,当我把这个问题跟 @Alan_Russell 分享的时候,他如下回复:

Scratch的设计理念来自于Smalltalk概念。Scratch中的角色对应于是面向对象编程中的类(class),而角色的积木(舞台区域中)是对应于的类的方法。类自身的方法,不应该给其他类使用的,这个是Scratch很隐晦的设计,而也正是最大的败笔所在。Scratch让用户认为积木是可以挪动的,可是自定义类积木是无法公用的。

比如(如下图所示)在小猫角色里面定义了《向右移动》的函数,作用是向右移动10步,然后在Abby角色里面直接引用这个函数的话,是不能让Abby也向右移动10步。

总而言之,自定义积木积木的挪动和公用是彼此之间对立的存在。这个至关重要,围绕着这点我会写一篇文章,这样的设计极其容易让用户弄混淆。

对这些看法,我给他回复了如下内容:

全局函数的需求,是从一线教育工作者那边过来,当用户所作的案例包含较多角色,而且,这些角色都有大同小异的方法时,为每一个角色自定义类似的方法的过程,在创作当中让用户感到枯燥而且抓狂的一件事。

之后他就做了如下回复:

关于这一点的话, Scratch从Smalltalk继承过来的思考可能是非常深入的,全局函数是一种非常糟糕的做法,它确实提高了便利性,但是我认为它是没有教育意义的。但是这件事确实值得讨论,因为它触及到很根本的一个问题,什么是有教育性的?就是今天的很多编程语言是没有教育性的,这个话题比较尖锐,但是我想说的是Scratch从Smalltalk得到了一种更好的东西,利用消息

全局函数这个概念在各个语言中都在被抛弃(除了C语言),在 javascript 中,现在几乎已经丢掉它了,在python之后,你也不可能有所谓的全局函数,你只能用模块内的函数。全局函数这个概念,使用的话,我觉得是应该谨慎一些。就是在产品上,它很容易被人想着他最简单的方式,但这种方式,才应该是比较不好的方式。

这个话题确实触及到了这种创作工具,最基础的东西,就是你的教育目标和便利性之间怎么样做取舍;或者说为了达到你的教育目标,也不牺牲便利性,那教育上应该做什么工作。

跟他讨论完之后,我做了点总结,主流语言是通过类继承的方式,把全局函数的功能取而代之的。可我和他都相信在便利性和一致性之间会有一个平衡点,剩下的就是怎么去找而已。


#2

此前与 @yazguqi 在微信里沟通这个问题,我用的是语音,所以陈述偏口语。

我把我的观点做了梳理,方便阅读:

  1. Scratch的第一个版本,采用Smalltalk的方言squeak设计,Scratch中的大量理念来自Smalltalk社区。
    1.1 scratch的精灵(sprite)在概念上接近smalltalk的实例(instance)。
    1.2 Target(需要阅读scratch源码)在概念上接近Class.
    1.3 sprite创建的的时候,带有很多默认的功能积木。该行为和Etoys创建精灵一致。积木的本质是类方法。
  2. 从1.3可以看出自制积木是创建实例方法,在动态语言里,很容易实现这点,比如在Python中,实例方法在一个字典里,动态添加即可,在实现上js略有不同,但不必在乎这些实现细节。
  3. 由2可知,Scratch中定义的方法是不能跨精灵使用的。但在UI上,用户却可以把调用自制积木的积木,拖到其他精灵里,点击之后却无效,非常令人困惑。就这点而言,我认为这是个糟糕的设计。
  4. 当然,在技术上,我们可以hack scratch(blockly)来实现所谓的全局方法。 但这与Scratch 的设计思路是不一致的,设计编程工具的时候,不一致性是非常危险的。它既让用户困惑,又可能带来潜在的bug(不可组合性)(scratch自制积木带来的这个不一致性便是一个例子)
  5. 对此,我的建议是放弃全局函数的想法,接受Scratch的编程风格(事件驱动),采用广播来替代跨对象的函数调用,这种风格使用Smalltalk的设计理念来表达是 :

万物皆消息,对象仅通过消息沟通

具体怎么做 可以参考我此前的演讲稿 ,整个演讲稿里的对象通信就是用 广播来做的

https://blog.just4fun.site/Turn-the-world-into-your-playground.html


#3

在Smalltalk中 消息可以传参,甚至允许将对象作为参数,但在Scratch中,消息只能是字符串。所以在Scratch中,会感觉广播不如自制积木好用。

这不是消息机制本身的表现力的问题,而是Scratch在易用性和灵活性直接做了取舍。