1

メールを送信する単一のメソッドを持つ単純な小さなクラスをコーディングしています。私の目標は、これを従来の Visual Basic 6 プロジェクトに実装し、COM 相互運用機能を介して COM オブジェクトとして公開することです。

私が解決するのが難しいと思っている詳細があります。それは、パラメーターを検証する際にどれだけ細かくする必要があるかということです。その観点から、私が本当に満足していないこと、そして詳細ではないことは、私が実際に例外を処理している方法です:

public class MyMailerClass
{
    #region Creation
    public void SendMail(string from, string subject, string to, string body)
    {
        if (this.IsValidMessage(from, subject, to, body)) // CS1501
        {
            MailMessage msg = new MailMessage();
            msg.IsBodyHtml = true;
            msg.From = new MailAddress(from);
            msg.To.Add(to);
            msg.Subject = subject;
            msg.Body = body;
            SmtpClient srv = new SmtpClient("SOME-SMTP-HOST.COM");
            srv.Send(msg);
        }
        else
        {
            throw new ApplicationException("Invalid message format.");
        }
    }
    #endregion Creation

    #region Validation
    private bool IsValidMessage(string from, string subject, string to, string body)
    {
        Regex chk = new Regex(@"(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})");
        if (!chk.IsMatch(from))
        {
            return false;
        }
        if (!chk.IsMatch(to))
        {
            return false;
        }
        if (!string.IsNullOrEmpty(subject))
        {
            return false;
        }
        if (!string.IsNullOrEmpty(body))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    #endregion Validation
}

どんな提案でも大歓迎ですので、すべてのコメントに事前に感謝します!

:この特定のケースでEnterprise Library のValidation Application Blockを実装すると便利でしょうか?

4

3 に答える 3

9

SendMail の呼び出し元に課している契約について考えてみましょう。彼らはあなたに「有効な電子メールアドレス」を渡す必要があります。何が有効かは誰が決めるのですか?SendMail が行います。基本的にあなたの方法は「高度なメンテナンス」です。物事を好きなように正確に望んでおり、あなたが与えようとしているものが満足できるかどうかを判断する唯一の方法は、最善を尽くして期待することです.

呼び出し元にそれを満たす方法を知る機会を与えることなく、または少なくとも例外を回避する方法を持たないで、メンテナンスの多いメソッドを記述しないでください。ブール値を返す「IsValidAddress」メソッドに検証ロジックを抽出します。次に、SendMail メソッドで IsValidAddress を呼び出し、無効な場合はスローします。

この変更により、いくつかの素晴らしい効果が得られます。

(1) 関心の分離の増加。SendMail の仕事は、電子メール メカニズムを機能させることであり、電子メール アドレスが有効かどうかを判断することではありません。そのポリシー決定を、検証に特化したコードに分離します。

(2) アドレス検証は、それ自体が有用なツールです。メールを送信せずに、アドレスが正しい形式かどうかを知りたい場合がよくあります。

(3) すべてが 1 つの適切な場所にあるため、検証ロジックを簡単に更新および改善できます。

(4) 呼び出し元には、例外がスローされないことを保証できる方法があります。引数が有効であることを保証せずに呼び出し元がメソッドを呼び出すことができない場合、呼び出し元は例外をキャッチする必要があります。理想的には、呼び出し元がコードを正しくするために例外を処理する必要がないようにする必要があります。たとえ渡されたデータが悪かったとしても、スローしない正しいコードを書く方法が必要です。

この件について私が書いたいくつかの記事を以下に示します。

例外処理: http://ericlippert.com/2008/09/10/vexing-exceptions/

高度なメンテナンス方法: http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx

于 2009-07-09T06:18:40.170 に答える
3

2 つのthrowステートメントが連続していても意味がありません。最初のステートメントのみが実行され、制御は例外ハンドラーに渡され、2 番目のステートメントには渡されませんthrow

私の意見では、「送信者の電子メールが無効です」のように言うだけで十分です。電子メールは非常に単純で短いため、ユーザーは追加のガイダンスなしでこれを解決できます。

また、渡されたすべての値を最初に確認してから作業を開始する方がよいと思います。無効なパラメーター値に遭遇して例外をスローし、この作業を完了できない場合、部分的に作業を行う意味は何ですか。できるだけ早い段階でエラーを指摘するようにしてください。できれば最初に。

于 2009-07-09T05:53:22.017 に答える
1

と:

使用する

string.IsNullOrEmpty(subject)

それよりも

subject == null

文字列が空かどうかを確認します。

于 2009-07-09T05:58:10.320 に答える