WEBVTT

1
00:00:00.000 --> 00:00:00.971
こんにちは。

2
00:00:00.971 --> 00:00:06.635
今回はジャバスクリプトのナンバー・イズセーフインテジャーを紹介します。

3
00:00:06.635 --> 00:00:11.653
これは、渡された値が安全な整数かどうかを判定するメソッドです。

4
00:00:11.653 --> 00:00:17.317
在庫数や累計件数を扱うとき、値が数値であるだけでは十分ではありません。

5
00:00:17.317 --> 00:00:24.762
小数が混ざっていないか、整数を正確に区別できる範囲に収まっているかも確認する必要があります。

6
00:00:24.762 --> 00:00:34.634
この判定を、数量を受け取る入口と、数量を計算した直後に置くことで、扱える範囲を超えたデータを後続の処理へ渡さずに済みます。

7
00:00:34.634 --> 00:00:38.194
ここでいう安全は、数値表現に関する用語です。

8
00:00:38.194 --> 00:00:44.668
アクセス権や業務ルールまで検証する意味ではない点も、最初に押さえておきましょう。

9
00:00:44.668 --> 00:00:45.810
まず動作環境です。

10
00:00:45.810 --> 00:00:52.158
ナンバー・イズセーフインテジャーはブラウザー専用の機能ではなく、ジャバスクリプトの標準の仕組みです。

11
00:00:52.158 --> 00:00:56.093
二千十五年九月以降のブラウザーで広く利用できるとされており、現在のクローム、

12
00:00:56.093 --> 00:01:00.028
エッジ、ファイアフォックス、サファリで使えます。

13
00:01:00.028 --> 00:01:04.852
ノード・ジェイエスでも動作し、追加のパッケージやインポートは必要ありません。

14
00:01:04.852 --> 00:01:08.914
記事の実行手順はノード・ジェイエス二十二以降を対象としています。

15
00:01:08.914 --> 00:01:16.404
古いブラウザーや組み込みのウェブビューへ配布する場合は、タイプオブで関数として存在するかを確認してから使ってください。

16
00:01:16.404 --> 00:01:20.720
通信も画面操作も含まないので、同じコードをどちらの環境でも試せます。

17
00:01:20.720 --> 00:01:22.635
基本の書き方を見ましょう。

18
00:01:22.635 --> 00:01:27.645
ナンバー・イズセーフインテジャーに、判定したい値を一つ渡すだけです。

19
00:01:27.645 --> 00:01:33.539
戻り値は真偽値で、数値型で安全な整数ならトゥルー、それ以外はフォルスを返します。

20
00:01:33.539 --> 00:01:37.222
重要なのは、文字列を数値へ自動変換しないことです。

21
00:01:37.222 --> 00:01:41.200
数字の形をした文字列トゥエルブも、フォルスになります。

22
00:01:41.200 --> 00:01:46.505
引数を省略した場合はアンディファインドの判定になり、やはりフォルスです。

23
00:01:46.505 --> 00:01:50.630
ヌルや小数、エヌエーエヌ、インフィニティもフォルスです。

24
00:01:50.630 --> 00:01:57.408
変換が必要な場合は、判定とは分けて、どの表記を受け付けるかを先に決めてから変換してください。

25
00:01:57.408 --> 00:02:00.060
この厳密さが、入力検証で役立ちます。

26
00:02:00.060 --> 00:02:02.767
安全な整数の範囲を確認します。

27
00:02:02.767 --> 00:02:07.460
下限はマイナス九千七兆千九百九十二億五千四百七十四万九百九十一、上限はプラスの同じ値で、

28
00:02:07.460 --> 00:02:12.153
両端を含みます。

29
00:02:12.153 --> 00:02:21.719
境界は、ナンバー・マックスセーフインテジャーと、ナンバー・ミンセーフインテジャーという定数で参照できます。

30
00:02:21.719 --> 00:02:24.246
なぜ上限があるのでしょうか。

31
00:02:24.246 --> 00:02:30.202
ジャバスクリプトの通常の数値型は、倍精度浮動小数点形式を使います。

