4

APLでコーディングする必要があります。コードは長期間維持されるため、クリーンで読みやすいAPLプログラムの設計に役立つヒューリスティック/ヒント/サンプルを含む論文/本があるかどうか疑問に思います。

これは、他のプログラミング言語でのコーディングとは異なる経験です。たとえば、関数を作成します。Smallは役に立ちません。このような関数には、完全に理解できない1行のコードが含まれている可能性があります。

4

3 に答える 3

11

まず、素晴らしい APL の世界へようこそ。

読みやすく保守しやすい APL コードを書くことは、どの言語でも読みやすく保守しやすいコードを書くことと大差ありません。きれいなコードを書くことに関する優れた本は、他の言語と同じように APL に適用できます。Robert C. Martin によるClean Codeをお勧めします。

関数内のすべてのコードは同じレベルの抽象化でなければならないという本書のガイドラインを考慮してください。これは、APL 100 回以上適用されます。たとえば、DoThisBigTask という名前の関数がある場合、その関数には APL プリミティブ シンボルがほとんど含まれておらず、長くて複雑なワンライナーは含まれていません。他の低レベル関数への一連の呼び出しであるべきです。これらの高レベル関数がすべて適切に命名され、適切に定義されている場合、一般的なドリフトは、APL を知らない人でも簡単に判断できるはずです。最下位レベルの関数はプリミティブにすぎず、非 APLer には不可解です。書き方によっては、経験豊富な APLer には最初は不可解に見えることさえあります。ただし、これらの低レベル関数は短く、副作用がなく、

一般に、関数は短く、適切な名前を付け、明確に定義し、要点を絞ってください。コード行をさらに短くしてください。適切に記述された、または適切に文書化されたコード行を持つことよりも、適切に定義され、適切に文書化された関数を持つことの方がはるかに重要です。

于 2012-12-14T14:46:22.357 に答える
1

(ここでは、コメントの代わりに「A」を使用し、記号記号の代わりに「'」を使用します。)


ええと、私は1年間APLを開発していました、私はAplusdev.orgだけを使用しました。

これ以上は必要ありません。秘訣は、OOPのようなものを考えようとすることです。クラスデータとして使用される構造化フィールドは、{'attribute1' attribute2、{value、value2}}のようobj.attribute1に、c ++のように簡単に選択できるようにする必要があります(よく覚えている場合)。(ここで'属性Pickオブジェクト、クラス関数でのみ使用:))

さらに、名前空間関数を使用します。

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

気の利いた長い行の代わりに、たくさんのシンプルなツール機能があります。パフォーマンスの低下はそれほど大きくありません。何かが速くなる可能性があることがわかったら、後でアレイ用に最適化できます。

そして何よりもまず、 forループなしでmatlabとmathematicaを考えてください!:)それは大いに役立ちます。

堅牢で保守可能なコードに関する私の提案:

  • これらの読み取り不可能な記号を巧妙に扱う代わりに、広範なユーティリティ関数のセットを使用して、コードを常に的確なものにします。

  • try-catchブロックには例外処理が組み込まれており、ここで利用できます。

    try_begin();
    試行されたコード。最後にtry_end()を忘れないように、余分な角かっこで囲んでください。

    try_end();
    catch(sth、function_here);

    うまく実装することができます。(エラーをキャッチすることは非常に重要です)

  • 大まかな型チェック:標準を実装し、関数と呼ばれるあまり多くない場合に使用します...(関数定義の直後に柔軟なパラメーターを持つ関数を配置できます)
    構文:

    function(point2i、ch):{typecheck
    ({{'int、[1 2]}、' char}); タイプチェックでいくつかのアサーションを実行し
    ます...//関数はここに移動します
    }

  • ラムダ関数は非常に効果的です。ラムダを実現するためにいくつかのリフレクションを行うことができます。

  • 常に「リターン」と言ってリターンを宣言してください!

  • 作成するすべての関数のtry-catchテストに基づく単体テスト。

  • また、mathematicaの「 apply」と「map 」をたくさん使って、自分のバージョンを実装しました。ここでは非常に効果的です。

  • 変数に構造化フィールド(=クラスデータ)のリストを含めることができるので、MATLABの考え方を書きました。ループのないものを維持したい場合は、それらをたくさん作成します(そして、私を信頼したい場合)。そのためには、標準の命名規則で、複数形で示すと言う必要があります。

    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
 }

gawk / sedの組み合わせを使用してbashで自動ドキュメントを記述し、Webページに配置できます。また、HTML形式のコードを作成すると、印刷に役立ちます。;)

これが適切なビルドアップのための良いアウトラインであったことを願っています。独自のツールを作成する前に、レガシーコードベースから利用可能なツールを掘り下げてみてください...そのときの混乱のために、関数は多くの場合、異なる名前で4回実装されています。

于 2012-11-17T16:55:55.107 に答える