• 締切済み

オブジェクト指向で入力値チェック

Webサービスの会員登録とか、CSVを手入力したものをインポートする場合について教えてください。 入力について一定のルールを満たす必要があります。 その場合に入力値チェックをするためにどのようにクラスを作ればいいか悩んでいます。 例えば ・氏名 ・メールアドレス ・パスワード ・年齢 のような情報をチェックするとして、初めて登録する際と一度保存したデータを再利用する際はチェック項目が違うように思えます。 そもそも一度チェックした値なので再利用の際はチェックの必要はかなり限定的でいいと考えています。 となると、作成するクラスは一時的な保持クラスを作って、そこでデータ型とかルールをチェックするようにすればいいのでしょうか。 それともデータクラスに入れる前に正規表現などでチェックしてそのまま放り込めばいいのでしょうか。 UserCreate ←これに一時的に入力データを入れる User ←チェックしたらこっちに入れて保存する Validator ←これがチェック用クラス ただこういう一時的な保持クラスは無駄な感じもして悩んでいます。 ちょっとうまく質問も書けないのですが、なんとかヒントを頂けないでしょうか。 よろしくお願いします。

noname#212927
noname#212927
  • Java
  • 回答数3
  • ありがとう数1

みんなの回答

  • weavaest
  • ベストアンサー率15% (157/1020)
回答No.3

部分的に抜粋して、こんなクラス、あんなクラスって話をしても、それでもいいけど違うやり方もできる程度の答えしか得られないと思います。 「UserCreate」「User」「Validator」の役割を書かれてますが、他にどんなクラスがあって、どう関わってくるのかが重要だと思います。Webサービスの全体像や他のクラスの粒度も考慮して、ユーザーを管理する部分を設計すす必要がると思いますから、こういったサイトでの質問は難しいと思います。 例えば、Varidationを行う方法をValidatorクラスという独立したクラスにするのか、 Userクラスの新規登録メソッドでチェック処理を行うのかって選択肢があると思います。User以外にも入力チェックがありValidatorを他でも使いたい場合や、Validatorのスーパークラスがある場合であれば、Validatorクラスを作りますが、そうでもなければ登録メソッド内で入力チェックを行う設計を選ぶかもしれませんよね。こういった場合の設計の決め手は、クラスを取り巻く他の要素だと思います。

noname#247307
noname#247307
回答No.2

漠然としすぎていてかなり抽象的な回答しか書けませんが……。これは、CSVのデータファイルがデータの元本となる、と考えればいいんでしょうか。とすると、一般的には、おそらくこんな感じでは。 ・エンティティクラス 「氏名、メールアドレス、パスワード、年齢」といったフィールドを持つクラスを用意し、これを利用してデータを扱います。コンストラクタにはバリデーションの処理を用意し、インスタンスを作成する際に全値をチェックしてインスタンスが作成される、というようにします。 あるいは更に確実にするなら、インスタンス生成のクラスメソッドを定義し、その中でバリデーション処理をする。そしてコンストラクタをprivateにし、newできないようにする、というやり方もあります。そうすることで、必ずインスタンス生成メソッドを呼び出さなければインスタンスが作れないようにし、「すべてのインスタンスがルールをクリアしている」ということを保証できるようにします。 ・マネージャクラス(O/Rマッピング) これとは別に、CSVなりの元データ(元本となるもの)とエンティティクラスのインスタンスの間の橋渡しを摺るクラスを作成し、すべてのデータ処理はこれを介して行います。例えば、「エンティティの内容を書き換えたらCSVの該当するデータを書き換える」「エンティティを破棄したら該当するCSVのデータを削除する」というようなメソッドを定義していくわけですね。データの更新処理では、インスタンス生成と同様にバリデーションします。 あるいは、エンティティクラス自身にマネージ処理のメソッドを実装してしまってもいいですが、個人的にはエンティティが膨れるのはキライなので私なら切り分けるでしょう。 この2つのクラスを基本として、全てのデータは「エンティティのインスタンスを作成して利用する」「データ改変はマネージャクラスを介して行う」というようにすれば、データの整合性も取れます。作成したエンティティのインスタンスは、コレクションなどでまとめて扱えばいいでしょう。 ただ、個人的な意見を言わせてもらうなら、CSVデータをSQLデータベースに移して、一般的なO/Rマッパーのフレームワークを利用したほうが楽かな?という気もします。

  • catpow
  • ベストアンサー率24% (620/2527)
回答No.1

