根据anti-if campaign,最好不要在我们的代码中使用ifs。任何人都可以告诉我是否有可能摆脱这段代码中的if?
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(OrganisationInput organisationInput)
{
if (!this.ModelState.IsValid)
{
return View(organisationInput.RebuildInput<Organisation, OrganisationInput>());
}
var organisation = organisationInput.BuildEntity<Organisation, OrganisationInput>();
this.organisationService.Create(organisation);
return this.RedirectToAction("Index");
}
答案 0 :(得分:13)
答案 1 :(得分:4)
因为你问:是的,有可能。
使用返回ActionResult的抽象方法创建一个抽象类,该方法通过工厂方法创建,该方法使用Func的字典,该字典基于从模型计算的Controller状态创建A子类实例(在您的情况下,来自controllerInstance.Model) .IsValid属性值)。
示例代码:
public abstract class ModelStateValidator
{
private Controller controller;
protected Controller Controller {
get { return controller; }
}
public abstract ActionResult GetResult();
#region initialization
static ModelStateValidator() {
creators[ControllerState.InvalidModel] = () => new InvalidModelState();
creators[ControllerState.ValidModel] = () => new ValidModelState();
}
#endregion
#region Creation
private static Dictionary<ControllerState, Func<ModelStateValidator>> creators = new Dictionary<ControllerState, Func<ModelStateValidator>>();
public static ModelStateValidator Create(Controller controller) {
return creators[GetControllerState(controller)]();
}
private static ControllerState GetControllerState(Controller c) {
return new ControllerState(c);
}
internal class ControllerState
{
private readonly Controller controller;
private readonly bool isModelValid;
public ControllerState(Controller controller)
: this(controller.ModelState.IsValid) {
this.controller = controller;
}
private ControllerState(bool isModelValid) {
this.isModelValid = isModelValid;
}
public static ControllerState ValidModel {
get { return new ControllerState(true); }
}
public static ControllerState InvalidModel {
get { return new ControllerState(false); }
}
public override bool Equals(object obj) {
if (obj == null || GetType() != obj.GetType()) //I can show you how to remove this one if you are interested ;)
{
return false;
}
return this.isModelValid == ((ControllerState)obj).isModelValid;
}
public override int GetHashCode() {
return this.isModelValid.GetHashCode();
}
}
#endregion
}
class InvalidModelState : ModelStateValidator
{
public override ActionResult GetResult() {
return Controller.View(organisationInput.RebuildInput<Organisation, OrganisationInput>());
}
}
class ValidModelState : ModelStateValidator
{
public override ActionResult GetResult() {
return this.Controller.RedirectToAction("Index");
}
}
另外80行,4个新类删除单个if。
你的用法,而不是if,调用这样的方法:
ActionResult res = ModelStateValidator.Create(this).GetResult();
注意:当然应该调整它来修改原始问题中ifs之间的代码,这只是一个示例代码:)
增加额外的不必要的复杂性? YES。
包含ifs? NO。
你应该用吗?自己回答:)
答案 2 :(得分:1)
使用三元运算符:-) 情况更糟,但不是if。
答案 3 :(得分:0)
在这种情况下,它是有效的,因为它只能是两种状态之一。反if运动似乎更适合无休止的开放式if / else / switch语句。看起来像一个很好的活动!
答案 4 :(得分:0)
你可以使用While循环......但这似乎是一个美化的if语句。
private static bool Result(bool isValid)
{
while(!isValid)
{
return true;
}
return false;
}