我有以下代码:
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来做到这一点?
最好和最简单的方法是什么?
由于
答案 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)
也许只使用一个方法和一个值为First
,Second
,Finished
等的枚举?这很难说,因为除了那张支票之外,你没有说什么是常见的。 AOP可能是一种解决方案,但也许不是,因为方面在概念上通常更为通用。
答案 2 :(得分:0)
从“模式”的角度来看,这对我来说似乎并不繁琐。输入以下内容似乎完全合理:
if(!Size)
return;
您明确处理了您想要的案例。在您的情况下,此检查非常适合您正在使用的内容,从我可以告诉的内容(来自您的原始+编辑)。我个人会选择一个更明显的名字,因为它看起来有点奇怪(即使是在原版中),也不是完全明显发生了什么。
即使使用AOP,您也会在每个方法中添加一些其他信息,以确保您的方面得到处理。