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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

2495閲覧

入力確認処理などは条件分岐のネストが深いのと条件分岐が浅く長く続くのどっちがマシか

manzyun

総合スコア2244

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2014/09/11 09:50

次のJavascrpitは自分がHTMLで構成された入力フォームの空欄チェックのソースコードなのですが、個人的にネストが深すぎて気になっておりますし、縦にも長くて気になります。

lang

1function isNotInputEmpty(){ 2/* 3 * 空欄があった場合はアラートを表示する。 4 */ 5 var empty_string = '' 6 for each(var element in document.input_form){ 7 if('text' == element.type && '' == element.value){ 8 switch(element.name){ 9 case 'name': 10 empty_string += '「お名前」の欄が入力されていません。'; 11 break; 12 case 'name_kana': 13 empty_string += '「カタカナ」の欄が入力されていません。'; 14 break; 15 case 'mail': 16 empty_string += '「メールアドレス」の欄が入力されていません。'; 17 break; 18 case 'tel': 19 empty_string += '「電話番号」の欄が入力されていません。'; 20 break; 21 case 'postcode': 22 empty_string += '「郵便番号」の欄が入力されていません。'; 23 break; 24 case 'state': 25 empty_string += '「都道府県」の欄が入力されていません。'; 26 break; 27 case 'city': 28 empty_string += '「市区町村」の欄が入力されていません。'; 29 break; 30 case 'addr': 31 empty_string += '「市区町村」の欄が入力されていません。'; 32 break; 33 } 34 35 if(0 > empty_string.length && ('addr' != element.name || 'member_num' != element.name){ 36 enpty_string += '\n'; 37 } 38 } 39 if(0 > empty_string.length){ 40 alert(empty_string); 41 return false; 42 } else { 43 return true; 44 } 45 } 46}

自分なりには
「後から変更があったとしてもコードの編集する量を最小限に抑えれないか」
と考えてこのコードを書きましたが、これとあと1つ処理の順序を変えることが可能だと思いまして、一つ目は

  1. textエレメントをswitchで判別する
  2. caseの中でif空欄判定をする
  3. 空欄であればエラーメッセージを入れる

この処理だとテキストエレメントを取得するときのfor eachが省けて良いと思ったのですが、先に書いたとおり
「後から変更があったとしてもコードの編集する量を最小限に抑えれないか」
という個人的な観点からするとこのコードが一番なのかなと思っているのですが……。

ここで質問です。
Webのフォームに限らず、入力フォームの入力確認処理では似たような処理を書くと思いますが、皆さんはどのように書きますでしょうか、またそのように書いた理由も教えていただけると幸いです。言語は問いません。

P.S.
このソースコードはまだ実行していないため、そもそも動かないかもしれません。その部分のご指摘でも構いません。

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

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

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

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

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

guest

回答3

0

ベストアンサー

自分だったらこうしますかね。
チェックすべき項目をオブジェクトにまとめて、
項目が増えてもそこだけ追加してロジック部分は1行も弄らないで済むようにします。
(動作未確認です)

lang

1function isNotInputEmpty(){ 2 3/* 4 * 空欄があった場合はアラートを表示する。 5 */ 6 var valid_empty = { 7 'name':'お名前', 8 'name_kana':'カタカナ', 9 'mail':'メールアドレス', 10 'tel':'電話番号', 11 'postcode':'郵便番号', 12 'state':'都道府県', 13 'city':'市区町村' 14 }; 15 16 var empty_string = '' 17 for each(var element in document.input_form){ 18 if('text' == element.type && '' == element.value && valid_empty[element.name] !== undefined){ 19 empty_string += '「'+valid_empty[element.name]+'」の欄が入力されていません。\n'; 20 } 21 } 22 23 if(0 > empty_string.length){ 24 alert(empty_string); 25 return false; 26 } else { 27 return true; 28 } 29}

投稿2014/09/11 13:18

kinme

総合スコア843

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

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

manzyun

2014/09/16 09:39

FormをJavascriptで動的に作ってしまうのですね。ここまでは頭が働きませんでした。
guest

0

html を書くときに
<span id="label_1">名前</span><input id="field_1" ...></input>
のような規則をもうける事にするとよいです。
そのようにおけば、HTML の dom を input 要素をさがすと、その input に付随した 画面上のラベルを得る事ができるようになります。
そして input が未入力なときのエラーメッセージの生成にそのラベルを使うようにできるはずです。

このようにしていけば、HTML 上のラベル変更に追従して、エラーメッセージも変化します。

ちなみに rails の Form 生成のツールには、このような仕組みで動作しているものがあります。

投稿2014/09/11 22:37

katoy

総合スコア22324

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

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

manzyun

2014/09/16 09:36

そういえばこのコードを書き加えるHTMLのFormを見ていて違和感があったのは、labelタグがなかったからかもしれません。 確かにこの方法がスマートでJavascriptの得意とするところを存分に活かしているように思いました。
guest

0

本筋と関係ないですが、

if(0 > empty_string.length

empty_string.length が負になることはないのでは?

変数を定数と比較するときは、普通は「変数 関係演算子 定数」と書きます。主語→述語の順というか。
それを逆にしたから、こういう間違いが生じたのだと思います。

投稿2014/09/11 14:24

otn

総合スコア84557

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

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

manzyun

2014/09/16 09:34

本当ですね……。 昔所属していたところでのコード規約を意識していると、こういうミスが多いので、 やはり自然体で書いたほうがいいのかもしれません。 (コード規約の理由としては ```if (hoge == 0) ```と書いたつもりが ```if(hoge = 0```と書いてしまい、hogeに代入されてしまうというトラブルを減らすためだそうです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問