如何在此处提取代码重复?

时间:2009-12-14 02:27:02

标签: c# .net refactoring dry

我试图在提取方法中提取出常见的代码模式,但是找不到Presenter类型的正确类型。有帮助吗?

public bool CanGotoHome 
{ 
    get { return !(CurrentPresenter is IHomePresenter) && IsLoggedIn; } 
}
public bool CanGotoImportanceOfAimsAndObjectives 
{ 
    get { return !(CurrentPresenter is IImportanceOfAimsAndObjectivesPresenter) && IsLoggedIn; } 
}
public bool CanGotoGotoAimsAndObjectives 
{ 
    get { return !(CurrentPresenter is IAimsAndObjectivesPresenter) && IsLoggedIn; } 
}

4 个答案:

答案 0 :(得分:13)

使用泛型

private bool SomeFuncName<T>()
{
    return !(CurrentPresenter is T) && IsLoggedIn;
}

用法:

public bool CanGotoGotoAimsAndObjectives { 
    get { return SomeFuncName<IAimsAndObjectivesPresenter>(); } 
}

答案 1 :(得分:2)

对我而言,如果对象只知道它应该如何行动,那似乎会更容易。

class BasePresenter
{
    public bool CanGotoHome 
    { 
        get { return IsLoggedIn; } 
    }
}

class HomePresenter : BasePresenter
{
    public bool CanGotoHome 
    { 
        get { return False; } 
    }
}

然后对其他方法做同样的事情。这似乎更简单,更清晰。

答案 2 :(得分:1)

这段代码看起来很奇怪...如果只有那3行,为什么还要创建一个通用方法来重构它们呢?它不会为你节省那么多重复。

OTOH,如果有更多,那么此代码看起来像典型的功能/权限查询。如果你有超过3种类型,并且这些功能在其他情况下可能会变得更复杂,那么为什么不将它们加载到presenter_capabilities数据库表中(如果你在企业系统中,甚至AD也加载...) ?检查“基于能力的安全性”是否不是您真正想要的。

至于代码本身,我会选择以下内容:

public bool GetCapability(Caps cap) { 
   return IsLoggedIn && CapabilityResolver.Check(CurrentPresenter, cap);
   // or even
   // return CapabilityResolver.Check(CurrentPresenter, cap, IsLoggedIn);
}

// usage
whatever.GetCapability(Caps.CanGoHome);

如果规则变得更复杂,或者添加任何新的大写/接口,则可以避免重新编译。如果它们非常静态,你可以通过一些哈希来解决它们。

答案 3 :(得分:1)

基于代码示例,我有点想在这里使用内置的主体/角色定义,以及一些字符串常量:

static bool IsInRole(string role) {
    if (string.IsNullOrEmpty(role)) return true;
    IPrincipal principal = Thread.CurrentPrincipal;
    return principal == null ? false : principal.IsInRole(role);
}
public bool CanGotoHome   
    get { IsInRole(AccessRights.GotoHome); } 
}

虽然这可能只是将责任转移到创建适当的自定义主体......