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

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

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

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

オブジェクト指向

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

Q&A

解決済

3回答

781閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

オブジェクト指向

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

0グッド

1クリップ

投稿2018/06/02 13:30

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

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

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

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

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

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

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

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

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

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

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

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

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

m.ts10806

2018/06/02 23:16

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

回答3

0

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

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

投稿2018/06/03 01:23

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2018/06/17 11:56

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

0

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

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

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

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

投稿2018/06/05 06:10

編集2018/06/05 06:11
g_uo

総合スコア212

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

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

退会済みユーザー

退会済みユーザー

2018/06/17 11:57

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

0

ベストアンサー

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

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

投稿2018/06/05 02:32

f_horizon

総合スコア163

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

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

退会済みユーザー

退会済みユーザー

2018/06/17 11:53

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問