質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.50%

javascript getter setter 設定するべきでしょうか?

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 1,556

fjaiofjawiefjaw

score 162

下のコードのように出来るだけゲッターとセッターは、設定すべきでしょうか?
私は、コードが縦に長くなるので、あまり書きたいと思っておりません。
しかし、一度書いておくと、後々、楽になるような気もして、迷っている最中です。
回答者様なら、積極的にゲッターとセッターを書きますか

class Monster {
  constructor(){
   this._attack = 10;
   this._life = 10;
   this._height = 100;
  }

  get attack(){ return this._attack; }
  set attack(new_attack) { this._attack = new_attack; }
  get life(){ return this._life; }
  set life(new_life) { this._life = new_life; }
  get height(){ return this._height; }
  set height(new_height) { this._height = new_height; }
}

  

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+8

JavaScriptにおいては、通常のプロパティすべてをゲッター/セッターで実装することは不要であると考えています。

まず、get/setが必要になる理由、つまり、ゲッター/セッターの利点を考えてください。通常のプロパティと違ってゲッター/セッターを使用した場合に次のようなことが可能になります。

  • 読み込みのみ、または、書き込みのみのプロパティを作れる。
  • 読み込み時、または、書き込み時に追加の操作を行える。例えば、読み込み回数をカウントするなど。
  • 他のプロパティから自動生成される値の場合は、必要になるまでその自動生成の計算を遅延できる。
  • プロパティの読み込みや書き込みについて、全く異なる処理に書き換えできる。(このような動作は非推奨)

他にもあるかも知れませんが、よく採用されるのは最初の一つぐらいで、それ以外は希だと思っています。

上のようなことをしなくてはならない事情が無く、単純にget/setを使って通常のプロパティと同じ動作になるように実装した場合、通常のプロパティと何ら変わることはありません。そのようなときは、通常のプロパティで十分でしょう。

で、問題は、通常のプロパティとして実装していたが、プロパティの読み書きについて、上のようなゲッター/セッター特有の処理を後から追加したくなったという場合です。通常のプロパティをゲッター/セッターに置き換えることは簡単にできるでしょう。このとき重要なのは、既にそのプロパティへの読み書きが書いてある他の部分について書き換える必要が無いということです。他の部分から見てそれがゲッター/セッターを使った物なのかプロパティへの単純なアクセスなのかの区別はありません。どちらも同じように書いて、同じようにアクセスできます。ですので、書き換えは不要です。また、JavaScriptはコンパイルするわけではありませんから、コンパイルし直しなんてものが発生するはずがありません。

つまり、将来の保険のため、という行為自体が全くの無駄になります。なので、JavaScriptでは特段の理由がない限りゲッター/セッターを使用する意味が無いと考えています。

これが他の言語、特に似たような名前のJavaにおいては、アクセス方法が変わって他の部分を全て書き直す必要が出てくるため、ゲッター/セッターで初めから書いたほうがよいという場合があります。ゲッター/セッターがどのようになっているかは言語によって全く異なるため、それぞれの言語での事情を鑑みる必要があるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/29 09:09 編集

    回答ありがとうございます。
    質問前にgetter、setterの必要性ぐらいは、自分で調べるべきでした。申し訳ありません。

    言語の特徴について、ご説明頂き、とても参考になりました。
    ありがとうございます。

    キャンセル

+3

なきゃないでどうとでもなりますが、
型変換や例外飛ばしたり出来るんで疎結合にはしやすくなりますね。
敵のエネミー1がエネミー2を回復するような場面で威力を発揮するかも?

console.log(10 + "10");
// "1010" ← 当然こうなる

var heal = document.querySelector("input.heal").val;
console.log(heal);
// "10"

enemy1 = new Monster();
console.log(enemy.life);
// 10

enemy1.life = enemy1.life + heal;
console.log(enemy.life);
// "1010" ←こうなるんじゃね?

Stringになるケースは例外を投げるようにしましょうか。
参考サイト:JavaScript で throw "" ではなく throw new Error() を使ったほうがよい(些細な)理由 - latest log

class Monster {
  constructor(){
   this._attack = 10;
   this._life = 10;
   this._height = 100;
  }

  get attack(){ return this._attack; }
  set attack(new_attack) { this._attack = new_attack; }
  get life(){ return this._life; }
  set life(new_life) {
    if (typeof new_life !== 'number') {
      throw new TypeError("型がちがうよ");
    }
    this._life = new_life;
  }
  get height(){ return this._height; }
  set height(new_height) { this._height = new_height; }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/29 09:18

    回答ありがとうございます。

    より実践的な使用方法で、とても参考になりました。
    どうもありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる