我被分配了一个项目来开发一组作为存储系统接口的类.要求是该类支持具有以下签名的get方法:
public CustomObject get(String key, Date ifModifiedSince)
Run Code Online (Sandbox Code Playgroud)
基本上该方法应该返回CustomObject与keyif 关联的,并且只有在对象被修改之后才会返回ifModifiedSince.如果存储系统不包含,key则该方法应返回null.
我的问题是:
如何处理其中关键的存在,但该对象的情景已经不被修改?
这很重要,因为使用此类的一些应用程序将是Web服务和Web应用程序.这些应用程序需要知道是返回404(未找到),304(未修改)还是200(OK,这是数据).
我正在权衡的解决方案是:
keyifModifiedSince失败时抛出自定义异常
.我对这三个选项中的任何一个都不满意.我不喜欢选项1和2,因为我不喜欢使用流控制的异常.当我的目的是表明没有价值时,我也不喜欢返回值.
尽管如此,我倾向于选择3.
有没有我不考虑的选择?有没有人对这三种选择中的任何一种都有强烈的感受?
这个问题的答案,转述:
contains
方法并要求调用者在调用之前调用它get(key,
ifModifiedSince),如果key不存在则抛出异常,如果没有修改object则返回null.UNMODIFIED, KEY_DOES_NOT_EXIST).为什么我不能选择答案#1
我同意这是理想的解决方案,但我已经(不情愿地)被解雇了.这种方法的问题在于,在大多数使用这些类的情况下,后端存储系统将是第三方远程系统,如Amazon S3.这意味着一种contains方法需要往返于存储系统,这在大多数情况下会进行另一次往返.因为这会花费时间和金钱,所以不是一种选择.
如果没有这个限制,这将是最好的方法.
(我意识到我没有在这个问题中提到这个重要元素,但我试图保持简短.显然它是相关的.)
结论:
在阅读完所有答案之后,我得出的结论是,在这种情况下,包装器是最好的方法.基本上我会模仿HTTP,包括响应代码和内容正文(消息)的元数据(标题).
这个问题:从Java中的方法返回状态标志和消息的最佳方法与我的相似,但我会用PHP而不是Java(这可能会略有不同).
问题:
有一种方法可以有一个成功的结果(这可能会变成更成功的结果)或一个"有问题"的结果.后者意味着操作失败,但知道原因也很重要.想象一下Authentication类的方法:
public function login($name, $password)
{
if (successful_authentication)
{
report success
}
else
{
report failure, explain why (e.g. wrong name/pass, user banned)
}
}
Run Code Online (Sandbox Code Playgroud)
为成功和失败回报真假都是微不足道的,但如何报告失败的原因呢?
可能的解决方案:
成功时返回true,失败时返回一个字符串,错误代码表示问题:使用PHP可以通过这种方式获得漂亮的干净块,如下所示:
$loginStatus = $auth->login('name', 'pass');
if ($loginStatus === true)
{
doSomething();
}
else
{
if ($loginStatus == 'wrong_login_data')
...
elseif ($loginStatus == 'banned')
...
// or with an array full of error messages:
echo $erroMessages[$loginStatus];
}
Run Code Online (Sandbox Code Playgroud)返回一般状态(状态)对象:非常优雅的解决方案以及面向未来的(如果状态数量不同或以后应该返回其他数据,则没有问题),也许是最好的一个:
$loginStatus = $auth->login('name', 'pass')
if ($loginStatus->isSuccess)
...
else
echo $errorMessages[$loginStatus->errorCode]; …Run Code Online (Sandbox Code Playgroud)我有 3 种方法,其中我在大多数内部方法中进行验证。我想知道验证是否失败以及验证失败时的错误消息。我知道我可以使用异常来执行以下操作来传递错误消息..
String methodA(parms){
try{
return methodB(params);
}
catch(UserDefinedRuntimeException ure){
return ure.getMessage();
}
}
String methodB(params){
try{
return methodC(params);
}
catch(UserDefinedRuntimeException ure){
throw ure;
}
catch(Exception otherException){
//handle Exception
otherException.printStackTrace();
}
}
String methodC(params){
if(params.equals("A")||params.equals("B")||params.equals("C")){
return dosomething();
}
else{
throw UserDefinedRuntimeException("invalid input :params should be in [A,B,C]");
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是很多人说创建异常很昂贵
所以我通过谷歌搜索我发现了另一种方法
像下面..
class Response{
int status;
String errMsg;
}
String methodA(params){
Response response = methodB(params);
if(response.status == 1){
return "success";
}
else{
return response.errMsg;
}
} …Run Code Online (Sandbox Code Playgroud) 我来自.net背景,想知道创建一个方法的可接受方式,该方法返回一个布尔值并修改一个通过参数传入的字符串.我理解字符串在Java中是不可变的,因此下面的代码片段将始终产生一个空字符串.我被限制只返回布尔值.不能抛出例外情况.如果我需要将String类包装在一个StringHolder中,我可以在哪个包中找到它.
public static void DoStuff()
{
String msg = "";
if (GetMessage(msg))
{
System.out.println(msg);
}
}
Run Code Online (Sandbox Code Playgroud) java ×3
exception ×2
control-flow ×1
idioms ×1
parameters ×1
php ×1
return-type ×1
return-value ×1
state ×1
status ×1
string ×1
validation ×1