staticメソッド
クラスに静的メソッドや静的プロパティを定義するときに用いる
静的に定義されたメソッド・プロパティはクラスそのものから呼び出される
インスタンスからは呼び出されない
静的メソッドの使い道
オブジェクトの生成や複製
静的プロパティの使い道
キャッシュ、固定的な構成、その他インスタンスに複製する必要のないデータ
code:class.ts
class Sample {
static staticProperty = "some value";
static staticMethod() {
return "関数が呼ばれました。";
}
}
// 呼び出し方
console.log(Sample.staticProperty); // "some value"
console.log(Sample.staticMethod()); // "関数が呼ばれました"
staticメソッドが使われる背景には、手続き型言語(ex. C言語)の考えが影響している
手続き型言語では、データとロジックが別々になるように設計する
その考えのままオブジェクト指向言語で設計すると、データとロジックは別々のクラスに置かれることになり、メソッドはクラスのインスタンスを生成せずに使えるstaticメソッドとして定義されてしまう
staticメソッドはインスタンスを作らずに使用できる、お手軽感があるが、実際は低凝集な設計に陥れる可能性がある
ファクトリーメソッドパターンでstaticメソッドを使うことが多い
logger, エラー検出, キャッシュなど、横断的関心ごとの場合はstaticメソッドを使っても良い
インスタンスメソッドのふりをしたstaticメソッドに気をつける
code:ja
class PaymentManager {
private int discountRate: number; // 割引率
// 省略
int add(int x, int y) {
return x + y;
}
}
addメソッドではインスタンス変数discountRateを使っておらず、引数で受け取った値だけで計算を行なっている
これにより低凝集に陥りやすくなる
怪しいメソッドにstaticキーワードを付けて、コンパイルエラーしなければ、それは実質staticメソッドである