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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

2945閲覧

重複するチェックをするべきかどうか

Batoh33789

総合スコア136

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/09 00:58

お世話になります。

下記のような状況のときに、
重複するチェックをするべきかどうか
で悩んでおります。

例えば、パスワードの登録時の簡単なチェッカーを作る際、
1.古いパスワードが入力されているかどうか
2.新しいパスワードが入力されているかどうか
3.新しいパスワードの再入力されているかどうか
4.古いパスワードとDBに保持しているパスワードが一致するかどうか
5.新しいパスワードと再入力されたパスワードが一致するかどうか
のような手順になるかと思います。

この4、5の一致チェックの時に、再度nullチェックをかけるかどうか、です。

また、なぜこういった考えになったかにつきましては
再度nullチェックをかけた方がリスク回避にもなり、必要そうだ、とは思うのですが
どうしても冗長な処理になってしまうので、一般的にはどういった処理にするのが
好ましいのかわからず質問させて頂きました。

お手数おかけ致しますが、よろしくお願い申し上げます。

以下コードです。

java

1public class PasswordChecker{ 2 public String getInputParamErrorMsg(PasswordParam inputParam, String db){ 3 final StringBuilder result = new StringBuilder(); 4 // 未入力チェック 5 result.append(getInvalidInputParam(inputParam)); 6 // 一致チェック 7 result.append(getNonconformityParam(inputParam, db)); 8 return result.toString(); 9 } 10 11 private String getInvalidInputParam(PasswordParam inputParam){ 12 final StringBuilder result = new StringBuilder(); 13 if(isInvalid(inputParam.oldPassword)){ 14 result.append("古いパスワードを入力して下さい。"); 15 } 16 if(isInvalid(inputParam.newPassword)){ 17 result.append("新しいパスワードを入力して下さい。"); 18 } 19 if(isInvalid(inputParam.rePassword)){ 20 result.append("新しいパスワードを再入力して下さい。"); 21 } 22 return result.toString(); 23 } 24 25 private String getNonconformityParam(PasswordParam inputParam, String db){ 26 final StringBuilder result = new StringBuilder(); 27 if(isMatch(inputParam.oldPassword, db)){ 28 result.append("古いパスワードが一致しません\n"); 29 } 30 if(isMatch(inputParam.newPassword, inputParam.rePassword)){ 31 result.append("入力された新しいパスワードが一致しません。\n"); 32 } 33 return result.toString(); 34 } 35 36 private boolean isInvalid(String param){ 37 if(param != null && param.length() != 0){ 38 return false; 39 } 40 return true; 41 } 42 43 private boolean isMatch(String basic, String target){ 44 // 下記個人的ぼやきです。 45 // このメソッドだけでみると下記チェックは必須だが、流れからすると不要になるように思える。 46 // 多人数プロジェクトの場合は、必須になるような気もするので、やはり必要? 47 // 他の人から、ここでもnullチェックしている理由がわからない、となったらそれはそれで混乱を招くような気もする。 48 if(isInvalid(basic)){ 49 return false; 50 } 51 if(basic.equals(target)){ 52 return true; 53 } 54 return false; 55 } 56}

java

1public class PasswordParam { 2 public String oldPassword; 3 public String newPassword; 4 public String rePassword; 5}

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

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

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

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

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

guest

回答3

0

結論から言えば、今回の実装に関しては必要だと思います。
nullチェックを重複して行うかどうかは、「実行する段階でnullでないことが保証されているかどうか?」がポイントです。

  • nullでない場合のみにisMatch()が実行される

→isMatch()実行時にはnullでないことが保証されているので不要

  • nullの場合にもisMatch()が実行される

→isMtach()実行時にnullである可能性があるので、必要

質問のコードの場合、未入力チェックと一致チェックが独立しており、未入力チェックに引っかかった場合でも一致チェックが行われます。
isMatch()実行時にnullである可能性があるため、チェックする必要があると思います。

投稿2016/11/09 01:45

KaedeKazane

総合スコア408

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

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

Batoh33789

2016/11/09 02:09

ご助言有難うございます。 仰る通り、提示したコードでは、isMatchメソッドでnullチェックをしないと例外が発生します。 提示したコードがあまり良くなく申し訳ありませんでした。
guest

0

ベストアンサー

自分的には、関数を呼ぶ時のルールの決めの問題だと思います。
チェック処理が冗長な処理になるのはしょうがないような気がします。

呼び出し側で未入力等のDBアクセスの必要が無い単項目チェックがされている前提の場合は、
NULLチェックは必要ないです。

呼び出し側でのチェックの保障がない場合は、NULLのチェックをしないといけないと思います。

ライブラリとして他のシステムに提供する場合等は、
常にチェックするかあえて例外が発生するような実装にしますね。

個人的には、質問の例だと入力が空の単項目チェックは予備元ですべきだと思いますが。。。
後チェックのメソッドも一つで良い気がします。複数に別けるメリットが無い気がします。

投稿2016/11/09 01:35

himakuma

総合スコア952

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

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

Batoh33789

2016/11/09 02:02

ご助言有難うございます。 仰る通り、ルール決めをどうするか、という問題ですね。 また、ご指摘の通り、チェッカーメソッドを二つ用意する必要がないコードになってしまってますね・・。 提示したコードの例があまり良くなく、申し訳ありませんでした。
guest

0

どういった場合、4,5のタイミングでデータがnullになっているのでしょうか。
nullになる根拠があれば必要ですし、根拠がなければ冗長な処理だと思います。
また、nullチェックを入れることにより、予期せぬ動作をするといったリスクもありますし、
テスト工数も増えてしまいます。

投稿2016/11/09 01:31

aki178

総合スコア164

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

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

Batoh33789

2016/11/09 01:42

提示したコードでは、nullになりません。 ただテスト工数が増えるというのは盲点でした。 ご助言有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問