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

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

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

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Q&A

解決済

5回答

6347閲覧

null 四則演算 言語仕様

Yoshy

総合スコア15

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

0グッド

0クリップ

投稿2018/12/03 06:10

編集2018/12/03 08:38

nullを含む計算の理想仕様について (皆さんの考えについて意見交換をさせてください)
※web業務システム開発で使用する前提で意見交換させてください。

<質問背景(イメージ)>
とある業務システムにて、ユーザー側で簡単な四則演算を行えるシステムがあるとする。

そのシステムで例えば給与計算の四則演算の処理を下記のように記載するとする。
[基本給1] + [手当1] + [手当2] + [手当3] = [合計金額]

この場合、
200000 + 10000 + 5000 + 800 = 215800
となるとわかりやすいのですが、null(値なし / 空)が含まれる場合を考える。

一応期待としては、
200000 + 10000 + 5000 + null = 215000
となることがよいと考えている。
ですが、他のよく使われているプログラム言語ではアベンドしたり、nullになったり挙動はさまざま。

そして、四則演算に範囲を広げて考えると、少し悩ましい。
下記「本システムの挙動(予定)」のような挙動を仕様としてユーザーに公開しようとしている。

言語(例)null + 3null - 3null * 3null / 3null + null
JavaNullPointerExceptionNullPointerExceptionNullPointerExceptionNullPointerExceptionNullPointerException
javascript3-3000
SQL(Oracle)nullnullnullnullnull
Excel00000
本システムの挙動(予定)3-3nullnullnull

<補足>
1)本システムはプロダクトファーストで提供するものであり「ユーザーの仕様に拠る」「要件に拠る」「人による」などの回答は今回は求めておりません。
(計算する対象によって要求が変わることは理解しています。どの方が便利そうと考えるかで意見を頂けると助かります)
2)「以前のプロジェクトではこうでした」という意見よりかは、「こうあるべきだ」「以前のプロジェクトはこうだったが、不便だったのでこうしてほしい」
「以前のプロジェクトはこうであり、こういうよいところがあったので、この仕様がはやりよいと思う」
等の意見があると嬉しいです。
3) 「nvl」や「a == null ? 0 :a;」等を各プログラム言語で書けばいかようにでも要件に合う計算ができることはわかっていますが、
標準挙動として頻度の高い利用方法をデフォルトとしたいイメージです。


不明点や質問の意図について、なにかあればお知らせください。

nullの四則演算に疑問をもった方々ふくめ
様々な方と意見交換できると嬉しいです。


<20181203 17:19追記>
**
「課題が明確ではない」「問題・課題が含まれていない」と指摘を受けたため、補足および、下記のように質問を変えます。
**

<補足>
今回提供するシステムは会社で使用する業務システムを簡単に構築できるサービスです。
オンライン版エクセル(業務特化)。
null(空欄)は許容して計算をさせたく、空欄があるたびに例外処理を記載したくない意図があります。
そのため、[基本給1] + [手当1] + [手当2] + [手当3]を nvl([基本給1],0) + nvl([手当1],0) + nvl([手当2],0) + nvl([手当3],0)
などと記載したくない意図があります。

<質問内容を明確にします>
現状下記挙動がよいかなと考えております。
null(ブランク)が含まれる足し算を行いたいことがニーズです。
(ブランクを不可 / エラーチェックにはしない前提でお考え願います。「明示的な0」と「指定しない」を区別したいなどの背景があるものという前提で質問させてください。)

そのうえで、下記挙動の場合、

言語(例)null + 3null - 3null * 3null / 3null + null
本システムの挙動(予定)3-3nullnullnull

を考えております。

nullを「0と解釈するケース」と「nullと解釈するケース」が混ざっていることに違和感がありつつも、
実際、
[ 3 ] + [ ] + [ 5 ] = [ 8 ]
としたいが
[ ] + [ ] + [ ] = [ 0 ]
は違和感があり、
[ ] + [ ] + [ ] = [ ]
としたいニーズがあります。