「オブジェクト指向」、あるいは「クラス」というのは、「銀の弾丸」「黄金の金槌」ではありません。 一時期は、Javaの流行とともに「オブジェクト指向で作れば、プログラミングの問題がすべて解決し、開発時間が短くなり、バグも出にくく、修正も楽になる!」なんてデマが飛び交い、あまつさえ「JavaがC++を駆逐する!!」なんてことを主張する方までいました。 まあ、オブジェクト指向とかクラスがあれば!っていうのは、「宗教」に近いものかもしれません。 オブジェクト指向って、システムの概念設計、基本設計というか、ラフスケッチなどには役にたちますが、質問者さんが作成されたいと望むような具体的なプログラムを設計する場合には、あまり役にたちません。 実際に、「オブジェクト指向でやれば、開発が楽になる!」と信じて始めたけど、現実には開発工数が肥大化し、開発期間が増大したケースが多かったですし、数億円のプロジェクトが完成したシステムを「使えねー!修正もできない!」として破棄したことさえあります。 それよりも、「アルゴリズムとデータ構造」というタイトルの本があるように、どういうアルゴリズムで作るか?ロジックをどう組み立てるか?という古典的な「構造化プログラミング」(IFやCASE文とWHILEなどのループ文)と、サブルーチンや関数などのルーチンの階層構造(段階的詳細化)と、データ構造をどう作るかということを考えましょう。 誤解を恐れずに例えれば、犬小屋を日曜大工で作るとき、小屋のデザイン的なところにだけ注目しているのがオブジェクト指向。 でも、実際に犬小屋を作るのに必要な技術は、それぞれの部材の寸法を記載した設計図であり、木をまっすぐに切る技術、釘やネジで板を接合する技術であり、板が雨に耐えるようにする塗装の技術であり、これらを学ばない限り、いくらオブジェクト指向を勉強しても、犬小屋は完成しません。 正しい宗教・信仰であれば、「この教えさえ信じれば、貴方は幸福になります!」という教えに従ってもいいかもしれません。 でも、第三者からみて「あの人、幸せそうじゃあないね」という信者が多ければ、それは正しい宗教とはいえません。 自分の信じる信仰を破棄したほうが、楽になれることも多いものですよ。

