質問
ついてはどのように捉えていrefactorこれら二つのクラスは、抽象の類似性や?抽象クラス?単相続?どのように整理クラス(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));
}
}
他のヒント
ればならない以下の通り、だらだらとしては厚織り出しものがあります。
この簡単な質問を私の臭いawefullyのような課題の課題が出てきます。
まあ、普通のビットをコードしてくださいすることができるのみで、自分で入れてないものがスーパークラスです。
きかせて Locale
クラスは、店舗の両方の言語コードおよび地域コードは、accessorsのための地域と言語プラス-ワン-構文解析の機能もできる文字列のように"en_gb"...
そこで私は見たロケールに対する取り扱う各種の枠組み
これら二つのもとでは、スタンドに行き渡らないrefactorでに静ます。
いどちらと何らかのファクトリメソッドベースのクラスを返しますタイプの基底クラスです(その後必要な鋳造)やす必要のような追加のヘルパークラスです。
さらに量を追加のコードおよびその後の鋳造に適切なタイプでプライベートビーチがあります。
- を基本クラス(例えば
AbstractCode<T>
) 追加抽象メソッドのように
protected T GetConstructor(string code);
オーバーライドベースの授業など
protected override RegionCode GetConstructor(string code) { return new RegionCode(code); }
最後に、同じ
string GetIsoName(string code)
, 例えばprotected override GetIsoName(string code) { return new RegionCode(code).TowLetterISORegionName; }
まrefactorのです。クリスアキンプトン-ジョーンズを的に重要な問題であり、いかどうかについての努力で使い勝手は大きく変わります。
とんがジェネリック医薬品に基づく。だが与えられていたがシュートを放ちます。
編集:としてのコメントは、staticメソッドできませんオーバーライドで一つのオプションを維持で使用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);
}
}