投稿

11月, 2020の投稿を表示しています

11月30日(月)1、2コマ目

イメージ
今日、やったこと C#版「オークションサイト」構築 Javaの例外 今日の課題(C#版「オークションサイト」) ソースを載せておきます。 [データアクセスレイア]UserDAOクラス ユーザーマスタテーブルアクセス用クラス。 あくまでもデータベースアクセスクラス。認証メソッドはここには作らない。 このクラスが返す値を使って、ビジネスロジック層で認証を行う。 逆の言い方をすれば、ビジネスロジック層で認証を行うためにこのクラスの機能を使う。 [データアクセスレイア]ItemDAOクラス 商品マスタテーブルアクセス用クラス。 [データアクセスレイア]BidDAOクラス 入札データテーブルアクセス用クラス。 [ビジネスロジックレイア]Serviceクラス このクラスでシステムに必要な機能を提供する。 [プレゼンテーションレイア]Index.cshtml.cs 1ページ目。Index.cshtmlはなんてことはないので省略。 [プレゼンテーションレイア]ItemList.cshtml.cs 2ページ目。おなじく、ItemList.cshtmlは省略。 [プレゼンテーションレイア]Bid.cshtml.cs 3ページ目。Bid.cshtmlは省略。 今日のホワイトボード Javaの例外クラス .Netと異なり、例外処理(キャッチするまたはthrowsで例外スローを宣言してスロー)をコンパイル時にチェックする検査例外と.Netと同じ実行時例外の2種類の例外がJavaにはあります。 図 Javaの例外クラス せっかく2種類の例外クラスがあるので、異常時の通知方法で使い分けをします。 図 検査例外と実行時例外の使い分け サンプルアプリケーション「ユーザー登録」 以前、.Netでの作成したユーザー登録です。入力されたIDがすでに登録済みならエラー「異なるIDを入力し...

11月16日(月)1、2コマ目

イメージ
今日、やったこと 新課題「C#版簡単オークションサイト」の説明 今日のホワイトボード 処理結果を伝える 以前から話している内容そのままです。とくに真新しい内容はありません。 図 処理結果を伝える [データベース]列の初期値 INSERT INTO実行時に挿入値が未指定の場合にデフォルト値が登録されるようにするには、図のようにdefaultを使って初期値を指定します。 図 応札日時列の初期値は現在日時(systimestampで取得できる) なお、列制約構文での制約、さらに初期値を指定する場合は下図の順になります。 create table テーブル名(  列名 データ型  default 初期値  制約 ) 入札処理 入札前の最高値取得は1人だけしかできないようにしなければならない。 入札最高値より高い金額しか入札できません。 まず、入札最高値をチェックする必要がありますが、下図のようにAさん、Bさんがほぼ同じタイミングでチェック(ロックしなければできる)し、先にBさんがDBに書き込むとAさんはエラーにする必要がありますが、Aさんのチェック時では最高値以上であるため、エラーにできません。 そこで、まず入札データテーブルの対象商品のデータをすべてロックし、ロックできた人がだけその後の処理(最高値取得、チェック、データ書き込み)ができるようにしてください。 図 最高値は1人だけしか取得できないようにするために NotFilledExceptionについて シーケンス図に書いてありましたが、ちゃんと説明をしていなかったので。 未入力項目がある場合は、NotFilledExceptionをスローするとかいてあります。 〇NotFilledExceptionクラスをつくる まず、NotFilledExceptionクラスですが、自作例外クラスです。Exceptionを継承してください。 図 自作例外クラスNotFilledExceptionをつくる 〇空白チェックのながれ tryブロック内は正常系をメインに実装し、catchブロックでエラー内容に応じた処理を書くのがtry~catchの一般的な実装です。 図 空白チェックのながれ ページ遷移 ログインページのOnPost()は以下のようになります。 ポイントは OnPost()の戻り値はIActionResult 遷移...

11月9日(月)1、2コマ目

イメージ
今日、やったこと [.Net版]異常系処理演習(ユーザー登録) 今日のホワイトボード トランザクションとコミット、ロールバックについて 前回のJava版在庫引当でトランザクション処理に理解が甘いかたがおられましたので、フォローしておきます。 図 トランザクションとコミット、ロールバック トランザクションはコミット、ロールバックで終わる コミットすれば、更新処理はすべて確定。 ロールバックすれば、直近のコミットした時点のデータに戻る。 ということは、コミット後の更新処理はすべてキャンセルされる。 〇コミットすれば更新は確定 在庫引当の課題では、一度に複数商品の在庫引当ができるようになってました。 仕様では すべての在庫引当成功 => 在庫引当処理成功 => コミット 1件でも在庫引当失敗 => 在庫引当処理失敗 => ロールバック です。 これを1件更新するたびにコミットまたはロールバックするように実装されていた方がおられました。仕様と異なる動きをしてしまいます。 〇ロールバックすれば直近のコミットしたときのデータにデータベースが戻してくれる 自力でデータ復旧処理を実装されていた方がおられましたが、ロールバック一発でOKです。 今日の課題 C#で、ユーザー登録を行うアプリケーション作成です。 一見さんお断りシステムを採用していますので、すでに登録済みユーザーが紹介者になってもらう必要があります。 一応、ソースコードを公開しておきます。 〇Userクラス ユーザーデータの受け渡しに使うクラス。 〇RegistUserResultEnum(列挙型) ユーザー登録処理の結果を伝えるための列挙型。 〇UserDAOクラス ユーザーマスタテーブルアクセスのためのクラス。 〇Serviceクラス 機能提供クラス。 〇Index.cshtml Razorページ。 〇Index.cshtml.cs Index.cshtmlの...

11月2日(月)1、2コマ目

イメージ
今日、やったこと .Net版異常時の対応 今日のホワイトボード 処理は2種類の終わり方がある 処理が正常に実行された「正常終了」となにがしかの問題が発生した「異常終了」。 異常終了も図のように2パターンに分類できる。 図 正常終了と異常終了 この2パターンの異常終了を通知する方法を.Netでは以下のようにすることにする。 ユーザーに通知して、 リカバリしてほしい エラー 戻り値で通知 ユーザーに通知しても、 リカバリが期待できない エラー 例外で通知 tryブロックについて 基本的に例外はスローしっぱなし。スローされた例外は上位へ伝播させる。 ただし、例外時に実行すべき処理がある場合のみ、例外をキャッチしていい。 これを今後の基本ルールにします。 図 tryブロックについて 今日のサンプルソース Userクラス ユーザー情報受け渡し用クラス。 UserInsertResultEnum 列挙型。ユーザー登録結果を通知するために用意。 UserDAOクラス 全件検索(SelectAll())、登録(Insert())メソッドのみ。 Serviceクラス ビジネスロジックレイアのクラス。今回はなくてもよかったけど。 Index.cshtml Index.cshtml.cs