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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Q&A

解決済

5回答

1134閲覧

【考え方】ifの条件をスマートにしたい / 3つの値のバリデーション

nnahito

総合スコア2004

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

1グッド

1クリップ

投稿2019/03/28 08:39

直接コードとは関係ないのですが、考え方について質問させてください。


A, B, C の3つの変数があり、

  1. A, B, C のすべてがundefinedなら無視
  2. A, B, C のいずれかに値が入っていて、かつ、どれか一つにでもundefinedがあればエラー
  3. A, B, C の全てに値があれば問題ない(無視)

というif文を書きたいのですが、普通にそのまま書くと、

javascript

1if ( (A === undefined || B === undefined || C === undefined) && (A !== undefined || B !== undefined || C !== undefined) ) { 2 // error 3} else { 4 // OK 5}

となります。(あれ?あってる……?)
なる気がします。

しかし、このif文はかなり冗長ですし、見やすいと言えません。
この場合、他にどのような書き方が思いつきますでしょうか?
自分では思いつかず……

お知恵をお貸しいただけますと幸いです。
よろしくお願いいたします!

set0gut1👍を押しています

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

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

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

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

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

miyabi-sun

2019/03/28 08:46

PHPにはundefinedはありませんよ
nnahito

2019/03/28 08:51

タグミスでした!ごめんなさい
guest

回答5

0

ベストアンサー

条件を変数として切り出すことで可読性が良くなると思われます。

以下はいかがでしょか。

JavaScript

1// 条件① 2var isAllUndefind = (A === undefined && B === undefined && C === undefined); 3// 条件③ 4var isAllInputed = (A !== undefined && B !== undefined && C !== undefined); 5 6if (isAllInputed || isAllUndefind) { 7 // ①か③に該当する場合 8 // OK 9} else { 10 // ①と③に該当しない→②の場合 11 // error 12}

投稿2019/03/28 08:49

masabunchor

総合スコア97

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

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

nnahito

2019/03/28 08:50

それだあああああああ!!! ありがとうございます!!!
guest

0

  1. A, B, C のすべてがundefinedなら無視
  2. A, B, C のいずれかに値が入っていて、かつ、どれか一つにでもundefinedがあればエラー
  3. A, B, C の全てに値があれば問題ない(無視)

実際のケースではこういう状況は実務ではほぼ出てきません。
1番目は何も処理をしないのですぐに逃げる、
2番目はエラーを投げる、3番目は実際に実行。

この条件ならガード節を使って2秒で実装出来ますし、
そうなっていないなら、3つの引数が全てundefinedにも関わらず処理を継続しなければならない既存ロジックがおかしいケースが殆どです。
上流の方の流れを変えてやるほうが良いでしょう。

JavaScript

1const awesomeFunc = (a, b, c) => { 2 if (a === undefined && b === undefined && c === undefined) return; 3 if (a !== undefined) throw new Error('a is undefined.'); 4 if (b !== undefined) throw new Error('b is undefined.'); 5 if (c !== undefined) throw new Error('c is undefined.'); 6 // main logic 7}

ここからは質問文に沿って動作させなければならない状況に遭遇したとして考えます。

過度なガード節はあまりよろしいものではありません。
あなたは数学の時間に、適当にありとあらゆる公式を連れてきて、
闇雲に計算してみて答えに近いものを解答用紙に書くような答え方をしていましたか?

そうではなく、適切な公式を持ってきて数式を綺麗な形に整形して回答していましたよね?
プログラミングの世界でもそれは同じです。

if文はただし書き、例外を取り扱うようなもので、
何の関数をいつ使うのかは上流の工程でしっかり制御するべきです。
つまり、質問文の状況に陥るのはそもそもプログラミングが下手だからでしょ?という結論になります。


どうしても初期の構想で動作しなければならないのであれば、
最低限、実行する関数と判定関数を分けましょう。

また実行しても良いか悪いかわからないのに、
とりあえず実行してみるなんて、
わけも分からず自爆スイッチを押すバカ職員です。

try-catchの構文は、ネットワーク通信やデータベースへの問い合わせ等、
プログラムのロジックが完璧に動作するにも関わらず、
エラーが帰ってきてやむを得ず挙動を修正しなければならないケースで用いられるべきものです。

関数として用意するならこんな感じ。

JavaScript

1const isPossible = (a, b, c) => { 2 if (a === undefined && b === undefined && c === undefined) return true; 3 if (a !== undefined || b !== undefined && c !== undefined) return false; 4 return true; 5} 6 7const awesomeFunc = (a, b, c) => { 8 // main logic 9}

投稿2019/03/28 09:04

miyabi-sun

総合スコア21158

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

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

0

改善案

条件をシンプルに考えて、「undefinedの数をカウントすれば良い」という結論に達しました。

JavaScript

1function everyOrNone (...array) { 2 let count = 0; 3 4 for (let value of array) { 5 count += value === undefined; 6 } 7 8 return count === 0 || count === array.length; 9} 10 11console.log(everyOrNone()); // true 12console.log(everyOrNone(1, 2, 3)); // true 13console.log(everyOrNone(1, undefined, 3)); // false 14console.log(everyOrNone(undefined, undefined, undefined)); // true

条件式の妥当性

余談ですが、「undefined以外は真」というアルゴリズムには疑問を感じます。
通常、変数には期待する型があるので、例えば、Number型を期待するなら、「Number型以外の型」は全てNGです。
私なら「undefined か否か」ではなく、「Number型か否か」を条件式にします。

JavaScript

1typeof a === "number"

Re: nnahito さん

投稿2019/03/28 12:33

think49

総合スコア18162

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

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

0

自分が考えたのは、こんな方法です。

javascript

1// まず、それぞれがundefinedかを抽出する 2const aUndef = A === undefined, bUndef = B === undefined, cUndef = C === undefined; 3 4// 「undefinedかどうか」がすべて等しいなら 5if(aUndef === bUndef && aUndef === cUndef){ 6 // 略 7}

投稿2019/03/28 08:57

maisumakun

総合スコア145183

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

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

0

every メソッドを使ってみました。

js

1if ( !( [A,B,C].every( x => x===undefined ) || [A,B,C].every( x => x !== undefined ) ) ){

Array.prototype.every() - JavaScript | MDN

投稿2019/03/28 08:51

Lhankor_Mhy

総合スコア36074

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

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

Lhankor_Mhy

2019/03/28 08:52

あ、ご解決でしたか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問