32
00:02:30.202 --> 00:02:35.797
整数が大きくなりすぎると、隣り合う整数を区別できなくなります。

33
00:02:35.797 --> 00:02:42.114
数値として表現できる大きさの上限と、整数を安全に扱える上限は別物です。

34
00:02:42.114 --> 00:02:50.056
負数も安全な整数になり得るため、在庫数ならゼロ以上という条件は別に加える必要があります。

35
00:02:50.056 --> 00:02:52.443
判定の例をもう少し見ましょう。

36
00:02:52.443 --> 00:02:57.534
スリー・ドット・ゼロは、数値としては三と同じなのでトゥルーです。

37
00:02:57.534 --> 00:03:02.307
つまり、小数点を含む表記かどうかを調べる機能ではありません。

38
00:03:02.307 --> 00:03:07.876
一方、小数部分を持つ値や、エヌエーエヌ、インフィニティはフォルスです。

39
00:03:07.876 --> 00:03:12.172
上限を超えた九千七兆を超える整数もフォルスになります。

40
00:03:12.172 --> 00:03:19.809
ここで大切なのは、このメソッドが見るのは値そのものであって、元の文字列表記ではないという点です。

41
00:03:19.809 --> 00:03:23.469
表記ではなく数値として安全かどうかを判定する。

42
00:03:23.469 --> 00:03:27.606
この性質は、後で説明する丸めの限界にもつながります。

43
00:03:27.606 --> 00:03:35.084
まずは、整数、小数、文字列、特殊な値で結果がどう変わるかを、コンソールで確かめてみてください。

44
00:03:35.084 --> 00:03:36.505
ここから実例です。

45
00:03:36.505 --> 00:03:41.083
現在の数量と追加数量を受け取り、合計を返す関数を作ります。

46
00:03:41.083 --> 00:03:45.188
最初に、入力の両方が安全な整数かどうかを確認します。

47
00:03:45.188 --> 00:03:49.292
満たさなければ、タイプエラーを投げて処理を止めます。

48
00:03:49.292 --> 00:03:54.817
次に、数量はゼロ以上という業務ルールを、レンジエラーで別に確認します。

49
00:03:54.817 --> 00:03:59.711
安全な整数であることと、業務上正しいことは別の条件だからです。

50
00:03:59.711 --> 00:04:09.973
記事のサンプルでは、整数の条件を満たさない場合にタイプエラー、ゼロ以上や合計の範囲に違反した場合にレンジエラーを使い分けています。

51
00:04:09.973 --> 00:04:13.998
この分類はサンプル関数の設計であり、メソッド自体は不適切な値でも例外を出さず、

52
00:04:13.998 --> 00:04:18.024
フォルスを返すだけです。

53
00:04:18.024 --> 00:04:21.119
入力だけでなく、計算結果も検証します。

54
00:04:21.119 --> 00:04:26.333
入力が両方とも安全な整数でも、合計が上限を超えることがあります。

55
00:04:26.333 --> 00:04:33.338
そこで加算した直後に、合計に対しても同じ判定を行い、範囲外ならレンジエラーを投げます。

56
00:04:33.338 --> 00:04:35.456
期待出力を確認しましょう。

57
00:04:35.456 --> 00:04:40.507
通常の百二十足す三十は百五十、ゼロ足すゼロはゼロで成功します。

58
00:04:40.507 --> 00:04:47.675
文字列と小数はタイプエラー、負数はレンジエラー、上限に一を足すケースもレンジエラーです。

59
00:04:47.675 --> 00:04:53.703
例外をケースごとに捕捉しているので、失敗例があっても次のケースへ進めます。

60
00:04:53.703 --> 00:05:00.220
入力検証だけで計算結果まで保証できるわけではない、という点がこの実例の中心です。

61
00:05:00.220 --> 00:05:01.955
精度低下の具体例です。

62
00:05:01.955 --> 00:05:08.108
上限の次の値と、さらに一を足した値を比べてみると、等しいという結果になります。

63
00:05:08.108 --> 00:05:13.472
右辺の整数を正確に表現できず、左辺と同じ数値になってしまうためです。

64
00:05:13.472 --> 00:05:17.417
つまりこの範囲では、隣の整数同士を区別できません。

