当前位置: 首页 > 编程语言 > C#

BestPracticeReturnValuesandExceptionsSharingwithEnum

时间:2023-04-10 20:40:38 C#

BestPracticeReturnValuesandExceptionsandEnum我试图找出具有多个结果值的方法的优点和缺点。例如,我正在使用登录方法。如果登录成功就pass,否则我要知道为什么会失败。1.返回true或false(信息不足)boolLogin(stringuser,stringpassword);2.成功则返回true,否则抛出异常没有什么。如果不成功,则抛出异常publicclassUnknownUserException:Exception{}publicclassWrongPasswordException:Exception{}voidLogin(stringuser,stringpassword);4.返回枚举值enumLoginResult{SuccessfulUnknownUser,WrongPassword}LoginResultLogin(stringuser,stringpassword);“登录”只是一个例子。我想知道不同实现的优缺点是什么,在哪些情况下它们或多或少是合适的。当然,这取决于某些情况,但让我在这里提供一些主观意见:我确信应该避免这种情况。该方法的名称说明它只是执行类似“登录”的操作。根据方法名称,我们不能期待任何结果。您喜欢返回bool值的方法吗,它最好命名为IsLoggedIn(userName)。此外,您永远不知道是否需要扩展返回的值集。所以枚举在这里也更好,考虑到值的目标要反映在枚举名称中而不是简单的bool中。同上。这里的异常有助于暂停整个执行层次结构(当然,它可以在调用堆栈中包含多个方法),而不是仅仅返回一个结果并让调用者做出适当的决定。对我来说,更灵活的解决方案。在当前情况下,我仅使用异常进行参数验证。像“错误的用户名/密码”这样的情况也不例外。从用例的角度来看,它们是正常的。例外情况是空参数或错误的参数格式。如果您不需要方法返回值,那就是要走的路。不要忘记您不应该使用异常进行导航。我的意思是UserSuccessfullyCreatedException左右。正如我上面提到的,这对我来说是最好的方法。唯一的一点是不要将ValidationException作为枚举值。你有例外。因此,枚举结果加上验证异常是一种方法。如果你想收集方法执行期间的所有错误,你可能希望创建特殊的LoginOperationResult类来包装方法执行期间发生的所有信息(包括验证错误)。类OperationResult{公共OperationStatus状态{得到;放;}公共IEnumerable错误{得到;放;}//或异常列表}classLoginOperationResult:OperationResult{//登录结果特定数据。}enumOperationStatus{Success,Denied,ValidationFailed,//etc.}你会得到更多自以为是的答案,如果我这样做的话,我会结合3和4。抛出LoginFailedException并枚举解释原因。voidLogin(stringuser,stringpassword);//或者返回一个布尔值(虽然冗余)classLoginFailedException:ApplicationException{publicLoginFailReasonReason{get;私有集;}publicLoginFailedException(LoginFailReasonreason){this.Reason=reason;}}enumLoginFailReason{UnknownUser,WrongPassword}选择例外选项的原因:假设您选择只返回方法,您的api的用户(可能是客户或其他开发人员)可能会忽略该API。instance.Login(用户,密码);varaccountInfo=instance.GetAccountInfo();//假设已登录;会爆炸谁知道他们必须这样做if(instance.Login(user,password)==LoginResult.Successful)){varaccountInfo=instance.GetAccountInfo();所以,IMO,抛出一个异常,说出于这样那样的原因我无法处理您的登录请求。更简单。绝对不例外。登录失败几乎不是“异常”情况,它只是应用程序的正常逻辑过程。如果您使用异常,那么除了处理登录失败的情况外,您将始终使用异常处理程序包装登录。这似乎是在使用逻辑流程异常定义,这是不正确的。如果您需要返回特定信息(登录功能并不总是需要,但可能是您的情况),#4似乎是合理的。您可以更进一步,使它成为一个对象:publicclassLoginResult{//状态枚举//更具体消息的字符串//成功登录时的有效用户对象//等等}或者,取决于它是逻辑的、不可变的结构而不是类。(确保结构是不可变的,可变结构只是自找麻烦。)重点是您可以在结果对象本身上应用各种逻辑和函数,这似乎是您前进的方向。我通常在我的项目中使用这种方法:Signature:boolTryLogin(stringusername,stringpassword,outUseruser);用法:用户用户;if(userService.TryLogin(username,password,outuser))){//对用户做一些事情}else{//显示“登录失败”}你可以扩展它来返回你的枚举:Signature:enumLoginResult{SuccessfulUnknownUser,WrongPassword}LoginResultTryLogin(stringusername,stringpassword,outUseruser);用法:以上是《C#学习教程:返回值与异常最佳实践》和Enum分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—User用户;登录结果登录结果;if((loginResult=userService.TryLogin(username,password,outuser))==LoginResult.Successful){//dostuffwithuser}else{//dostuffwithloginResult}本文收集自网络,非原创代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: