是否有一种模式或最佳选择来改进此方法并减少重复的ifs?
我已经使用Adapter模式将接口转换为另一个接口。
public string GetInvoice(int id)
{
// Search in Mongodb and get the object
var invoice = MongoRepository.Get<IInvoiceEntity>(x => x.Invoice.Id == id)
.First();
if (invoice == null)
{
// Search in SQL
invoice = EFRepository.Get<IInvoiceEntity>(x => x.Invoice.Id == id)
.First();
}
if (invoice == null)
{
// This invoice is an old system item
var oldInvoice = WCFClient.InvoiceService.Get(id);
var adapter = new OldInvoiceAdapter(oldInvoice);
invoice = adapter.AdaptEntity();
}
return invoce.ToJson();
}
谢谢!
答案 0 :(得分:5)
我提取了将发票纳入方法的各种策略(这样可以避免大部分评论的需要),然后简化这种方法,如下所示:
var invoice = GetInvoiceFromMongoDb(id)
?? GetInvoiceFromSql(id)
?? GetOldSystemInvoice(id);
return invoce.ToJson();
这使您的方法非常容易理解,并将您的代码分解为模块,这可能会帮助您更好地遵循单一责任原则。
答案 1 :(得分:4)
返回给定值的模式如果它不为null并且如果它为null则使用不同的值正是null康复运算符(??
)的作用。这可以帮助你写:
var invoice = GetFromMongo(id) ?? GetFromSQL(id) ?? GetFromOldArchive(id);
return invoice.ToJson();