Decoratorの動作確認

Decoratorの概要と動作確認をします。また、利用例として、メソッドの前後に処理を追加する方法を確認します。

Decoratorとは

例えば、メソッドにDecoratorを割り当てて、そのメソッドが実行される前後に処理を付け加える(装飾する)ことができ、ログの出力などで活用されます。

Vue.jsでTypeScriptをクラスベースで利用する際、vue-class-componentvue-property-decorator を利用しますが、こちらでもDecoratorが活用されています。

Decoratorは、クラス メソッド アクセサ プロパティ パラメータ に割り当てることが可能です。

tsconfig.jsonを修正

Decoratorを利用する場合、tsconfig.json の下記オプションを true にしておく必要があります。

{
  "compilerOptions": {

        (省略)

    /* Experimental Options */
    "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    "emitDecoratorMetadata": true          /* Enables experimental support for emitting type metadata for decorators. */
  }
}

動作確認

どのタイミングで実行されるか確認します。

// デコレータファクトリー
function f() {
    console.log("f(): evaluated");

    // デコレーター
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        console.log("f(): called");
        console.log("### target ###");
        console.log(target);
        console.log("### propertyKey ###");
        console.log(propertyKey);
        console.log("### descriptor ###");
        console.log(descriptor);
    }
}

class TestClass {
    @f()
    public xxx() {
        console.log("xxx method processing");
    }
}

console.log("create object");
const testClass = new TestClass();
console.log("before xxx");
testClass.xxx();
f(): evaluated
f(): called
### target ###
TestClass { xxx: [Function] }
### propertyKey ###
xxx
### descriptor ###
{ value: [Function],
  writable: true,
  enumerable: true,
  configurable: true }
create object
before xxx
xxx method processing

メソッドの前後に処理を追加

元のメソッドを1度退避させて、前処理、後処理を装飾します。

function f() {
    console.log("f(): evaluated");
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        console.log("f(): called");
        console.log("### target ###");
        console.log(target);
        console.log("### propertyKey ###");
        console.log(propertyKey);
        console.log("### descriptor ###");
        console.log(descriptor);

        const originalMethod = descriptor.value;  // 元のメソッドを退避
        descriptor.value = function () {
            console.log("Decorate pre processing");
            const ret = originalMethod.apply(this, arguments);  // 元のメソッドを実行
            console.log("Decorate post processing");
            return ret;
        }
    }
}

class TestClass {
    @f()
    public xxx() {
        console.log("xxx method processing");
    }
}

console.log("create object");
const testClass = new TestClass();
console.log("before xxx");
testClass.xxx();
f(): evaluated
f(): called
### target ###
TestClass { xxx: [Function] }
### propertyKey ###
xxx
### descriptor ###
{ value: [Function],
  writable: true,
  enumerable: true,
  configurable: true }
create object
before xxx
Decorate pre processing
xxx method processing
Decorate post processing

参考

【エンジニア向け】仕事を見つける方法

転職する

転職エージェントを活用する

転職サイトの場合、自身でサイト上から企業を探す必要があります。 一方「レバテックキャリア」 などの転職エージェントの場合、エージェントが企業を紹介してくれます。エージェントが間に入ることにより、日程調整や、条件交渉などもサポートしてくれます。

転職ドラフトを活用する

転職ドラフト」は、 企業がITエンジニアをドラフトという形で指名するサービスです。年収が最初に提示されるなどのメリットがあります。 ただ、初回登録時にレジュメ作成が必要で、すでにエンジニア経験が豊富にあるエンジニア向けのサービスかと思います。 レジュメ作成が手間ですが、自身のキャリアを見直す機会になり、他の仕事探しにも役立つはずです。

エンジニア転職保証のあるスクールを活用する

ある程度、開発経験のあるかたであれば、独学で必要なスキルを身につけることができるはずです。ただ、別業種からエンジニアに転職したい場合など、1から独学で学ぶのはハードルが高いです。そういった方は、スクールの活用を検討しても良いと思います。 「TechAcademy」は、エンジニア転職保証コースを提供しています。給付金制度の対象講座として認定されているため、金銭面の負担も抑えることができます。

フリーランスとして活動する

レバテックフリーランス」「ITプロパートナーズ」「ギークスジョブ」は、フリーランスエージェントサービスです。 エージェントによって、支払いサイトなど細かい違いはありますが、まずは良い案件を見つけることが重要です。 登録自体は無料なので、複数エージェントに登録して、より多くの案件を紹介してもらうのがおすすめです。