**<明確な質問>
他のプログラム言語のいずれかで上記と同じポリシーの言語仕様のプログラミング言語(またはツール等)をご存知の方いましたら教えてください。
**

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

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

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

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

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

guest

回答5

0

そのシステムに於いて「なぜNull等の値が発生しうるのか」を考えないと意味がないのでは?

真っ当な考えとしては、「ユーザーに数値の入力を求め、空白を許さない」でしょう。つまり、「そのシステムに於いて何故そうできないのか?」を考えないと意味がないと言う事です。

投稿2018/12/03 07:00

otn

総合スコア84423

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

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

Yoshy

2018/12/03 12:19

私もnullを極力避けたい人間の一人です。 今回はnull(ブランク入力)を許容する必要がある場合の考慮として質問させて頂いております。
pepperleaf

2018/12/03 12:22

私も「そのシステムに於いて何故そうできないのか?」 が大事で、その結果、どうすべきかじゃないかと思います。 そういう意味で、不適切な設問じゃないかと思います。 (マイナス、付けて無いですが)
otn

2018/12/03 13:51

> 回はnull(ブランク入力)を許容する必要がある場合の考慮 それは質問に書いてあるので分かってますが、その理由を考えるべき(その理由による)というのが回答です。 例えば、「入力項目がたくさんあり、多くの場合はゼロを入力すべきだが、面倒くさいのを何とかしたい」という事情で空を認めたのであれば、空はゼロとみなすべきなのは自明です。
otn

2018/12/03 13:51

と、見直すと、質問が全くの別物に変わってますね。
guest

0

(ゼロ除算という、数学時点でも起きるイレギュラーは別として)四則演算の中でnullを含む演算の挙動が違ってくる意図がわかりません。

一貫して0とみなす、あるいは一貫してnullを返す、という方が論理的にスッキリするかと思います。

投稿2018/12/03 06:37

maisumakun

総合スコア145121

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

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

Yoshy

2018/12/03 08:40

ありがとうございます。 本製品ポリシーも当初はmaisumakun様と同じ発想でした。 しかし検討を重ねていくと [ 3 ] + [ ] + [ 5 ] = [ 8 ] としたいが [ ] + [ ] + [ ] = [ 0 ] は違和感があり、 [ ] + [ ] + [ ] = [ ] としたいニーズが強いことに気づき、 整理したところ、質問の通りとなりました。 他のプログラム言語で似たようなポリシーになっている言語がありそうなものだなと思い、 質問をさせて頂いております。 もしご存知のものがあればお知らせください。
guest

0

ベストアンサー

私も質問者さんと同じような機能を昔作ったことがあります。
ユーザの保持している金融商品を現在の値で計算させるための計算式(マクロ)を入力できる、的な機能だったと思います。

その際、変数がnullの場合の扱いは、結果も一貫してエラー(言語例Javaのイメージ)としました。
理由は、実行時に変数がユーザの想定しない内容になった場合に気付けず言語仕様のせいで損失が起きた、
という責任を回避する意味もありました。
ただし、それだと使いにくいので、エラーとする言語仕様にした上で、
「変数の値がエラーの時、指定した値を返す関数」も実装し、
変数A + NZ(変数B) などと入力したとき、Aがnullになった際は結果はエラー、
Bがnullになった場合は0として扱う、
という具合の仕様にしました。
リリース後、特にトラブルや問題は起きませんでした。
ご参考まで。


[ ] + [ ] + [ ] = [ 0 ]
は違和感があり、
[ ] + [ ] + [ ] = [ ]
としたいニーズが強い

このお話は分かりますが、
これは言語仕様とは別のニーズであって、
よく分析するともしかして
「結果が0なら空白で表示したい」
な、だけではないでしょうか。

なので、結果が0なら結果を表示しない関数や、
そういうオプション設定を実装すればよいのでは?

投稿2018/12/03 08:11

編集2018/12/04 06:39
taka-saan

