有时我发现我需要实现这种模式。有时您想要在执行操作之前执行多次检查。出于效率考虑,除非确实有必要进行检查,否则不进行涉及某些检查的计算。因此,您通常会看到类似以下的代码:
// Check individual fields for proper input
if(fieldsValidated) {
// Perform cross-checks to see if input contains values which exist in the database
if(valuesExist) {
try {
// Attempt insertion
trx.commit();
} catch (DatabaseException dbe) {
trx.rollback();
throw dbe;
}
} else {
closeConnection(db);
throwException();
}
} else {
closeConnection(db);
throwException();
}
通过将验证与执行操作的实际过程分开,可以简化此过程,因此您会看到更多类似的内容:
boolean proceed = true;
// Check individual fields for proper input
if(fieldsValidated) {
// Perform cross-checks to see if input contains values which exist in the database
if(!valuesExist) {
proceed = false;
}
} else {
proceed = false;
}
// The moment of truth
if(proceed) {
try {
// Attempt insertion
trx.commit();
} catch (DatabaseException dbe) {
trx.rollback();
throw dbe;
}
} else {
if(db.isOpen()) {
closeConnection(db);
}
throwException();
}
显然,它会根据您要实现的目标而有所不同,尽管是这样编写的,但是“成功”代码和“失败”代码都只编写了一次,从而简化了逻辑并保持了相同的性能水平。从那里开始,将整个验证级别放入内部方法中是一个好主意,该内部方法返回布尔值指示成功或失败,这进一步简化了事情,尽管有些程序员出于某些奇怪的原因而喜欢极长的方法。