その山の玉は再構築できます:身分証明書番号(4日目)


今日になって、私は本当に私の望む再構築/改善を始めることができます.前に、テストを補充しただけで、構造を調整しました.はい、とてもゆっくりで、これは意外にも“敏捷”と呼ばれます!?おかしいと言ったのか?幸いなことに、このリズムは私のような高齢の青年に適していて、併用すればいいので、風花なのか雪月なのかをオフにします.

==テストオーバーライド


前回は最も重要な非同期が漏れ、オーバーライドをテストしました.
きれいな100%カバー率のテストができると思っていたが、人は天算に及ばず、75%の方法があった.
(本明細書の著作権は© 2012-2013予沁安)
はい、無効な誕生日はテストされていません.
簡単です.テストを1つ増やしただけで、ここでくどくどしません.直接カバー率を貼って、見せてください.
コード品質パラメータをもう一度表示します.
複雑度が一番大きいのはコンストラクタです.しかし、維持指標はやはり良い76点です.

==>最適化の改善:属性、静的設定、その他


こまごました改善は、前のように、1つのテストに基づいて縦方向に変更することもできますし、すべてを一緒にテストすることもできます.あまり関係ありません.前者は厳格なテスト駆動です.しかし、私はあまり学術化する必要はないと思います.肝心なのは、あなたの任務は十分に小さく、今日中に完成することができます.それは適切です.
1. すべてのブロックを属性方式に変更します.一つはJavaとC#の違いです.第二に、元のコードのバッファ誕生日の論理を極限にして(限界プログラミング?ああ)、最初からバッファ(コンストラクタの中で)
 public string CardNumber { get;private set; }
 public string AddressCode { get; private set; }
 public DateTime BirthDate { get; private set; }
 public Gender Gender { get; private set; }

2.データ解析はコンストラクタに配置され、独立して方法となり、コンストラクタで呼び出されるだけです.
void extract()
        {
            AddressCode = CardNumber.Substring(0, 6);
            Gender = ((int) CardNumber[CARD_NUMBER_LENGTH - 2])%2 == 0 ? Gender.Female : Gender.Male;
            BirthDate = extract_birth_date();
        }

日付は十分複雑なので、独立して方法を出します.
public DateTime extract_birth_date()
        {
            try
            {
                return DateTime.ParseExact(CardNumber.Substring(6, 8), BIRTH_DATE_FORMAT, null);
            }
            catch (Exception e)
            {
                throw new ApplicationException(" ");
            }
        }

3.以前のコード解析パラメータから,コンストラクタの複雑さが高すぎて,主にいくつかの検証が見られた.正規表現が含まれているため、null、emptyの検証を削除する検証方法を提案します.
 private void validate(string cardNumber)
        {
            if (!SOCIAL_NUMBER_PATTERN.IsMatch(cardNumber))
                throw new ApplicationException("Card Number has wrong charactor(s).");

            if (cardNumber[CARD_NUMBER_LENGTH - 1] != verifier.verify(cardNumber))
                throw new ApplicationException("Card Number verified code is not match.");
        }
public SocialID(String cardNumber)
        {
            validate(cardNumber);
            CardNumber= cardNumber;
            extract();
        }



===』OK、今立ち上がって、コーヒーを一杯ください。私たちの成果を楽しんでください。


メンテナンス性は82に向上し、複雑度はvalidate()3が最も高く、
完全なコードは、はっきりしていますか?
using System;
using System.Text.RegularExpressions;

namespace Skight.eLiteWeb.Domain
{
    public enum Gender
    {
        Female,
        Male
    }
    public class SocialID
    {
        private static Verifier verifier = new Verifier();
        private static String BIRTH_DATE_FORMAT = "yyyyMMdd";
        private static int CARD_NUMBER_LENGTH = 18;
        private static Regex SOCIAL_NUMBER_PATTERN = new Regex(@"^[0-9]{17}[0-9X]$");

        public SocialID(String cardNumber)
        {
            validate(cardNumber);
            CardNumber= cardNumber;
            extract();
        }

        private void validate(string cardNumber)
        {
            if (!SOCIAL_NUMBER_PATTERN.IsMatch(cardNumber))
                throw new ApplicationException("Card Number has wrong charactor(s).");

            if (cardNumber[CARD_NUMBER_LENGTH - 1] != verifier.verify(cardNumber))
                throw new ApplicationException("Card Number verified code is not match.");
        }
        void extract()
        {
            AddressCode = CardNumber.Substring(0, 6);
            Gender = ((int) CardNumber[CARD_NUMBER_LENGTH - 2])%2 == 0 ? Gender.Female : Gender.Male;
            BirthDate = extract_birth_date();
        }
        public DateTime extract_birth_date()
        {
            try
            {
                return DateTime.ParseExact(CardNumber.Substring(6, 8), BIRTH_DATE_FORMAT, null);
            }
            catch (Exception e)
            {
                throw new ApplicationException(" ");
            }
        }

        public string CardNumber { get;private set; }
        public string AddressCode { get; private set; }
        public DateTime BirthDate { get; private set; }
        public Gender Gender { get; private set; }
    }
}

(本明細書の著作権は© 2012-2013予沁安|転載作者と出典を明記してください)