関連するQ&A

  • checkbox の入力チェックのやり方について

    お世話になります。 フォームにて、 javascriptで、入力チェックをおこないたいと思っています。 チェックボックスについては、どれか選択が一つでもなければ、アラートで、文字を出したいと思いますが、うまくできません。 チェックボックスの入力確認の方法を教えてください。 よろしくお願いいたします。 現在作りかけのソースは、下記の通りです。 <html> <head><title>-</title></head> <body> <form method="post" action="" onsubmit="return form_Validator(this)"> <input type="text" name="a1" size="15" maxlength="12"> <BR> <input type="checkbox" name="a1001" value="1"> <input type="checkbox" name="a1002" value="1"> <input type="submit" value="登録" name="submit"> </form> <script Language="JavaScript"> <!-- function form_Validator(doc) { if ( doc.a1.value == "" ) { alert( "BAD" ); return false; } /* a1001かa1002のチェックボックスのチェックがなければアラート----*/ return (true); } //--> </script> </body> </html>

  • 入力チェックとエラーメッセージの表示

    Javaについて勉強している者です。 現在、エントリー(登録)画面で入力した文字の検証処理をサーバーサイドで行い、 エラーがある場合は再度ページを表示し、その際には一緒に エラーメッセージを添える処理を作成したいと考えております。 入力チェックを行うクラスを作ってみたものの、 エラーメッセージをどのように組み込めば良いかという点に悩んでおります。 まとめてみると、期待する処理の流れは次の通りです。 1、エントリー画面に入力された文字の検証処理を行う 2、エラーがある場合にはJSPを再度表示(entry.jsp) 3、再度表示した際にエラーメッセージを添える。 下記はコードの一部です。 //INSERTChecker.java //未入力チェック public boolean requiredCheck(String input){ if(input.equals("")){ return false; } return true; } //数値チェック// public boolean numberCheck(String input){ for(int i = 0; i < input.length(); i++){ if(!Character.isDigit(input.charAt(i))){ return false; } } return true; } } //Validator.java public class Validator extends HttpServlet{ public boolean validate(HttpServletRequest req) throws ServletException,IOException{ request.setCharacterEncoding("Windows-31J"); String id = req.getParameter("id"); String pass = req.getParameter("pass"); String name = req.getParameter("name"); String tel = req.getParameter("tel"); InputChecker check = new InputChecker(); //未入力事項がないかチェック check.requiredCheck(id); check.requiredCheck(pass); check.requiredCheck(name); check.requiredCheck(tel); //数字のみが入力されているかをチェック check.numberCheck(tel); return true; //Servlet else if(select != null && select.equals("エントリー")){ String id = req.getParameter("id"); String pass = req.getParameter("pass"); String name = req.getParameter("name"); String tel = req.getParameter("tel"); Bean bean=new Bean(); bean.setId(id); bean.setPass(pass); bean.setName(name); bean.setTel(tel); Entry cEntry=new Entry();//登録クラス cEntry.entry(bean); Validator vEntry=new Validator(); vEntry.validate(req); req.setAttribute("INSERT",cEntry); target = "/top.html";//登録後、topページに戻る } request辺りがキーワードになるのかな、と考え、色々調べたのですが 解決策は見つかりませんでした。 記述方法やアドバイス等御座いましたら、ご教授お願いいたします。 長文失礼いたしました。

  • phpのオブジェクト指向でつまづきました・・・

    phpのプログラムをオブジェクト指向で書こうと思ったのですが、クラス間のデータのやり取りのあたりでつまづきました。 クラスはそれぞれ 1.設定用 2.データの読み書き用 3.入出力用 4.データ処理用 5.メイン です。 オブジェクト指向で書く前よりはコードも見やすくなったのですが、例えば4のデータ処理のところからは1、2、3の全てのプロパティを参照していたりして、なんだか複雑に。 オブジェクト指向で検索するとwikipediaには プログラムを構成するコードとデータのうちコードについては手続きや関数といった仕組みを基礎に整理され、その構成単位をブラックボックス とすることで再利用性を向上し、部品化を推進する仕組みが提唱され構造化プログラミング (structured programming) として1967年にエドガー・ダイクストラ (Edsger Wybe Dijkstra) らによってまとめあげられた と書いてありました。これだと関数を種類ごとにまとめただけであまり部品化はされておらず、前と変わらないような気がしてしまって・・・ 例えば設定用のクラスはのプロパティほとんどすべての所で値が必要になるのですが、毎回newを使うのは気が引けるので、クラスの外で new でインスタンス化して必要なところから毎回 global で呼び出したりしているんですが・・・使い方が間違っている気がするのですが、そういったことを解説しているサイトが見当たらなかったため、全く分からない状態です。そもそもこの場合、設定用の値はクラスにまとめるべきなのかどうか・・・。 書く時は$クラスー>メンバ変数 とか $クラスー>メンバ関数 のように書くので今何をしているのかが分かりやすく、それは便利だと思うのですが。 すみません。自分でも上手く説明できずによくわからない文章になってしまいましたが、結局の所オブジェクトがどんな物でどんな書き方をすれば良いかが分かっていないのだと思います。そういった所を分かりやすく教えてください。お願いします。

    • ベストアンサー
    • PHP
  • (大至急!)codeigniterで入力チェック

    codeigniterでformで入力された内容が唯一の内容であるかをチェックしたいです。 たとえば入力されたメールアドレスがDBに登録されている内容とチェックしてすでに登録されているかを判定したいです。 formvalidationのコールバック関数を利用するとは思うのですが、 どのように記述したらよいかわかりません。 方針としては POSTデータをモデルに渡して判定してコントローラのコールバック関数に戻すのでしょうか? まったくわからず困っています。 教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 入力チェックでの値の保持

    php(Version 4.3.11)でフォームの入力チェックを含んだ部分を作成しております。 1. aaa.phpにてデータ入力 2. bbb.phpにて入力されたデータの整合性をチェック    チェックを通ればccc.phpへ    チェックに引っかかればaaa.phpへ戻る ・・・※ ※において、aaa.phpにて入力されたデータを保持したいのですが、どよのうにするのが標準なのでしょうか? (「趣味」項目のテキストボックスに「ドライブ」と入力されていたら、aaa.phpに戻ったとき、「趣味」項目のテキストボックスに「ドライブ」をセットしたい。) 入力項目はかなり多いので、 Location:a.php? で引き継ぐのも良くないと思ってます。 今まではaspでイントラネットの開発ばかりだったので、全部JavaScriptで行っていました。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 入力チェックの方法

    入力フォームに入力されたデータのチェック方法ですが、どういう方法で行うのが一番良い方法なのでしょうか? 今までは、『[保存して閉じる]ボタンを押された時に、入力チェックのメソッドを実行する』しかやっていませんでした。 これだと1つのメソッドでまとめてチェックできるので見やすくメンテしやすくて良かったのですが、この方法が良いのか少し疑問もあります。 いろいろ検索してみると人それぞれやり方が違うようですが、項目が多いと結構大変ですよね。 KeyPressイベントで入力規制し、Leaveイベントで入力データのチェック、コピペも出来ないようにして…、入力エラーがあるとボタンは押させない…等、厳密に行うとかなりコーディングが長くなりそうなんですが…(汗 どういう方法が一番良いのでしょうか?これが正解!という物は無いと思いますが他にどういう方法があるのか知りたいのです。 おすすめの方法でも何でも構いません。メリット・デメリットも書いていただけるとうれしいです。 vb2005,2008を使用しております。

  • データ入力のチェック方法

    某会社の本部で仕事でマスタデータの入力をしています 私が入力したデータが、支店の発注画面の商品データとなります 登録の流れは、発注画面に載せる商品を決める営業さん達が表形式の登録内容を纏めた用紙を印刷して、それを見ながら手で入力するやり方をしています 毎日、登録内容を更新日時をキーにデータを抽出して各営業さん達に一覧形式にしてメール展開しています 自分で確認しながら入力して、結果を表に纏めてメール送信して終わりという状態です。 で、表形式の登録内容を纏めた用紙(紙)を見ながら登録していく訳なのですが、1件わかりにくい場所に書かれていて登録が漏れていました わかりにくい場所に書かれていても、見落としをした私のミスです それでも、依頼書を作成した営業さんにも登録した内容をチェックをして欲しいとお願いしたのですが、「そんな事はそっちの仕事で、こっちはチェックできない」とバッサリ切り捨てられました 上司にもこういうミスは、今後も起こり得るかもしれないから何かチェックできないか?と相談したのですが、「作業の終わりに自分が作成する登録内容の一覧で自分でチェックしていくしかないよね」と言われました 自分は、今までシステム開発業務に携わってきたのでこういった手作業には間違いは絶対あるものという考えが根付いています 今まで、こういった単純な手入力作業でWチェックは当たり前でした なので、自分で入力した内容を自分でチェックして終わりというのは有り得ない!という思いが強いです 実際に漏れがあるといわれて、手元にあった表形式の登録内容を纏めた用紙を2度見直しましたが、2度とも漏らしたした商品見つけられませんでした 同じ人間がチェックしても同じミスを繰り返しやすいのです なので、細かい入力ミスまで無理でも、上司がザックリチェックするとか、登録して欲しいという営業さんが自分担当の商品項目のチェックだけでも・・・と不満に思ってしまいます ただこういった考えは業界的なモノで普通の会社の事務の考えとしては、データ入力のノーチェックというのは当たり前なのでしょうか? 普通の会社の一般の方はどのようにチェックされているのでしょうか?

  • エクセルにて:チェックボックスのチェックを一括消去・リセットする方法はありませんか?

    エクセル2003です。 チェックボックスを使用したデータ入力シートを使用しています。 Aの方のデータ入力→登録が終ったら、次にBの方を入力したいのですが その際に、Aの方のデータ入力の際に入れたチェックマークを 一括で消去・リセットしたいのですが、良い方法はありませんか? よろしくお願いいたします。

  • 「教えて!goo」の「ログイン状態を保持する」の意味

    はじめまして。 「教えて!goo」の登録画面のところ、「ログイン状態を保持する」のような文を見かけます。この文の前の四角の中にチェックを入れたら次回登録する時にパスワードを入力する必要もあるのでしょうか。以前はもしチェックを入れるならば、次回からパスワードをもう一度入力する必要はありませんが、今は毎度チェックを入れても次回から必ずパスワードをもう一度入力しなければなりません。「ID・パスワードを保存・自動入力するツールはこちら」というような文も見かけましたが、これは解決方法でしょうか。でも、私は「ID・パスワードを保存・自動入力するツールはこちら」の中のソフトをインストールしたくありません。今「ログイン状態を保持する」の機能はすでに変わってしまったのでしょうか。「ログイン状態を保持する」の機能はどんなことを指しているのでしょうか。とても困っております。ご存知の方、よろしくお願い致します。 日本語を勉強しているので、まだまだ文章がうまく書けません。質問文の中で不自然な表現がありましたら、それも併せて指摘していただければ助かります。 宜しくお願い致します。

  • 入力チェックのプログラム

    すみません、教えてください。 『キーボードから入力された数値の範囲をチェックする。 範囲は0~10000とし、入力の際に文字(A~Z,a~z,特殊文字)、空白を含む入力、リターンのみの入力はERRORを表示する。再度、入力を要求し、正常データが入力された時点でOK(入力数値)と表示し、終了する』 という問題なのですが、whileを使って、配列に格納した文字を条件があうまで判定すればいいのではないかとは思うのですが、範囲のチェックをどのようにしたらよいのかよくわかりません。 どのようにしたらよいか教えていただけませんでしょうか。 よろしくお願いします。

専門家に質問してみよう