سؤال

كيف ريفاكتور هذه فئتين مجردة من الشبه ؟ ملخص الفصل ؟ بسيطة الميراث ؟ ما من شأنه أن ريفاكتوريد فئة(es) تبدو وكأنها ؟

public class LanguageCode
{
    /// <summary>
    /// Get the lowercase two-character ISO 639-1 language code.
    /// </summary>
    public readonly string Value;

    public LanguageCode(string language)
    {
        this.Value = new CultureInfo(language).TwoLetterISOLanguageName;
    }

    public static LanguageCode TryParse(string language)
    {
        if (language == null)
        {
            return null;
        }

        if (language.Length > 2)
        {
            language = language.Substring(0, 2);
        }

        try
        {
            return new LanguageCode(language);
        }
        catch (ArgumentException)
        {
            return null;
        }
    }
}

public class RegionCode
{
    /// <summary>
    /// Get the uppercase two-character ISO 3166 region/country code.
    /// </summary>
    public readonly string Value;

    public RegionCode(string region)
    {
        this.Value = new RegionInfo(region).TwoLetterISORegionName;
    }

    public static RegionCode TryParse(string region)
    {
        if (region == null)
        {
            return null;
        }

        if (region.Length > 2)
        {
            region = region.Substring(0, 2);
        }

        try
        {
            return new RegionCode(region);
        }
        catch (ArgumentException)
        {
            return null;
        }
    }
}
هل كانت مفيدة؟

المحلول

إلا إذا كان لديك سبب قوي من أجل إعادة بيع ديون (لأن كنت تنوي إضافة المزيد من الطبقات مثل هذه في المستقبل القريب) عقوبة تغيير تصميم صغير و مفتعلة سبيل المثال من شأنه التغلب على مكاسب في الصيانة أو النفقات العامة في هذا السيناريو.على أية حال هنا هو ممكن تصميم على أساس عام و تعبيرات لامدا.

public class TwoLetterCode<T>
{
    private readonly string value;

    public TwoLetterCode(string value, Func<string, string> predicate)
    {
        this.value = predicate(value);
    }

    public static T TryParse(string value, Func<string, T> predicate)
    {
        if (value == null)
        {
            return default(T);
        }

        if (value.Length > 2)
        {
            value = value.Substring(0, 2);
        }

        try
        {
            return predicate(value);
        }
        catch (ArgumentException)
        {
            return default(T);
        }
    }

    public string Value { get { return this.value; } }
}

public class LanguageCode : TwoLetterCode<LanguageCode>  {
    public LanguageCode(string language)
        : base(language, v => new CultureInfo(v).TwoLetterISOLanguageName)
    {
    }

    public static LanguageCode TryParse(string language)
    {
        return TwoLetterCode<LanguageCode>.TryParse(language, v => new LanguageCode(v));
    }
}

public class RegionCode : TwoLetterCode<RegionCode>
{
    public RegionCode(string language)
        : base(language, v => new CultureInfo(v).TwoLetterISORegionName)
    {
    }

    public static RegionCode TryParse(string language)
    {
        return TwoLetterCode<RegionCode>.TryParse(language, v => new RegionCode(v));
    }
}

نصائح أخرى

ذلك يعتمد إذا أنها لن تفعل أكثر من ذلك بكثير ، ثم ربما تترك لهم كما هو - IMHO العوملة الأشياء من المرجح أن يكون أكثر تعقيدا في هذه الحالة.

هذا هو بالأحرى سؤال بسيط و لي رائحة awefully مثل الواجبات المنزلية.

يمكنك الواضح رؤية مشتركة بت في المدونة و أنا متأكد من أنك يمكن أن تجعل محاولة ذلك بنفسك عن طريق وضع هذه الأشياء في السوبر الدرجة.

يمكنك الجمع بينها في Locale الصف الذي يخزن كل من اللغة رمز رمز المنطقة ، accessors على المنطقة واللغة زائد واحد تحليل الوظيفة الذي يسمح أيضا سلاسل مثل "en_gb"...

هكذا رأيت لغات يتم التعامل معها في مختلف الأطر.

هذين ، كما أنها تقف, لن ريفاكتور حسنا لأن من أساليب ثابتة.

أما في نهاية المطاف مع بعض نوع من طريقة مصنع على قاعدة الطبقة التي بإرجاع نوع من هذه الفئة الأساسية (التي من شأنها في وقت لاحق تحتاج الصب) أو أنك تحتاج إلى نوع من مساعد إضافية الدرجة.

بالنظر إلى كمية إضافية رمز اللاحقة الصب إلى النوع المناسب, الأمر لا يستحق ذلك.

  1. إنشاء قاعدة عامة فئة (على سبيل المثال AbstractCode<T>)
  2. إضافة مجردة أساليب مثل

    protected T GetConstructor(string code);
    
  3. تجاوز في فئات أساسية مثل

    protected override RegionCode GetConstructor(string code)
    {
        return new RegionCode(code);
    }
    
  4. أخيرا لا نفس مع string GetIsoName(string code), على سبيل المثال

    protected override GetIsoName(string code)
    {
        return new RegionCode(code).TowLetterISORegionName;
    }
    

التي سوف ريفاكتور على حد سواء.كريس Kimpton يثير السؤال المهم ما إذا كان الجهد يستحق ذلك.

أنا متأكد من أن هناك أفضل الأدوية على أساس الحل.ولكن لا يزال أعطاه النار.

تحرير:كما التعليق يقول أساليب ثابتة لا يمكن تجاوزها حتى واحد خيار الاحتفاظ بها واستخدامها TwoLetterCode الكائنات حول ويلقي لهم ، ولكن ، كما شخص آخر قد أشار بالفعل ، بل هي عديمة الفائدة.

ماذا عن هذا ؟

public class TwoLetterCode {
    public readonly string Value;
    public static TwoLetterCode TryParseSt(string tlc) {
        if (tlc == null)
        {
            return null;
        }

        if (tlc.Length > 2)
        {
            tlc = tlc.Substring(0, 2);
        }

        try
        {
            return new TwoLetterCode(tlc);
        }
        catch (ArgumentException)
        {
            return null;
        }
    }
}
//Likewise for Region
public class LanguageCode : TwoLetterCode {
    public LanguageCode(string language)
    {
        this.Value = new CultureInfo(language).TwoLetterISOLanguageName;
    }
    public static LanguageCode TryParse(string language) {
        return (LanguageCode)TwoLetterCode.TryParseSt(language);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top