我必须在APL中编码。由于代码将被维护很长一段时间,我想知道是否有一些论文/书籍包含启发式/提示/样本,以帮助设计清晰可读的APL程序。
与其他编程语言编码不同。例如,制作一个功能。 Small无济于事:这样的函数可以包含一行代码,这是完全不可理解的。
答案 0 :(得分:9)
首先,欢迎来到APL的精彩世界。
编写可读和可维护的APL代码与编写任何语言的可读和可维护代码没有多大区别。编写干净代码的任何好书都适用于APL,与其他任何语言一样,甚至更多。我推荐Robert C. Martin的Clean Code。
考虑本书中的指南,函数中的所有代码都应处于相同的抽象级别。这适用于APL 100次。例如,如果你有一个名为DoThisBigTask的函数,它应该只有很少的APL原始符号,当然也没有长复杂的单行。它应该是对其他低级函数的一系列调用。如果这些更高级别的功能都具有良好的名称和明确定义,那么一般的漂移应该由不熟悉APL的人轻松确定。最低级别的函数将只是原语,并且对于非APLer将是不可理解的。根据他们的写作方式,他们甚至可能最初看起来不可思议的经验丰富的APLer。但是,如果维护程序员无法理解原始编码技术,这些低级函数应该很短,没有副作用,并且可以很容易地重写而不是修改。
通常,保持您的功能简短,命名良好,定义明确,并且重点突出。并保持代码行更短。拥有定义明确且记录良好的函数比编写良好的文档代码行更为重要。
答案 1 :(得分:2)
由于您要求提供书籍和其他参考资料,我建议:
我认为APL作为“只写语言”的声誉被夸大了。人们确实需要习惯用于表示它们的基元和符号。但是,人们需要习惯许多其他语言环境中的语法和各种库函数。我已经看到C,C ++和Java中的复杂代码与任何APL一样难以理解。当然,它不是好的C,C ++或Java,即使它很聪明。
一些建议:
如果您愿意,可以使用类似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次。