- - PR -
C# 戻り値の型を動的に変更することは可能ですか?
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-08 22:14
南部です。
例外と業務エラーの分類は ・業務エラー 業務設計で想定されている範囲で処理が分岐する正常終了でないケース。 ⇒戻り値として表現 ・アプリケーション/システムエラー 業務設計で想定しない異常のため正常終了できないケース ⇒例外で表現 ですが、じゃ、どこから「想定しない異常」なの?というのは、 私の中でも明確ではなく感覚です。 恐らく、Jittaさんや未記入さんは、 システムエラー的なことまで、「想定」してしまうでしょう。
メールアドレスを入力させる業務フローがあった場合、 入力者が書式を間違えたり、別の入力項目と勘違いしたりして不正な値が、 入力されることは想定されることであり、それが起こった時、どのような フローにするのか想定・設計するので、業務エラーです。
「フローへの復帰が困難なもの」という認識で間違いないと思いますが、 「かなり致命的な障害(JavaのError)」だけではなく、 「業務設計上想定されていない例外(JavaのRuntimeException)」も含まれています。 (NullPointerExceptionからの業務フロー復帰、、設計しませんよね)
いえ、Goodsクラスの内部状態が不正になることは、 Goodsクラス本人(?)からしてみれば致命的です(いいすぎかも)。
クラスライブラリが例外を投げるのは、以前、未記入さんも記述していましたが、 次の利点があるためでしょう(本当のところわかりません)。 --- MSDNより抜粋 -- リターン コードなどの他のエラー通知方法に比べ、例外を使用したエラー通知方法には多くの利点があります。エラーは必ず通知されます。エラー発生後に無効な値がシステム内に反映されません。リターン コードを確認する必要がありません。例外処理コードを簡単に追加でき、これによりプログラムの信頼性が向上します。ランタイムでの例外処理は、Windows ベースの C++ 例外処理よりも高速です。 ------------------- しかし.NETの例外は、Javaの検査例外のように呼び出し元に対し業務フローの分岐を強制させる、つまり、「この例外をスローするから、適切な業務エラールートに進んでね。」みたいなことはできませんので、「例外」は業務フローから出るときに使用し、業務ルートの分岐には戻り値を使用する、つまり、「例外」が起きない限り、業務フロー内であるというデザインなのです。
GoodsクラスのDiscountRateプロパティを「割引率を設定する」という 業務フローに依存し、SetDiscountRateメソッドにすることが 「しっくりこなかった」ためです。 例えば、Goodsを一括登録するためCSVからデータを読み込むWindowsアプリケーションを 作成した場合、 CostPrise = XXX; Prise = XXX; SetDiscountRate(XXX); //ええ!?なんでメソッドなの? すみません、くだらない理由で、、、 モデル内に業務フローに依存したメソッドがあることで、 混乱するような気がしただけです。 また、「例外の使用が正当化される」というか、 Goodsクラスは不正な値が設定されることが業務エラーかどうか 意識しない、でも不正であることは必ず通知したいということです。 | ||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2005-05-08 22:41
本当に申し訳ないと思っております。 (きっと、以前の自分の投稿見たら、何言ってるんだろうって思うんだろうな、、) これは、 .NET エンタープライズ Webアプリケーション開発技術大全Vol.3 の4.4例外処理に記述されています。 | ||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2005-05-08 23:14
話が最初のところに戻ってしまうんですが、例外のキャッチが強制されないという技術的な制約があると「例外の使用を控えるべき」となってしまうのはナゼでしょうか。 そもそも、Platform SDK では、リファレンスが手元にないと正常なフローを維持することなんてできないですよね。正常終了は ERROR_SUCCESS だっけ? それとも 0 以外の値が正常値だったかな? いや -1 以外は正常のはず・・・。ってな感じになるわけで。私は Platform SDK でプログラムを組むときは常にリファレンス(オンラインですが)を手元に置き慎重に if文を記述して、正常なフローを維持することに腐心していました。 結局のところ、戻り値方式であってもリファレンスがないと正常なフローを維持するのは困難なわけですから「発生する例外が(リファレンスを確認しないと)分からない」というのは、(戻り値方式に比べて)使用を控える積極的な理由にはならないと思うのです。いままでの話の流れでは「Java と違って使いにくいから・・・」という意見が多かったですが、本当に比較すべきは Java ではなく従来の戻り値方式ですよね。で、リファレンスの確認を必要とする点では戻り値方式も例外も同じなんじゃないかとふと気づいたわけです。 どうでしょう? 私はリファレンス必須でも例外を積極的に使っていくメリットは大きいと思うのですが。 | ||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2005-05-09 07:48
南部です。 そうですね。 設計者やコーディング者の経験や知識によって変わると思います。 Javaでも初心者のコードでは public void login(引数)throws Exception のようなインターフェースを見かけます(かわいいでしょ)。
そうですね。 折角、ApplicationExceptionとかありますし、、ね。 コーディングのスタンダードは変化していくかもしれませんね。 でも、業務フローの制御のために、try〜catchを「きざむ」コードは あまりみたくないよーな、、、 | ||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2005-05-09 22:50
だとすると、ルールやデザインガイドとしては不適切ではないでしょうか。いろんな経験をした人はたくさんの検査メソッドを置く、初めての人はシステムが生成する例外だけで対応しようとする(まさに‘かわいい’状態)。。。同じプロジェクトに2人が携わると、コードに差が出ます。2人が別個のクラスライブラリを設計すれば、混乱するのは使用者です。 (そういう人の配置をするのが問題、というのは、ひとまず置いておく) そうではなく、経験に左右されずに同じような設計/コーディングができるように策定されたのがガイドラインであり、ルールではないでしょうか。だとすると、どこまでを「想定の範囲」とするか、明確にする必要があると思います。 結局、私が落としどころを見つけられなかったのはこの問題なのかもしれない。「範囲が明確にできないなら、全部例外にしてやれ」ってことです(^o^; _________________ | ||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2005-05-10 10:38
こんにちは。
ここは自分の考えとは違うところです。 「例外」=「エラー」と考えて無いでしょうか?例外をエラー(業務エラーでもシステムエラーでも)かどうか判断するのは、呼び出す側であって、呼び出される側(スローする側)では無いと思います。 呼び出された処理は与えられた条件により、ある暗黙の前提(型や引数の範囲等)にしたがって処理を行います。例外をスローするということは、呼び出し側に対し、前提に違反しているということを通知することであり、呼び出された処理にとってはエラーではなく、予定された処理の一部なのです。 なので、呼び出される側が「エラーを通知しよう」という意識にたって結果コード(あえてエラーコードといわない)や、例外を取り扱うのはおかしいかなと思います。 | ||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2005-05-10 11:01
「想定の範囲」は結局アプリケーションに依存するためでしょう。 データベースを使用するWebアプリケーションの業務フローでの 「データベースに接続できない」と データベースを監視するアプリケーションでの 「データベースに接続できない」は違います。 ガイドライン・ルールは、確かにアプリケーションの品質を確保するために 必要なものでしょう。しかし、それだけでは高い品質とは言えないでしょう。 #経験に左右されずに同じような設計/コーディングができる、、、 #これだと、私の給料は上がりません。 | ||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2005-05-10 12:33
南部です。
私から見ると、noderaさんの意見の私の意見は、そんなに違っていると 感じないのですが、、、、
例外=アプリケーション・システムエラー と定義しています。 そして、例外を業務エラー、業務エラーを例外に切り替えることは、 呼び出す側、呼び出される側というより、切り替える責任を持つところで行います。 (後者はあまりないかも知れませんが) 例外を業務エラーに切り替えるということは、例えばクラスライブリラリを使用した場合に スローされた「例外」が「想定された範囲」にある場合で、かつ、正常に終了できない 場合に、ビジネスフローに対して「エラールート」に進んでほしいことを通知します。 そしてこのメソッドは、ビジネスフローから「呼び出される」メソッドで、クラスライブラリを 「呼び出す」メソッドです。
はい、クラスライブラリにおけるパラメータ引数のチェック時の例外とかですね。
呼び出される側が、業務的責任がない(というか業務エラーを想定すべきではない)場合、 呼び出される側は、自分の責任範囲で「例外」をスローすればよいと思います。 |