2016-07-15 43 views
1

GetTranslation函数返回一个字符串。如何简化这个C#重复代码?

ExistsHelper函数返回布尔值。

public static class ValidatorNotExistHelper 
{ 
    public static string Country(int id) 
    { 
     return (!ExistsHelper.Country(id)) ? GetTranslation(ConfigTranslationCode.CountryNotExist) : string.Empty; 
    } 

    public static string State(int id) 
    { 
     return (!ExistsHelper.State(id)) ? ConfigTranslationCode.StateNotExist : string.Empty; 
    } 

    public static string City(int id) 
    { 
     return (!ExistsHelper.City(id)) ? ConfigTranslationCode.CityNotExist : string.Empty; 
    } 
} 

正如您可能会注意到代码正在重复的条件语句。只有ExistsHelper和翻译消息的功能不同。任何想法,将不胜感激。

编辑:

我也可以有Overloading,对于一个例子:

public static string City(int cityId, int stateId, int countryId) 
{ 
    return (!ExistsHelper.City(cityId, stateId, countryId)) ? ConfigTranslationCode.CityNotExist : string.Empty; 
} 

public static string City(int cityId, int stateId) 
{ 
    return (!ExistsHelper.City(cityId, stateId)) ? ConfigTranslationCode.CityNotExist : string.Empty; 
} 
+0

如果存在'ExistsHelper.City(id)'* *,则返回'string.Empty'。这样对吗?我怎样才能得到*实际*城市的名字? –

+0

ExistsHelper.City(id)返回'boolean'。 “城市名称”对于此代码并不重要。如果布尔值为true,则代码返回错误消息,否则返回空字符串。 –

回答

0

可以简化泛型一点,但它会让你您的通话更复杂

创建一个接口为

public interface IExists 
{ 
    int id{get;} 
} 

,并确保所有可比类实现它 即

public class City:IExists 

然后你可以做

public static class ValidatorNotExistHelper<T> 
     where T:IExists 
{ 
    public static bool Exists(int id,IEnumerable<T> possibles) 
    { 
     return possibles.Any(p=>p.id == id); 
    } 
    public static string ValidateExists(int id,IEnumerable<T> possibles,string ErrorMessage) 
    { 
     return Exists(id,possibles) ? String.Empty : ErrorMessage; 
    } 
    //using lookup Enum 
    public static bool Exists(ClassTypeEnum type, int id) 
    { 
     return Exists(id,Lookup.GetPossibles(type)); 
    } 
    public static string ValidateExists(ClassTypeEnum type,int id) 
    { 
     return Exists(type,id) ? String.Empty : Lookup.GetError(type); 
    } 
} 
//Enum based lookup 
public static class Lookup<T> 
     where T:IExists 
[ 
    public IEnumerable<T> GetPossibles(ClassTypeEnum type) 
    { 
     switch(type) 
     { 
      case ClassTypeEnum.City: 
       return //source of Cities; 
     } 
    } 
    public IEnumerable<T> GetError(ClassTypeEnum type) 
    { 
     switch(type) 
     { 
      case ClassTypeEnum.City: 
       return ConfigTranslationCode.CityNotExist; 
     } 
    } 
? 
+0

当你的答案开始意识到,也许我正在努力重构可能最终失去简单性的地方? –

+0

它总是一种权衡,一般除非你做的是完全一样的东西,它很少值得,我的意思是相同的电脑看到它不是人类阅读它 – MikeT

+0

另一种选择是添加一个包含城市状态等的枚举,然后使用一个查找类,它返回错误消息和枚举的可能值的来源 – MikeT

1

你可以通过在功能,让您使用的存在性检查,如:

public static class ValidatorNotExistHelper 
{ 
    public static string Country(int id) 
    { 
     return IdToString(ExistsHelper.Country, 
          GetTranslation(ConfigTranslationCode.CountryNotExist), id); 
    } 

    public static string State(int id) 
    { 
     return IdToString(ExistsHelper.State, 
          ConfigTranslationCode.StateNotExist, id); 
    } 

    public static string City(int id) 
    { 
     return IdToString(ExistsHelper.City, 
          ConfigTranslationCode.CityNotExist, id); 
    } 

    private static string IdToString(Predicate<int> exists, string defaultValue, int id) 
    { 
     return (!exists(id)) ? defaultValue : string.Empty; 
    } 
} 

这会成功地分出一些共享逻辑,但会增加一些复杂性。

如果你只有三种这些方法,我会试着让它们保持原样。如果你有很多并且会增加更多,那么这个重构可能是值得的。

+0

我将拥有20多个函数,但在这些函数中,我也会有重载。也许,我应该修改我原来的问题,并提及超载... –

+0

提供重载示例到原始问题。 –

+0

@CoderAbsolute你可以拥有多个版本的'IdToString'来应付重载,但它开始感到笨重 –