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

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

ただいまの
回答率

90.83%

  • C#

    6026questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • オブジェクト指向

    255questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

【設計】入力値チェック・バリデーション

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 156

drm_impl

score 2

オブジェクト指向を学んでいる者です。
基礎的な質問で申し訳ありませんが、設計について悩んでいて、相談したいです。

みなさんは、設定値のバリデーションは処理中のどこで行っていますか?
自分は、GUIアプリケーションなどでは、入力された時に入力値チェックを行います。
一方で、DataBaseや外部ファイルの値を取得して動作するアプリケーションの場合、どこでその値をチェックするか悩んでいます。

具体的には、
1 外部ファイルやDataBaseから設定値を取得:get~~()
2 設定値を使用するクラスへ値をセット(初期化):init()
3 セットされた設定値を使用し、処理を実行:execute~~()
(get***()などはメソッド名の例です)

この流れの時、
②の値をセットする時にバリデーションをするか
③のその値を使用する時にバリデーションをするか
と考えていますが、みなさんはどちらのタイミングで行いますか?

悩んでいる理由としては、
値は基本的に「使用するクラス」がチェックすべき、ということを教わったことがあるのですが、
ではチェックするタイミングとしては、
セットされた時?使用する時?と悩んだ次第です。

自分としては、それぞれの対応のメリットとして以下のようなものを考えています。
②でチェックする場合は、エラーなら初期化の時点で終わるので以降の処理が無駄にならなくて済む。
③でチェックする場合は、使用する時にチェックしているので、確実にその値が妥当だと明示できる。

もしくは、両方のタイミングで行うべきなのでしょうか?
しかしそれは冗長な気もして…質問させていただきました。

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/03 08:16

    具体的なコード例を挙げられた方が的確な回答を得られると思います。また、入力チェックの結果を「どのタイミングで」「どのように出したいか」によっても違ってくるように思います。そういった要件部分も具体的に記載してください。

    キャンセル

回答 3

+1

入力時のチェックは、範囲とか妥当性などきっちりしたチェックを行って、
使用するときにチェックするのはあくまでも実行に際して例外が出ないか、実行に破綻が出ないかという程度のチェックしかしないですね

そもそも、入力時以外のチェックって、それでダメでたときにどーすんの?という話になると思いますが、ダメなときにそのレコードを削除するのか、ダメな項目をテキトーな値に置き換えるのか、ダメな値のまま通すのか、そこらへんの仕様によってやり方がかわりますわな。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/17 20:56

    ログインできず、返答が遅れて申し訳ありません。

    > そもそも、入力時以外のチェックって、それでダメでたときにどーすんの?という話になると思いますが、
    ご指摘の通りですね。
    そのチェックで不正になる場合、以降の処理はまったくできない、ということであれば早々にチェックする必要がありそうです。
    一方で、デフォルト値などに変更可能ならば、直前でも構わないように思えます。
    回答ありがとうございました。

    キャンセル

checkベストアンサー

0

「チェックは使用側にお任せ」というようにして、できるだけ疎結合を意識していますね。その方が問題発生時の切り分けもスムーズな気がします。
また、その後の処理の無駄がないように、使用側のチェックはできるだけ早い段階で行っています。

同じデータ群でも、画面や機能によってチェック方法は異なる(ようにしたい)場合もあると思いますしね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/17 20:53

    ログインできず、返答が遅れて申し訳ありません。
    疎結合、というのは確かにその通りですね。
    再利用や改修のしやすさも考え、疎結合を意識しながら作る、ただしできるだけ早いタイミングでチェックすることで無駄を少なくする、というのが腑に落ちました。
    ありがとうございました!

    キャンセル

0

こんにちは。私もよく悩みます。

質問文の範囲で考えると、2 のタイミングが妥当かなと考えます。
異常値で初期化されたクラスが正常に動作するとは思えませんので、3のメソッドがコールされた度に値の確認してエラーを通知(または例外のスロー)を行うのは現実的でないと思います。

y_waiwaiさんの回答と一部重複します、申し訳ありません。
こういう話をさんざん議論して結局『で、ダメなときどうすんの?』の一言で、最初に戻るパターンはままあると思います。
なんのためにチェックするのか("単にクラスがそのレンジで値を必要としている", "データソースの破損を確認したい", "異常値の場合は処理をパスしたい"とか)がもう少し明確になれば、具体的な回答を得られると思います。

極論ですが...
データソースに異常値が存在すること自体が異常なのだから、そのデータソースにデータを入れた側に問題がある!だから受け側ではチェックしません!てのも一つです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/17 20:57

    ログインできず、返答が遅れて申し訳ありません。

    ご意見ありがとうございます。
    チェックを何のために行うのか、その後どうするのか?という部分を意識して、最適なタイミングを考える必要がありそうですね。
    回答ありがとうございました!

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6026questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • オブジェクト指向

    255questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。