我有一个验证方法和一个验证计数器,当错误计数等于一个数字时,我会触发一个事件。如何终止验证过程?也许我应该使用Observer模式?
class ValidationClass
{
private int errorsCount;
private delegate void CompleteHandler();
private event CompleteHandler ValidationComplete;
public int ErrorsCount
{
set
{
errorsCount = value;
if (errorsCount == 20)
{
ValidationComplete();
}
}
get { return errorsCount; }
}
public void ValidationClass()//constructor
{
ValidationComplete += ExcelHelpers_Complete;
}
void Validation_Complete() //
{
//terminate Validate() and return false; how?
}
public bool Validate()
{
for(...){
ErrorsCount++;
for(...){
....
ErrorsCount++;
}
....
//others conditions that increment ErrorsCount
}
}
答案 0 :(得分:0)
让您的订阅者检查错误计数,如果超过您的最大范围则不执行任何操作。如果您的订阅者无权访问发布者对象,则无法在事件本身内传递计数。一旦满足此条件,您的订户也可以取消订阅。
答案 1 :(得分:0)
将以下代码移到Validate()
方法中:
if (errorsCount == 20)
{
ValidationComplete();
}
现在使用break
语句在条件为真时中止循环并在此后引发ValidationComplete()
事件。
您的财产将如下所示:
public int ErrorsCount
{
set { errorsCount = value; }
get { return errorsCount; }
}
和Validate()
方法如下所示:
public bool Validate()
{
for(...){
ErrorsCount++;
if(Check20()) break;
for(...){
....
ErrorsCount++;
if(Check20()) break;
}
if(Check20()) break;
....
//others conditions that increment ErrorsCount
if(Check20()) break;
}
}
private bool Check20()
{
if(ErrorsCount==20)
{
ValidationComplete();
return true;
}
return false;
}
如果你不喜欢所有的重复,你也可以为它创建一个小函数。
答案 2 :(得分:0)
当ErrorCount达到20时,在ErrorsCount setter中抛出一个自定义异常(或者更好的是,创建一个IncrementErrorCount()方法)然后捕获并返回。
try {
...
IncrementErrorCount();
...
} catch(TooManyErrorsException) {
return;
}
这是一种使用控制抛出异常的反模式,但如果这是一种特殊情况,并且如果这是一个客户端应用程序并且这不会发生在循环中,那就没问题。
答案 3 :(得分:0)
另一种方法:很难从缩略代码中判断,但如果所有检查都在循环中,您也可以将检查置于for循环条件中:
{{1}}