総合スコア665

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

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

Yoshy

2018/12/03 12:18

ありがとうございます。 質問の意図を理解して頂きありがとうございます。 なるほどnvlのようなものを実装するパターンですね。 「実行時に変数がユーザの想定しない内容になった場合に気付けず言語仕様のせいで損失が起きた、 という責任を回避する意味もありました。」 このケースは私も考えましたが、nullになったときは気づけるけど誤った値の時は気づけない。。。 と片手落ちなことを考えると、どうもその目的のみのために言語仕様としてよくある計算を「エラーとする言語仕様」とするのはどうかなと考えました。 ブランク + 3 = 3 でも ブランク + ブランク =ブランク となるような言語は無いものですかね?思想の参考にしたく。 もしご存じあればお願い致します。
taka-saan

2018/12/04 06:43

> 思想の参考にしたく。 参考になるかわかりませんが、 ゼロで除算すると普通は止まりますが、 PHPは「ワーニングを出したうえで」0として計算します。 簡便性と安全性の「両方」を取った結果(思想?)ではないかと思います。
taka-saan

2018/12/04 06:48

(補足)正確には0じゃなくてfalseだし、最新のバージョンでは許されなくなりましたが。
guest

0

質問を読むと何やら言語仕様がどうとか難しそうなことを書いていますが、要するに 無意味に null を許容する DB の数値を PHP と JavaScript で同じように扱いたいということだろうと思います。

DB で null を許容しない、で片付く問題に思えて仕方ありません。

投稿2018/12/03 07:15

Zuishin

総合スコア28656

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

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

Yoshy

2018/12/03 12:13

ありがとうございます。 私もnullを極力避けたい人間の一人です。 今回はnull(ブランク入力)を許容する必要がある場合の考慮として質問させて頂いております。
guest

0

質問の意図がわかりませんが、nullには何をしてもnullが正しいと思います
nullは異常値ですので必要に応じて例外処理をいれればよいでしょう

投稿2018/12/03 06:32

yambejp

総合スコア114574

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

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

Yoshy

2018/12/03 08:35

回答ありがとうございます。 はい、プログラム言語によってはその通りだと思います。 javascriptなんかだと 3 + null + 4 = 7となります。 言語によります。 今回は、質問の通りの挙動にしたいと考えているが、 類似の考えを持った「プログラム言語」や「ツール」や同じことを考えた方がいないかを確認したく質問しました。
maisumakun

2018/12/03 08:42

結局、「解決したい課題」が何なのか伝わってきません。 仕様を決めてしまったのであればそれで実装すればいい話ですし、他のツールと違ったとしても「そのほうが便利」という明確な理由があればそれでかまわないでしょう。「類似の考え方」のものを探したところで、直接なにかの役に立つというわけでもないと思いますが。
退会済みユーザー

退会済みユーザー

2018/12/03 09:19

そもそも「ユーザーの仕様に拠るはいけない」で回答を全否定だけどね
Yoshy

2018/12/03 12:25

ありがとうございます。 私は [ ] + [ ] - [ 5 ] = [ -5 ] [ 3 ] + [ ] + [ 5 ] = [ 8 ] [ ] + [ ] + [ ] = [ ] の仕様がよいと考えましたが、他の言語を見ても同じ思想のものがひとつも見つからずにいたので、 便利さ・思想としてよくないのかなと思ってしまいました。 「こういうケースで使いづらくない?」や逆に「この言語と同じ思想だね」というものがあれば、 そこをヒントに四則演算のルールとしての妥当性?判断ができると考えました。 --- >asahina1979 ありがとうございます。 「ユーザーの仕様に拠る」という回答がたくさん来ると思ったので事前に記載しました。
退会済みユーザー

退会済みユーザー

2018/12/04 13:48

開発側もユーザー(言語を利用する意味で) 利用者もユーザー(システムを利用する意味で) なんで「言語の仕様」を否定すると「ユーザーの仕様」になるんですけどね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問