这是我第一次在这里发帖提问,所以如果我做错了什么请纠正我。我很难找到命名函数的正确方法。 我应该首先说我正在开发一个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(),如果出错,它将返回一条消息,这样我就可以向用户显示它。你有什么其他的建议? 谢谢!
答案 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);