【发布时间】:2013-12-11 19:30:25
【问题描述】:
这是我第一次在这里发布问题,所以如果我做错了什么,请纠正我。我只是很难找到命名函数的正确方法。 我应该首先说我正在开发一个 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 函数可以接收可以是 Throw 或 Return 的 ErrorLevel 参数。在某些情况下,我只想查看函数返回什么,并将 ErrorLevel.Return 作为参数发送,但在大多数情况下,如果验证失败,我希望它与消息一起引发异常,以便我可以直接展示给用户。太臭了……所以我做错了什么。我想过将名称更改为 Validate,但这并没有让它变得更好。 另一种解决方案是使用一个属性 IsValid,它只会返回 true 或 false,以及一个函数 Validate(),如果出现问题,它将返回一条消息,以便我可以将其显示给用户。你有什么其他的建议? 谢谢!
【问题讨论】:
-
如果太臭,开窗通风。你说的“太臭”是什么意思?你的意思只是命名约定? “ThrowIfInvalid()”怎么样?
-
您听说过“代码气味”吗? en.wikipedia.org/wiki/Code_smell 应该不错,但我也希望它在某些情况下不抛出异常。我说的不仅仅是名字。如果其他人想使用该函数,他们会对发送给函数的枚举参数感到困惑,并且在某些情况下它返回 true 或 false,并且在某些情况下会引发错误。
-
不知道“代码异味”这个词。不得不承认,“代码味道”是个好东西:)
-
在保护块或验证失败时抛出异常的保护或验证函数并不少见,并且主要是为了方便而提供的。如果提供了这样的方法,最好也提供一个不抛出而是返回布尔值(或“不通过”的另一个适当指示)的变体,因为异常处理对于经常执行的代码来说可能是昂贵的或者是非常时间紧迫的;好吧,有时你不希望代码中到处都是 try-catch 混乱......
标签: c# oop coding-style