注釈のJavascriptのメタプログラミング

言語の自由

自由の概念は異なる領域で異なる定義を持って、私たちは数学の次元から学ぶことができるが、表現の自由を練習するスペースを構成し、この手段:設計手法の数が相互に関連していない同じ問題。

、抽出機能を順序を設計する方法たとえば、商品の割引などの問題を解決するため、多くの具体的なアイデアがあるかもしれませんが、他の言語もサポートしている場合には、視点を指向プロセス(OP)からこの問題に同一の溶液であったかもしれませんOOはほぼ完全に別の角度から問題を解決する能力を提供するため、オブジェクト指向(OO)の設計方法は、我々は、後者がより自由であると信じます。

自由度は「次元」の定義から学ぶことができるので、私たちは「次元」コンピュータ言語を分析しようとすると、その前に、我々は言語を分析する必要が複雑になるための方法をステップバイシンプルなステップです。

この記事の焦点は、コマンドスタイルのコンピュータ言語です。

第一の工程、構造の基本的な態様は、(データ構造)が発生し、定数、変数、演算子、配列、循環「注文」を反映する、分岐、

関数、プロシージャなどを含む第2のステップ、がルーチン、.;

第3のステップは、マクロはマクロ、テンプレート、ジェネリック医薬品を含め、表示されます。

第四の工程は、客観的世界の抽象化はOOなどを含め、構造に登場しました。

第五の工程は、このようなコメントは、反射などのプログラミング機能を、そこ員、
...

コンピュータ言語歴史からは、これらのステップは、拡大する年代順に、我々はより多くの言語の意味もたらしを増強する能力を懸念しているとは限らないです。このうち、第2のステップは完了し、より良いサポートを提供するために大規模なソフトウェアプロジェクトのためのプログラム構造設計手法の登場を記念して、第三ステップは、さらに、第2ステップに抽象化されるが、第四工程の意味がより重要表しあなたは最終的には「階層」の達成を支援することができる手段ところ非常に重要なポイント、あなたは分離を行うための「コア」と「周辺」を達成することができ、一部は離れて電位変化と比較的安定している、それは、コーディングの表現の内容ですだけではなく、フラット、そして最後に「クラス」を進化させ

本質的には、それは彼ら自身の抽象言語能力を超えて上昇の進化を反映しています。

ここでは非常に興味深い現象が増加している抽象化され、それはフラクタルまでの言語ディメンションを行います - 抽象的な自然が空間で再帰的自己相似マッピングのいくつかの種類を提供することであり、したがって、「フラクタル」を反映構造は、フラクタル構造を呈し、元の空間でフラクタル増加したが、新たな次元を与えることは困難整数、すなわち、そのような寸法は、1.5次元、二次元までとすることができるが、到達することができないです。

したがって、高レベルのコンピュータ言語の大部分の現在の寸法は、1.xのあります

第五の工程は、しかし、手段は、言語は本当に高い次元に向かって移動し始めたこと。

実際には、メタプログラミングを達成するための多くの方法があり、それ自体が懸念されている言語から、2つのカテゴリに分けることができる:拡張APIと新しい構文を実現するために、元に代わって反映され、注釈のために後者を代表して。

例で見てみましょう:

public class TestCase{
    @Before
    public void setUp() throws Exception{}
    @After
    public void tearDown() throws Exception{}
    @Test
    public void add() {}
}

上記のJava言語注釈タイプはここで、ユニットテスト三つの段階を規定の使用である:
前@、@後、テストは「可変」「変数」を定義し、実行の順序を定義する@、ここではい」であります「コードの再符号化プロセスは、メタプログラミングの典型的な実装です。

私たちは、もちろんまた、強化API(反射や、そのような感動バージョン法などの設計上の制約()による)によって対処することができますが、シンプルで分かりやすい注釈のように方法ではありませんどのような種類に関係なく、。

根本的な理由は、これらの2次元あまりにも多くの「関連性」の強化API論理式で既存のコード、1.X次元の実装があるということですが、途中で大幅に注釈は2間の相関を減らします後者の自由度が高くなるように、より多くの次元を切り離します。

以下JSモカのユニットテストに基づきます:

describe('测试过程1', function() {
    it('1+1', function() {
        expect(fn_add(1, 1)).to.be.equal(2);
    });
});

私たちは、以下のプログラミングスタイルを期待します:

'@test(step=测试过程1,name=1+1,expect=2';
var step0 = function(){
    return fn_add(1, 1);
}

JSは、アノテーションベースのメタプログラミングを実現します

次のように我々は、メカニズム注釈JSを導入しようとします。

'@Log(level=info,dateFormat=YYYY-MM-DD HH:mm)’;
var logInfo = function(_msg){
    console.log(_msg);
} 

複雑なシーンでは、複数のアノテーションの関連性を考慮してください。

'@Start';
var serverStart = function(){}

'@Rule(fileType=.(html|htm))';
var proHtml = function(_req,_res){}

'@Rule(fileType=.(jpg|gif|webp))';
var proPic = function(_req,_res){}

'@Finish';
var serverFinish = function(){}

AT-jsのフレームワーク

上記の考え方に基づいて、我々は実現アットJS JSファイルは、ネイティブファイルの判断と注釈の種類の認識を達成するためにロードされたメカニズムがあるときに、フレームワークやオープンソース、最後のNode.jsで、上書きすることにより、非常にシンプルに実行され、JSでのアイデアの実現を強化処理は、パフォーマンス上の理由から、で-JSの実施形態は、AST上に規則的スキャンを使用します。

で-jsから成る利用方法:定義および注釈の注釈を使用しました。

定義コメント:

require('at-js').define('helloworld',{//annotation's name
    scope: 'var', build: function () {//the scope of it's effected
        return "return function(_msg)    {console.log('[helloworld]'+_msg);};"//the real script
    }
})

使用コメント:

'@helloworld';
var sayHello = function(){}

sayHello('here')

業績:

ここで[HelloWorldの]

次のコードは、テストユニット(説明://github.com/CheMingjun ... HTTPSを):

'@test.start';
var start = function () {
    ds = {};
}

'@test.step(timeout=2000)';
var test0 = function* () {
    ds.test0 = 'finish';
    var rtn = yield (function(){
        return function(_next){
            setTimeout(function(){
                _next(null,3);
        },2000)
        }
    })();
    assert.equal(rtn,3);
}

'@test.step';
var test1 = function () {
    ds.test1 = 'finish';
    return ds;
}

'@test.finish';
var fh = function () {
    ds = null;
}

以下のように、JS varが注釈サポート異なるレベルとファイルの段階を定義された、実施形態は、定義されたファイルの注意レベルの複雑な、両方のAPIです。

Varのタイプに定義注:

    {
        scope:'var',
        build:function(_ctx, _argAry){
            //_ctx
            {
                filePath,//应该该注释的文件位置
                name,//注释名称
                desc,//注释中的变量表(key-value)
                refName,//被注释的变量名称
                refType//被注释的变量类型(undefined|function|generator|object)
            }
            //_aryAry 被注释变量签名中的参数列表
        
            return //返回该变量被替换之后的代码
        }
    }

ファイルの種類の注釈が​​定義されました:

    {
        return {
            which: {//针对改组annotation中的每一项做处理
                'test.start': function (_ctx, _argAry) {
                    //_ctx 与 _argAry 同上定义
                    //处理逻辑
                }
            }, script: function () {
                return //返回该文件追加的代码
            }
        }
    }

実際の製造工程では、注釈ORMの次のセット:

    '@dao.column';
    var id;

    '@dao.column(name=name)';
    var name;

    '@dao.column(name=status)';
    var status;

    '@dao.column(name=creator_id)';
    var creatorId;

    '@dao.column(name=creator_name)';
    var creatorName;

    '@dao.column(name=gmt_create)';
    var createTime = function (_time) {
            var mm = require('moment');
            return mm(_time).format("YYYY-MM-DD HH:mm:ss");
    }

    '@dao.column(name=gmt_update)';
    var updateTime = function (_time) {
            var mm = require('moment');
            return mm(_time).format("YYYY-MM-DD HH:mm:ss");
    }

    '@dao.column(name=type)';
    var type;

概要

この記事では、言語の自由の簡単な定義を与え、これに基づいて言語の開発プロセスで提示異なる複雑さを説明し、そしてメタプログラミング言語の自由度を向上させる方法について説明しますが基本です。第二部では、我々は、ネイティブの能力に基づいてJSのメタプログラミング言語を増加しようとアイデアの実現導入:アットJSフレームワークを。

おすすめ

転載: www.cnblogs.com/baimeishaoxia/p/12039883.html
おすすめ