是否可以在Smalltalk中声明temp vars的可选项?

时间:2015-07-02 17:30:18

标签: smalltalk

编写使用临时代码的Smalltalk代码时,您可以编写如下内容:

SequenceableCollection>>#swap: index1 with: index2
    | temp |
    temp := self at: index1.
    self at: index1 put: (self at: index2).
    self at: index2 put: temp.

我发现宣布临时的语法有点老式和繁琐。实际上,您通常会停止在您的域中思考并专注于计算机的地方之一(您编写了方法,您已准备好接受代码,但必须"清理"您的临时区域)。这令人分心。

也许临时声明对性能很有用?甚至声明性 - 无论如何通过IDE调整改进了语法高亮,但我认为| temp |可以而且应该是可选的。编译器具有所有需要的信息,或者如果用户没有提供临时声明(假设临时生活在更近的环境中),则可以做出所需的假设。

实施这种改变会有什么问题?

3 个答案:

答案 0 :(得分:2)

这是一种与方言相关的功能。在某些方言中,如果您没有声明临时值,浏览器将在保存方法时为您执行此操作。我个人认为这种行为比每次使用未知标识符时浏览器警告你的行为更方便,因为正如你所说,这可能会分散注意力。通过将临时工具的定义推迟到保存方法的时候,您不必将思路从域中“转移”;浏览器将完成详细信息。不“手动”宣布临时性的另一个好处是你的方法最终不会宣告未使用的临时值。

答案 1 :(得分:2)

  

是否可以将temp vars的声明作为可选项   SMALLTALK?

当然 - 编译器仍然知道哪些变量是在编译时,即保存方法时。

  

实施这种改变会有什么问题?

主要问题是语法突出显示并不涵盖事情可能会得到的所有情况......含糊不清:

  • 当其他人查看熟悉Smalltalk而不是您当前语法高亮设置的代码时会发生什么?请记住,您应该始终为未来的读者编写代码,而不仅仅是为自己编写代码。
  • 如果您在IDE外部查看代码,会发生什么情况,例如:当你在Seaside开发并直接通过浏览器修改代码(仍然存在于IDE中)?
  • 从IDE中取出代码时会发生什么,例如
    • 在这里回答一个问题,
    • 为您的博文,
    • 在给同事的电子邮件中
    • 导出到不同的Smalltalk?
  • 使用"未声明的临时变量"后会发生什么?在方法中,您将实例变量添加到具有同名的类中?编译器是否必须遍历该类及其子类中的所有方法并询问您的意思? (相反,当您删除正在使用的实例变量时会发生什么?)

TL; DR:找到一些东西"老式的","繁琐的",或者#34;突兀的" (尽管我可能同意你的观点)特朗普清晰度和消歧。

可以说,不得不申报临时地区。另外,我不认为快速清理"在你接受之前你的方法是一件坏事。

答案 2 :(得分:0)

没有技术问题 - 从技术上来说改变编译器是微不足道的。

但正如其他人已经指出的那样,这将是一个维护和调试的噩梦:如果稍后在外部范围中添加同名变量(并且可能是继承层次结构中的instvar方式)会发生什么?另外,如果你只是打字错误,而临时不是你的意图,但你真的想访问一些现有的变量呢?

编程了很长时间(以及使用自动变量定义的语言),我不希望这样。对于小的10行程脚本来说可能没问题,但对于必须长时间维护的大型程序却不行。正如伯特指出的那样,工作区通常会为你做这件事,这很好,但不适用于生产代码的方法。

我记得一个关于一个崩溃的fortran程序的老故事,因为程序员写道" do10i = 10.20"而不是" do10i = 10,20"得到了一个名为" do10i"的新变量。分配给10.20而不是do-loop。他会被警告,如果他必须先声明变量(承认:Fortran是一种丑陋的语言,但我得到了我的观点,我猜)。