Pertanyaan C #: Kontrak Kode vs validasi parameter normal


perhatikan dua potongan kode berikut:

    public static Time Parse(string value)
    {
        string regXExpres = 
           "^([0-9]|[0-1][0-9]|2[0-3]):([0-9]|[0-5][0-9])$|^24:(0|00)$";
        Contract.Requires(value != null);
        Contract.Requires(new Regex(regXExpres).IsMatch(value));
        string[] tokens = value.Split(':');
        int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
        int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
        return new Time(hour, minute);
    }

dan

    public static Time Parse(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        string[] tokens = value.Split(':');
        if (tokens.Length != 2)
        {
            throw new FormatException("value must be h:m");
        }
        int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
        if (!(0 <= hour && hour <= 24))
        {
            throw new FormatException("hour must be between 0 and 24");
        }
        int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
        if (!(0 <= minute && minute <= 59))
        {
            throw new FormatException("minute must be between 0 and 59");
        }
        return new Time(hour, minute);
    }

Saya pribadi lebih suka versi pertama karena kode lebih jelas dan lebih kecil, dan Kontrak dapat dengan mudah dimatikan. Tapi kerugiannya adalah bahwa Analisis Kode Studio Visual menyalahkan bahwa saya harus memeriksa nilai parameter untuk null dan Kontrak konstruktor tidak menyadari bahwa regex memastikan bahwa menit dan jam berada dalam batas yang diberikan.

Jadi saya akhirnya memiliki banyak peringatan yang salah dan saya tidak melihat ada cara untuk memvalidasi nilai string dengan kontrak tanpa berakhir dengan membuang FormatException selain dari validasi RegEx.

Ada saran bagaimana Anda akan menyelesaikan ini dan situasi yang setara menggunakan kontrak Kode?


32
2017-12-30 15:18


asal


Jawaban:


Untuk menyingkirkan peringatan yang bisa Anda gunakan Contract.Assume


21
2017-12-30 15:32