【问题标题】:APL readabilityAPL 可读性
【发布时间】:2012-10-16 07:38:41
【问题描述】:

我必须在 APL 中编码。由于代码将长期维护,我想知道是否有一些论文/书籍包含启发式/技巧/示例,以帮助设计干净易读的 APL 程序。

这与使用其他编程语言进行编码是一种不同的体验。例如,制作一个函数。小无助:这样的函数可以包含一行代码,完全看不懂。

【问题讨论】:

  • 我在 APL 中编码的时间很长(几十年)。但是你应该非常小心 cmets 和命名。 APL 往往是一种“只写”语言。至少,注释代码中每一个棘手的部分。
  • 你可能会考虑切换到一些更易读的函数式编程语言(Ocaml,Haskell,...)。
  • 不幸的是,我有一个庞大的 APL 遗留系统需要维护。
  • 祝你好运。我相信你应该关心(而不是其他语言)文档。
  • 我在 APL 中管理任何代码的方式是注释每一行的每一部分。我通常可以在每个代码行之前有 3-4 行注释,也许更多,注释行包括代码部分及其正在做什么。如果您必须记住如何它正在做什么,以及它正在做什么长期,这是唯一的方法。并且尽可能小规模地使用您的功能。

标签: readability maintainability apl


【解决方案1】:

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

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

请考虑本书中的准则,即函数中的所有代码都应处于同一抽象级别。这适用于 APL 100 倍以上。例如,如果您有一个名为 DoThisBigTask 的函数,它应该包含非常少的 APL 原始符号,当然也没有冗长的复杂单行代码。它应该只是对其他较低级别函数的一系列调用。如果这些更高级的函数都具有良好的名称和良好的定义,那么即使不了解 APL 的人也应该很容易确定一般漂移。最低级别的函数将只是原语,并且对于非 APLer 来说是难以理解的。根据它们的编写方式,它们甚至可能最初对经验丰富的 APLer 来说是难以理解的。但是,这些低级函数应该很短,没有副作用,并且如果维护程序员无法理解原始编码技术,可以很容易地重写而不是修改。

一般而言,请保持您的函数简短、命名良好、定义明确且切中要害。并保持代码行更短。拥有定义良好且记录良好的函数比拥有编写良好或记录良好的代码行更重要。

【讨论】:

    【解决方案2】:

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

    • APL2 深度分析,作者 Norman D. Thomson 和 Raymond P. Polivka。我和 Ray Polivka 一起工作了很多年,他是我最好的 APL 老师之一 曾经知道。
    • 经典A. P.L.:一种交互式方法 作者: Leonard Gilman 和 Allen J. Rose 对核心语言有好处,但是 相当过时,并且不包含太多真正相关的内容 可读性。
    • APL 2 概览 James A. Brown 和 Sandra Pakin 在某些方面是对 Gilman 和 Rose 的更新。它涵盖了对 APL 的嵌套操作和其他更新,但没有特别针对可读性。不过,如果您遵循此处的示例,您将编写可读的代码。
    • APL 很简单,STSC 和 Jerry R. Turner 是专门针对 APL*Plus 系列的介绍。同样,没有特别强调可读性,但模型通常是精心设计的可读代码。
    • Mastering Dyalog APL: A Complete Introduction to Dyalog APL 如果您专门在 Dyalog APL 中工作,则非常好,如果您正在使用其他版本之一,例如 APL*Plus,则不是那么好(来自 APL2000)

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

    一些建议:

    • 写“单行”是测试一个人对语言的掌握程度的一种方式, 但是对于生产代码来说是非常糟糕的做法。
    • 注释以使算法,尤其是正在使用的数据结构清晰。与任何代码一样,cmets 应该添加一些内容 无法从代码本身轻松读取,或引起注意 复杂或晦涩的代码。
    • 尽可能避免晦涩的代码,因此无需解释。通常是可以的。
    • 让每个功能只做一项工作,界面清晰。 大多数情况下避免使用全局变量,并记录任何需要的变量。
    • 记录任何功能的接口、目的和效果 最佳。如果可能,制作没有副作用的实用程序黑匣子。如果 副作用是必不可少的,将它们记录为界面的一部分。 制定标准的标题注释结构。
    • 动态构建的动态代码可以为解决方案增加灵活性,但 如果出现问题,通常很难调试。制作这样的代码 尽可能防弹,并内置可选的日志记录到 在发现问题时提供帮助。

    如果您愿意,可以使用类似 OOP 的样式。但没有必要这样做。如果你这样做了,它应该在应用程序中相当普遍地使用 IMO,除了可能用于低级实用程序。但是 OOP 风格的代码至少可以和非 OOP 代码一样复杂,而且 APL 没有内置的继承或其他支持 OOP 的语法。

    【讨论】:

      【解决方案3】:

      (我将在这里使用“A”代替注释,“'”代替符号符号。)


      嗯,我开发 APL 一年了,我只用过Aplusdev.org

      你甚至不需要更多。诀窍是尝试像 OOP 一样思考。你应该有——如果我没记错的话——用作类数据的结构化字段,比如 {'attribute1 'attribute2, {value,value2}},这样你就可以像 @987654322 一样轻松挑选它们@ 在 C++ 中。 (这里是'属性Pick对象,只在类函数中使用:))

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

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

      还有很多简单的工具功能,而不是漂亮的长行。性能下降并不显着,您可以稍后在看到某些可能更快的情况下针对 say 数组进行优化。

      在任何事情之前:想想 matlab 和 mathematica 没有 for 循环! :) 很有帮助。

      我对健壮、可维护代码的建议:

      • 使用广泛的实用函数集,而不是使用那些不可读的符号进行欺骗,以使您的代码始终切中要害。

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

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

        try_end();
        catch(sth, function_here);

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

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

        函数(point2i,ch): {
        类型检查({{'int,[1 2]},'char});在类型检查中做一些断言...
        // 你的函数放在这里
        }

      • lambda 函数可以很有效,你可以做一些反射来实现 lambdas。

      • 总是用“return”声明退货!

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

      • 我还使用了很多来自 mathematica 的“apply”和“ma​​p”,实现了我自己的版本,它们在这里非常非常有效。

      • 我写 matlab 的想法是因为你可以在这里有一个变量中的结构化字段(=类数据)列表。如果你想保持 for-loop-less(你想,相信我),你会写很多这样的东西。为此,您需要有一个标准的命名约定,比如用复数表示:

        namespace_class.method(objects, arg1, arg2)

      最后:另外,我编写了像 Javascript 或 VisualBasic 中的 inputBox 和 messageBox,它们可以很容易地组合简单的工具或检查状态。 messageBox 的唯一问题是它不能暂停功能流, 所以你需要

       AA documentation of f1
       f1():
       {
           A  do sth
      
           msgbox.call("Hi there",{'Ok, {'f2}}); 
       }
       f2():
       {
           A  continue doing stuff
       }
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-03
        • 2017-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多