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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

4774閲覧

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

fjaiofjawiefjaw

総合スコア210

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2017/06/28 19:00

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

javascript

1class Monster { 2 constructor(){ 3 this._attack = 10; 4 this._life = 10; 5 this._height = 100; 6 } 7 8 get attack(){ return this._attack; } 9 set attack(new_attack) { this._attack = new_attack; } 10 get life(){ return this._life; } 11 set life(new_life) { this._life = new_life; } 12 get height(){ return this._height; } 13 set height(new_height) { this._height = new_height; } 14}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

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

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

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

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

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

投稿2017/06/28 21:50

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fjaiofjawiefjaw

2017/06/29 00:19 編集

回答ありがとうございます。 質問前にgetter、setterの必要性ぐらいは、自分で調べるべきでした。申し訳ありません。 言語の特徴について、ご説明頂き、とても参考になりました。 ありがとうございます。
guest

0

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

JavaScript

1console.log(10 + "10"); 2// "1010" ← 当然こうなる 3 4var heal = document.querySelector("input.heal").val; 5console.log(heal); 6// "10" 7 8enemy1 = new Monster(); 9console.log(enemy.life); 10// 10 11 12enemy1.life = enemy1.life + heal; 13console.log(enemy.life); 14// "1010" ←こうなるんじゃね?

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

JavaScript

1class Monster { 2 constructor(){ 3 this._attack = 10; 4 this._life = 10; 5 this._height = 100; 6 } 7 8 get attack(){ return this._attack; } 9 set attack(new_attack) { this._attack = new_attack; } 10 get life(){ return this._life; } 11 set life(new_life) { 12 if (typeof new_life !== 'number') { 13 throw new TypeError("型がちがうよ"); 14 } 15 this._life = new_life; 16 } 17 get height(){ return this._height; } 18 set height(new_height) { this._height = new_height; } 19}

投稿2017/06/28 21:46

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fjaiofjawiefjaw

2017/06/29 00:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問