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

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

新規登録して質問してみよう
ただいま回答率
85.35%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

3回答

382閲覧

セッター setter で望まない値が代入された時はどうしますか?

_._

総合スコア34

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

1クリップ

投稿2020/09/04 13:10

たとえば 0 から 9 までの整数しか受け入れたくない場合どのような挙動が正解ですか?

  • 現在の値が 5 で 15 を代入された場合
    1. エラー error をスロー throw
    2. 反映しない。破棄する。値は 5 のまま
    3. 範囲内におさまるように丸める。値は 9 になる
    4. 初期値がある場合は初期値にリセット
  • 現在の値が 5 で 7.5 を代入された場合
    1. エラー error をスロー throw
    2. 反映しない。破棄する。値は 5 のまま
    3. 範囲内におさまるように丸める。値は切り捨てて 7 または四捨五入して 8 になる
    4. 初期値がある場合は初期値にリセット
  • 現在の値が 5 で文字列 "a" を代入された場合
    1. エラー error をスロー throw
    2. 反映しない。破棄する。値は 5 のまま
    3. NaN -> false -> 0 として扱う。値は 0 になる
    4. length !== 0 -> true -> 1 として扱う。値は 1 になる
    5. 初期値がある場合は初期値にリセット

時と場合によって使い分けますか?どういう時どういう場合に何を使いますか?

言語の思想によっても異なりますか?

こんな挙動をする(こんな挙動にする)ことはありえない、とかありますか?

たとえば DOM の HTMLAnchorElement と HTMLDivElement の tabIndex で試したところ次のような結果になりました(Chrome と Firefox とで同じ結果でした)

javascript

1const setTabIndex = (tagName, value) => { 2 const element = document.createElement(tagName) 3 const defaultValue = element.tabIndex 4 element.tabIndex = value 5 console.log(`tagName: "${tagName}", defaultValue: "${defaultValue}", setValue: "${value}", resultValue: "${element.tabIndex}"`) 6} 7setTabIndex('a', 7.5) //tagName: "a", defaultValue: "0", setValue: "7.5", resultValue: "7" 8setTabIndex('a', 'a') //tagName: "a", defaultValue: "0", setValue: "a", resultValue: "0" 9setTabIndex('a', NaN) //tagName: "a", defaultValue: "0", setValue: "NaN", resultValue: "0" 10setTabIndex('a', Infinity) //tagName: "a", defaultValue: "0", setValue: "Infinity", resultValue: "0" 11setTabIndex('a', -Infinity) //tagName: "a", defaultValue: "0", setValue: "-Infinity", resultValue: "0" 12setTabIndex('a', true) //tagName: "a", defaultValue: "0", setValue: "true", resultValue: "1" 13setTabIndex('a', false) //tagName: "a", defaultValue: "0", setValue: "false", resultValue: "0" 14setTabIndex('div', 7.5) //tagName: "div", defaultValue: "-1", setValue: "7.5", resultValue: "7" 15setTabIndex('div', 'a') //tagName: "div", defaultValue: "-1", setValue: "a", resultValue: "0" 16setTabIndex('div', NaN) //tagName: "div", defaultValue: "-1", setValue: "NaN", resultValue: "0" 17setTabIndex('div', Infinity) //tagName: "div", defaultValue: "-1", setValue: "Infinity", resultValue: "0" 18setTabIndex('div', -Infinity) //tagName: "div", defaultValue: "-1", setValue: "-Infinity", resultValue: "0" 19setTabIndex('div', true) //tagName: "div", defaultValue: "-1", setValue: "true", resultValue: "1" 20setTabIndex('div', false) //tagName: "div", defaultValue: "-1", setValue: "false", resultValue: "0"

tabIndex は次のようなルールのようです

  • 整数値を受け付ける(小数点以下は切り捨て)
  • 既定値は 0
  • 指定されなかった場合(不正な値が指定された場合?)は既定値になる
  • HTMLDivElement などフォーカスを持たない要素はあらかじめ -1 がセットされている
  • ( true が 1 に false が 0 になるのは JavaScript のルール?)

https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/tabindex

エラーは発生させないのが一般的ですか?

不正な値が指定された場合は既定値があれば既定値になるのが一般的ですか?

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

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

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

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

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

m.ts10806

2020/09/04 14:23

言語、フレームワーク絞ってください
miyabi_takatsuk

2020/09/04 14:59 編集

言語によって、やり方も違えば、そもそもできるかできないかも違ってきます。 JavaScriptでは基本できませんが、 やってやれなくもありません。
guest

回答3

0

ベストアンサー

たとえば 0 から 9 までの整数しか受け入れたくない場合どのような挙動が正解ですか?

正解なんてありません。
そんなものは要件次第です。

例外が扱える言語で、作っている対象がライブラリ等であり、利用者がどのように使うのか予測できない場合は、例外をスローするのが一般的でしょうけど。

投稿2020/09/04 13:15

gentaro

総合スコア8947

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

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

_._

2020/09/05 03:58

> 要件次第 > 例外をスローするのが一般的 ありがとうございます 今回は例外を発生させる方向にしようと思います
guest

0

言語の思想によっても異なりますか?

はい、静的型付けできる言語であれば、「現在の値が 5 で文字列 "a" を代入された場合」はそもそもコンパイルを通らないようにすることが可能ですし、そうすべきです。

投稿2020/09/04 13:16

maisumakun

総合スコア146018

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

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

maisumakun

2020/09/04 13:17

TypeScriptでは「0 から 9 までの整数」を型で表現できますので、不適切な値は(キャストなどで強引に代入しない限り)コンパイル時に除外することが可能です。
_._

2020/09/05 03:58

> そうすべきです。 受け入れないほうがいいんですね ありがとうございます
maisumakun

2020/09/05 04:13

> 受け入れないほうがいいんですね もちろん、「エラー表示で同じ値を再出力する必要がある」など、何らかの形で受け入れる必要がある場面も、存在はします。
guest

0

JavaScriptにて、
整数0〜9の範囲でしか値を受け付けない変数を作りました。

javascript

1{ 2let _n = 1; 3Object.defineProperty( 4 this, 5 'n', 6 { 7 get(){return _n;}, 8 set(newVal){ 9 newVal = Number(newVal); 10 if (isNaN(newVal) || !Number.isInteger(newVal) || newVal < 0 || newVal > 9) throw new RangeError('The value to asign must be number between 0 and 9.'); 11 12 _n = newVal; 13 }, 14 configurable: true, 15 enumerable: true 16 } 17); 18} 19 20n = 2; 21n = 2.5; // エラー 22n = 10; // エラー 23 24console.log(n);

受け付けない値を代入した際は、エラーを吐くようにしています。
ただし、エラーを吐くかどうかとか、初期値に戻すのかとかの違いは、ただ、要件によるので、
どんな場合でも正しい処理なんてものはありません

投稿2020/09/04 14:57

miyabi_takatsuk

総合スコア9555

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

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

_._

2020/09/05 03:59

サンプルコードありがとうございます 例外を発生させる方向にしようと思うので サンプルコードを使わせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問