65
00:05:17.417 --> 00:05:23.254
だからこそ、その値をイズセーフインテジャーで判定するとフォルスになります。

66
00:05:23.254 --> 00:05:30.511
識別子のような大きな数字を数値型で扱うと、別々の値が同じものとして処理される危険があります。

67
00:05:30.511 --> 00:05:35.007
大きな識別子は文字列のまま保持し、大きな整数の計算が本当に必要な場合は、

68
00:05:35.007 --> 00:05:39.504
ビッグイントなどの採用を検討してください。

69
00:05:39.504 --> 00:05:43.448
数値に変換してからでは、失われた情報は戻りません。

70
00:05:43.448 --> 00:05:45.934
判定の限界も知っておきましょう。

71
00:05:45.934 --> 00:05:52.615
たとえば、五にごく小さな小数部分が付いたリテラルは、数値になる段階で五に丸められます。

72
00:05:52.615 --> 00:05:58.209
メソッドが受け取るのは丸めた後の値なので、判定結果はトゥルーになります。

73
00:05:58.209 --> 00:06:02.093
元の表記に小数部分があったことは、判断できません。

74
00:06:02.093 --> 00:06:05.046
すでに起きた丸めは検出できないのです。

75
00:06:05.046 --> 00:06:12.504
そのため、外部データの正確さを保証するには、判定だけでなく受け渡し形式も設計する必要があります。

76
00:06:12.504 --> 00:06:19.496
文字列として受け取って検証するのか、最初から数値で受け取るのかを決めておくことが大切です。

77
00:06:19.496 --> 00:06:24.468
判定は最後の砦ではなく、境界のチェックの一つだと考えてください。

78
00:06:24.468 --> 00:06:27.746
フォーム入力との関係も注意が必要です。

79
00:06:27.746 --> 00:06:30.506
フォームの値は通常、文字列です。

80
00:06:30.506 --> 00:06:36.371
変換を許可する場合でも、どの表記を受け付けるかを先に決めてください。

81
00:06:36.371 --> 00:06:41.029
たとえば、空文字をナンバーで変換するとゼロになります。

82
00:06:41.029 --> 00:06:48.102
変換後の値だけを判定すると、空欄を数量ゼロとして受け入れてしまう可能性があります。

83
00:06:48.102 --> 00:06:58.797
記事の例では、関数が受け付ける値を最初から数値型に限定し、文字列からの変換規則を数量計算の中へ持ち込まない設計にしています。

84
00:06:58.797 --> 00:07:03.800
変換するなら、空欄や空白だけの入力を先に弾く、受け付ける形式を限定するといった前処理を、

85
00:07:03.800 --> 00:07:08.803
判定とは別に用意しましょう。

86
00:07:08.803 --> 00:07:13.288
変換と判定を分けることが、安全な設計につながります。

87
00:07:13.288 --> 00:07:15.055
活用場面とまとめです。

88
00:07:15.055 --> 00:07:24.211
この判定は、在庫の加算、処理済み件数の集計、整数単位の使用量管理など、通常の数値型で数量を扱う境界に適しています。

89
00:07:24.211 --> 00:07:31.118
画面側で確認すると入力ミスを早く伝えられますが、受信側でも同じ条件を検証してください。

90
00:07:31.118 --> 00:07:38.507
実務では、安全な整数の上限に加えて、業務上の最大値を設けると、エラーを理解しやすくできます。

91
00:07:38.507 --> 00:07:44.610
たとえば一回の追加数量を千以下に制限するなら、その条件も計算前に確認します。

92
00:07:44.610 --> 00:07:46.377
最後に点検の観点です。

93
00:07:46.377 --> 00:07:55.372
数量を受け取る箇所を一つ選び、型、整数の範囲、業務の範囲、計算結果の確認がそろっているかを確かめてみてください。

94
00:07:55.372 --> 00:07:56.818
お疲れさまでした。

95
00:07:56.818 --> 00:08:05.492
イズセーフインテジャーは、安全な整数かどうかを、入力と結果の両方で確かめるメソッドだと覚えておいてください。
