首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >APL可读性

APL可读性
EN

Stack Overflow用户
提问于 2012-10-16 15:38:42
回答 3查看 1.2K关注 0票数 4

我必须用APL编写代码。由于代码要维护很长时间,我想知道是否有一些论文/书籍包含启发式/提示/样本,以帮助设计干净和可读的APL程序。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-14 22:46:22

首先,欢迎来到APL的奇妙世界。

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

考虑本书中的指导原则,即函数中的所有代码都应该处于相同的抽象级别。这适用于APL 100多倍。例如,如果你有一个名为APL的函数,它应该有很少的DoThisBigTask基元符号,当然也不会有复杂的一行程序。它应该只是对其他较低级别的函数的一系列调用。如果这些更高级别的函数都是命名良好且定义良好的,那么一般的漂移应该很容易由不了解APL的人确定。最低层的函数将只是原语,对于非APLer来说是不可理解的。取决于它们是如何编写的,对于经验丰富的APLer来说,它们最初可能看起来是难以理解的。然而,这些低级函数应该很短,没有副作用,如果维护程序员不能理解原始的编码技术,可以很容易地重写而不是修改。

通常,保持您的函数简短,命名良好,定义良好,并且切中要害。并保持代码行更短。与拥有编写良好或文档良好的代码行相比,拥有定义良好且文档记录良好的函数要重要得多。

票数 11
EN

Stack Overflow用户

发布于 2016-10-11 00:13:56

既然你要了书和其他参考资料,我可以建议:

作者声明:

  • APL2 in Depth by Norman D. Thomson和Raymond P. Polivka。我和Ray Polivka共事多年,他是我所知道的最好的APL老师之一。
  • 伦纳德·吉尔曼和艾伦·J·罗斯的经典A·P·L·L:交互方法对核心语言有好处,但相当过时,没有包含太多与readability.
  • APL 2一目了然相关的内容,詹姆斯·A·布朗和桑德拉·帕金在某些方面作为吉尔曼和罗斯的更新。它涵盖了对APL的嵌套操作和其他更新,但并没有特别针对可读性。不过,如果你遵循这里的例子,你将会写出可读的代码。
  • 应用编程语言很容易,而曾傑瑞R。特纳是一篇专门针对应用编程语言*Plus行的介绍。同样,在可读性方面没有太多特别的内容,但是这些模型通常是设计良好的可读性好的code.
  • Mastering Dyalog APL:如果您专门使用Dyalog APL,那么Bernard Legrand对Dyalog APL的完整介绍是非常好的,如果您正在使用其他版本之一,如APL*Plus (来自APL2000)

,就不是那么好了

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

一些建议:

  • 编写“一行程序”是测试一个人对该语言的掌握程度的一种方式,但对于生产代码来说,这是一种非常糟糕的做法()。
  • 注释,使算法,特别是所使用的数据结构清晰。与任何代码一样,注释应该添加一些不容易从代码本身读取的内容,或者引起人们对复杂或晦涩代码的注意。
  • ,如果可能的话,避免使用晦涩的代码,这样就不需要解释了。它通常是possible.
  • Make每个函数做一个并且只做一个工作,具有清晰的界面。在大多数情况下,避免使用全局变量,并在顶部记录( needed.
  • Document )任何函数的接口、用途和效果。如果可能的话,让实用工具成为没有副作用的黑盒。如果副作用是必要的,则将其作为界面的一部分进行记录。开发一个标准的标题注释动态构建的structure.
  • Dynamic代码可以为解决方案增加灵活性,但如果出现问题,通常很难进行调试。让这类代码尽可能地防弹,并内置可选的日志记录,以便在出现问题时提供帮助。

如果你愿意,你可以使用类似OOP的风格。但没有必要这样做。如果您这样做了,那么应该在整个应用程序中广泛地使用它,也许低级实用程序除外。但是OOP风格的代码至少可以像非OOP代码一样复杂,而且APL没有内置继承或其他支持OOP的语法。

票数 3
EN

Stack Overflow用户

发布于 2012-11-18 00:55:55

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

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

你甚至不需要更多。诀窍是尝试像那样OOP。如果我没记错的话,您应该有像{'attribute1‘,{attribute1 'attribute2,{attribute1,value2}}这样的用作类数据值的属性结构化字段,这样您就可以像c++中的obj.attribute1一样轻松地挑选出它们。(这里的'attribute pick object,仅在类函数中使用:)

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

代码语言:javascript
复制
namespace_classname.method(this, arg1)
namespace_classname._private_method(this, arg1, arg2)

和许多简单的工具函数,而不是漂亮的,长行。性能的下降不是很大,你可以在以后发现一些可以更快的东西时,对数组进行优化。

在此之前:想一想matlab和没有for循环!:)它有很大的帮助。

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

为了避免使用那些不可读的符号来使你的代码总是被point.

  • try-catch块阻塞,有一个内置的异常处理功能,可以在这里使用,这是一个非常广泛的实用函数集。

try_begin();

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

try_end();

捕捉( function_here);

可以很好地实现。(您将看到,捕获错误是非常简单的important)

  • crude类型检查:实现一个标准,并用于调用次数不多的函数...(您可以将带有灵活参数的函数放在函数定义后面)

语法:

函数(point2i,ch):{

类型检查({{‘int,1 2},'char});A在类型检查中执行一些断言...

//你的函数在这里

}

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

  • always声明返回,说"return"!

  • Unit测试基于try-catch测试你写的每个函数。

  • 我还使用了很多来自mathematica的'apply‘和'map’,实现了我自己的版本。它们在这里非常-非常有效,我写matlab的想法,因为你可以在变量中有一个结构化字段(=

  • )的列表。如果你想让东西保持无循环(相信我,你想要的),你会写很多这样的代码。为此,您需要有一个标准的命名约定,比如用复数表示:

namespace_class.method(objects,arg1,arg2)

最后:另外,我编写了inputBox和messageBox,就像Javascript或VisualBasic中的一样,它们可以非常容易地将简单的工具组合在一起或检查状态。messageBox的唯一缺点是,它不能将函数流搁置,因此您需要

代码语言:javascript
复制
 AA documentation of f1
 f1():
 {
     A  do sth

     msgbox.call("Hi there",{'Ok, {'f2}}); 
 }
 f2():
 {
     A  continue doing stuff
 }

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

我希望这是一个很好的大纲,为适当的建设。在编写自己的工具之前,试着从遗留代码库中挖掘出可用的工具……由于那段时间的混乱,函数经常被用不同的名称实现4次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12909711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档