APL可读性

时间:2012-10-16 07:38:42

标签: readability maintainability apl

我必须在APL中编码。由于代码将被维护很长一段时间,我想知道是否有一些论文/书籍包含启发式/提示/样本,以帮助设计清晰可读的APL程序。

与其他编程语言编码不同。例如,制作一个功能。 Small无济于事:这样的函数可以包含一行代码,这是完全不可理解的。

3 个答案:

答案 0 :(得分:9)

首先,欢迎来到APL的精彩世界。

编写可读和可维护的APL代码与编写任何语言的可读和可维护代码没有多大区别。编写干净代码的任何好书都适用于APL,与其他任何语言一样,甚至更多。我推荐Robert C. Martin的Clean Code

考虑本书中的指南,函数中的所有代码都应处于相同的抽象级别。这适用于APL 100次。例如,如果你有一个名为DoThisBigTask的函数,它应该只有很少的APL原始符号,当然也没有长复杂的单行。它应该是对其他低级函数的一系列调用。如果这些更高级别的功能都具有良好的名称和明确定义,那么一般的漂移应该由不熟悉APL的人轻松确定。最低级别的函数将只是原语,并且对于非APLer将是不可理解的。根据他们的写作方式,他们甚至可能最初看起来不可思议的经验丰富的APLer。但是,如果维护程序员无法理解原始编码技术,这些低级函数应该很短,没有副作用,并且可以很容易地重写而不是修改。

通常,保持您的功能简短,命名良好,定义明确,并且重点突出。并保持代码行更短。拥有定义明确且记录良好的函数比编写良好的文档代码行更为重要。

答案 1 :(得分:2)

由于您要求提供书籍和其他参考资料,我建议:

  • 深度的APL2 由Norman D. Thomson和Raymond P. Polivka撰写。我和Ray Polivka合作多年,他是我最好的APL老师之一 我们都知道。
  • 经典 A。 P. L。:交互式方法 by Leonard Gilman和Allen J. Rose对核心语言很有帮助,但是 相当过时,并没有太多与之相关的内容 可读性。
  • 詹姆斯·A·布朗和桑德拉·帕金的
  • APL 2概览在某些方面是吉尔曼和罗斯的更新。它涵盖了嵌套操作和APL的其他更新,但没有太多专门针对可读性。不过,如果你按照这里的例子,你将编写可读代码。
  • STSC和Jerry R. Turner的
  • APL很容易是一个专门针对APL * Plus系列的介绍。同样,在可读性方面并没有太多具体,但模型通常是设计良好的可读代码。
  • 掌握Dyalog APL:Dardog APL的完整介绍如果你是专门从事Dyalog APL的工作,那么Bernard Legrand非常好,如果你在其他版本中工作,那就不行了APL * Plus(来自APL2000)

我认为APL作为“只写语言”的声誉被夸大了。人们确实需要习惯用于表示它们的基元和符号。但是,人们需要习惯许多其他语言环境中的语法和各种库函数。我已经看到C,C ++和Java中的复杂代码与任何APL一样难以理解。当然,它不是好的C,C ++或Java,即使它很聪明。

一些建议:

  • 写'one-liners'是一种测试一个人掌握语言的方法, 但非常生产代码的不良做法。
  • 注释使算法,特别是使用的数据结构清晰。与任何代码一样,注释应该添加一些内容 不能从代码本身轻松读取,或引起注意 复杂或模糊的代码。
  • 如果可能,请避免使用晦涩的代码,因此无需解释。通常是可能的。
  • 使每个功能只做一个作业,界面清晰。 在大多数情况下避免使用全局变量,并记录所需的任何变量。
  • 记录任何功能的界面,目的和效果 最佳。如果可能的话,使实用程序黑盒子没有副作用。如果 副作用是必不可少的,记录这些作为界面的一部分。 开发标准的标题评论结构。
  • 动态构建的动态代码可以为解决方案增加灵活性,但是 如果出现问题,通常更难调试。制作这样的代码 尽可能防弹,并构建可选的日志记录 无论如何都会有问题。

如果您愿意,可以使用类似OOP的样式。但没有必要这样做。如果你这样做,它应该通过一个应用程序公平地使用IMO,除了低级实用程序。但是OOP风格的代码至少与非OOP代码一样复杂,并且APL没有内置继承或其他支持OOP的语法。

答案 2 :(得分:0)

(我在这里使用“A”代替评论,“”而不是符号标记。)


好吧,我正在开发APL一年,我只使用了Aplusdev.org

你甚至不需要更多。诀窍是尝试想像OOP一样。您应该 - 如果我记得很清楚 - 结构化字段用作类数据,就像{'attribute1'adtribute2,{value,value2}}一样,您可以轻松地选择它们{{{在c ++中1}} (这里'属性选择对象,仅在类函数中使用:))

此外,使用命名空间函数:

obj.attribute1

和许多简单的工具功能,而不是漂亮的长线。性能下降并不大,一旦看到某些内容可能更快,您可以稍后对所述数组进行优化。

之前:认为matlab和mathematica 没有for循环! :)它有很多帮助。

我对强大,可维护代码的建议:

  • 使用广泛的实用程序函数而不是使用那些不可读的符号来欺骗,以使您的代码始终如一。

  • try-catch块有一个内置的异常处理,可以在这里使用,

    try_begin();
    一个尝试过的代码,可能在额外的括号中,最后不要忘记try_end()。

    try_end();
    catch(sth,function_here);

    可以很好地实现。 (你会发现,捕捉错误非常重要)

  • 粗略类型检查:实现一个标准并用于不那么多次称为函数...(您可以在函数定义之后立即放置具有灵活参数的函数)<登记/> 语法:

    功能(point2i,ch): {
       typecheck({{'int,[1 2]},'char});在typecheck做一些断言......
       //你的功能就在这里 }

  • lambda函数可以非常有效,你可以做一些反思来实现lambdas。

  • 总是声明返回并说“返回”!

  • 基于try-catch的单元测试测试您编写的每个函数。

  • 我还在mathematica中使用了很多' apply '和' map ',实现了我自己的版本,它们在这里非常有效。< / p>

  • 我编写了matlab思维,因为你可以在变量中找到结构化字段(=类数据)的列表。如果你想保持无环路的东西(你想要,相信我),你会写很多这些。为此你需要有一个标准的命名约定,用复数表示:

    namespace_class.method(objects,arg1,arg2)

最后:同样,我写了像Javascript或VisualBasic中的inputBox和messageBox,它们可以很容易地将简单的工具或检查状态混合在一起。 messageBox的唯一捕获,它不能保持函数流, 所以你需要

namespace_classname.method(this, arg1)
namespace_classname._private_method(this, arg1, arg2)

您可以使用gawk / sed组合在bash中编写自动文档,以将其放入网页中。 创建HTML格式的代码也有助于打印。 ;)

我希望这是正确构建的好大纲。在编写自己的工具之前,尝试从遗留代码库中挖掘出可用的工具...由于时间的混乱,函数通常甚至用不同的名称实现4次。