命名和函数结构

时间:2013-12-11 19:30:25

标签: c# oop coding-style

这是我第一次在这里发帖提问,所以如果我做错了什么请纠正我。我很难找到命名函数的正确方法。 我应该首先说我正在开发一个Windows Phone项目,使用的语言是C#。 我有一个名为Ride的课程,如下所示:

public class Ride
{
  public Destination {get; set;}
  public Arrival {get;set;}
  .... 
  public bool IsValid(ErrorLevel level = ErrorLevel.Throw)
  {
    try{
     if(something_is_not_valid)
        throw new SomeException("some message that should be displayed");
     return true; //if it gets here it means it's valid
    }
    catch{Exception){
      if(level == ErrorLevel.Throw) //if I want to throw the exception
         throw;
      return false; //return false, because it's not valid
    }
  }
}

我想找到您对IsValid功能的看法。我在我的代码中使用它:

public void DoSomethingWithARideOnlyIfItsValid(Ride ride){
   try{
     ride.IsValid();
     //if it gets here, it means
     //that the function didn't throw an error
     rideManager.DoSomething(ride);
   }
   catch(Exception ex){
     MessageBox.Show(ex.Message);
   }
}

因此,IsValid函数可以接收ErrorLevel参数,该参数可以是Throw或Return。在某些情况下,我只想查看函数返回的内容,并将ErrorLevel.Return作为参数发送,但在大多数情况下,如果验证失败,我希望它抛出一条带有消息的异常,这样我才能直接向用户显示。它太臭了......所以我做错了什么。我考虑过将名称更改为Validate,但这并没有让它变得更好。 另一个解决方案是使用属性IsValid,它只返回true或false,以及一个函数Validate(),如果出错,它将返回一条消息,这样我就可以向用户显示它。你有什么其他的建议? 谢谢!

3 个答案:

答案 0 :(得分:2)

我会创建一个类

public class ReturnClass
{
    public ReturnClass()
    {
        IsOk = true;
    }

    public bool IsOk { get; set; }
    public string ErrorText { get; set; }
}

然后创建ReturnClass类型的Validate函数的返回值。在validate函数中,如果出现错误,则将IsOk设置为false,并在属性ErrorText中写入错误文本。

答案 1 :(得分:0)

我认为你应该摆脱所有ErrorLevel的东西。它使代码复杂化,并且很难说出该方法的作用。

对我来说IsValid()似乎应该返回是/否答案,并且只有在出错时才抛出异常。

public class Ride
{
    public Destination {get; set;}
    public Arrival {get;set;}
    .... 

    public bool IsValid()
    {
        if (Arrival == null)
        {
            throw new ArgumentException("Arrival");
        }

        return DoSomethingToValidateDestionationAndArrival();
    }
}

然后您的来电者可以看起来像:

public void DoSomethingWithARideOnlyIfItsValid(Ride ride)
{
    try
    {
        if (ride.IsValid() == false)
         {
             throw new Exception("The ride is invalid");
         }

         //if it gets here, it means
         //that the function didn't throw an error
         rideManager.DoSomething(ride);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

现在您可以访问导致错误的真正异常(它是一个参数错误,这表明该程序有问题),或者它是用户提供的无效Ride。代码也更容易阅读。

答案 2 :(得分:0)

IsValid真的必须尝试;抓住?它不能只是抛出,因为IsValid的任何调用方法都应该尝试;捕获它,因为你想用消息框显示错误。

public class Ride
{
  public Destination {get; set;}
  public Arrival {get;set;}
  .... 
  public void Validate(ErrorLevel level = ErrorLevel.Throw)
  {
     if(level == ErrorLevel.Throw) //if I want to throw the exception
         throw;
     if(something_is_not_valid)
        throw new SomeException("some message that should be displayed");
  }
}

在来电者身上做这样的事情?

public void DoSomethingWithARideOnlyIfItsValid(Ride ride){
   try{
     ride.Validate();
     rideManager.DoSomething(ride);
   }
   catch(SomeException ex){
      //...
   }
   catch(Exception ex){
     MessageBox.Show(ex.Message);
   }
}

或者真的,DoSomething(骑)真的做了什么?是为了储蓄吗?它只是验证了什么?这取决于具体情况。你在验证什么?检查属性是否为空?如果是这种情况,那么你可以将它们移动到属性的setter,因为它们有后备字段并将验证移动到DoSomething(ride);