需要一个模式来为每个实例方法模式调用Verify方法

时间:2009-04-23 17:17:08

标签: c# .net design-patterns

我有以下代码:

class Foo
{
    public Foo()
    {
        Size = true;
    }

    private bool _size;

    protected bool Size
    {
        get { _size; }
        set { _size = value; }
    }
}

class CrazyFoo : Foo
{
    public void First()
    {
        if (!Size)
            return;
    }

    public void Second()
    {
        if (!Size)
            return;
    }
    public void Finished()
    {
        if (!Size)
            return;
    }
}

实现这种模式的最佳方法是什么,因为它让我疯狂地输入

   if(!Size) return;

也许我可以用属性或AOP来做到这一点?

最好和最简单的方法是什么?

由于

3 个答案:

答案 0 :(得分:1)

如果在太多方法的开头有相同的guard语句,则可以创建一个名为executeWithGuard的方法:

private void executeWithGuard(Action method)
{
    if (HeadSize) method();
}

然后你可以这样做:

public void ScreenFirstShot()
{
    executeWithGuard(() =>
    {
        // code here
    });
}

public void ScreenSecondShot()
{
    ExecuteWithGuard(() =>
    {
        // code here
    });
}
public void CrazyUp()
{
    ExecuteWithGuard(() =>
    {
        // code here
    });
}

执行此操作的代码并不少......事实上,可能有更多代码,但如果您的防护条件发生变化,它确实允许您不必进行查找/替换。不过,我只是建议它作为最后的手段。你真正的问题很可能就是你在调用树下做了太多的验证。如果你能在更高的层次上做到这一点,你可以避免所有这些验证。

同时

查看null object patttern。此模式可用于某些特殊情况,以防止或简化状态检查。

ALSO(第2版)

很难知道你的意图是什么,因为问题集中在一个特定的解决方案上,但如果你按顺序执行这些方法,你可以看看使用strategy pattern,并将检查放在你的基本策略中类。

答案 1 :(得分:0)

也许只使用一个方法和一个值为FirstSecondFinished等的枚举?这很难说,因为除了那张支票之外,你没有说什么是常见的。 AOP可能是一种解决方案,但也许不是,因为方面在概念上通常更为通用。

顺便说一下,未来可能会为您的样品选择不同的命名,这可能会冒犯一些人。 (编辑以匹配新命名)

答案 2 :(得分:0)

从“模式”的角度来看,这对我来说似乎并不繁琐。输入以下内容似乎完全合理:

if(!Size) 
    return;

您明确处理了您想要的案例。在您的情况下,此检查非常适合您正在使用的内容,从我可以告诉的内容(来自您的原始+编辑)。我个人会选择一个更明显的名字,因为它看起来有点奇怪(即使是在原版中),也不是完全明显发生了什么。

即使使用AOP,您也会在每个方法中添加一些其他信息,以确保您的方面得到处理。