【问题标题】:Is there another way to do this case statement without using -MAXINT?是否有另一种方法可以在不使用 -MAXINT 的情况下执行此 case 语句?
【发布时间】:2013-09-16 05:10:47
【问题描述】:

我有一个 case 语句,它为结果代码评估整数(函数的结果),如下所示:

  R:= DoSomething;
  case R of
    0: begin
      //Success
    end;
    1..99: begin
      //Specific result messages
    end;
    100..199: begin
      //Other specific result messages
    end;        
    -MAXINT..-1: begin
      //Failure
    end;
  end;

如果失败,则返回一个表示错误代码的负数。 DoSomething 是任何返回整数作为响应代码(或错误代码,为负数)的函数。如果它是一个错误,它会被传递给另一个错误处理程序。如果它是成功的,它会被传递给一个成功处理程序(继续等)。正值将由各种特定的处理程序处理。

我想知道是否有另一种写法-MAXINT..-1。更多类似于“任何 -1 及以下”​​的内容。我试过<=-1,但编译器不太喜欢。

有没有办法在案例陈述中做到这一点?

【问题讨论】:

  • 什么是正值?
  • @IgnacioVazquez-Abrams 好吧,这些将由其他案例陈述处理,但我不想在这个问题中包括所有可能的陈述,因为这些不一定相关(尽管同样适用于积极)
  • 最后会有很多具体的正数,我会在1..99、100..199、200..299等范围内处理。但这些细节与问题。
  • 我不同意。 :-) 这个细节与问题高度相关。没有它,您根本不需要case。您应该进行编辑以至少包含有关处理正数的评论。 (如果有那个细节,我就不会在这里发表我的评论,也不会对拉里关于强制不必要的case 的回答发表评论。)
  • 请注意,最小整数值为- MAXINT - 1。 - MAXINT 是 MAXINT 符号已更改。

标签: delphi switch-statement


【解决方案1】:

对所有未处理的结果使用else 块,并在该块中区分执行失败和您没有显式处理程序的成功执行(最后一种情况是您似乎没有考虑过的情况)您的示例代码)。

  R:= DoSomething;
  case R of
     0: begin
       //Success
     end;
     1: begin
       // Another success
     end
     else begin
        if R >= 0 then 
           // Unhandled successful execution error
        else 
           //Failure
       end;
   end;

【讨论】:

  • 不一定需要R >= 0,只需R > 0
  • 从技术上讲,您只需要R > LAST_HANDLED_RETURN_CODE。但是,如果您正在管理大量案例,那么else 块将报告任何从显式处理案例列表中意外删除的 R 案例,这将是一个很好的防御性编程。如果你写 R > 0 然后去掉 0 的情况,你的程序会给你一个错误信息,就好像函数返回了一个失败代码,而事实上,它会返回一个你忘记处理的成功代码。
  • @Ken:根据 cmets 的说法,真正的问题涉及一长串 cases。如果只有三种情况,if 语句会更合适。但是对于 10 或 20 个并行案例,我认为 OP 使用 case 是正确的。当然,另一种选择是将case 嵌套在if 中,以便仅将正值提交给大小写开关,但在未处理的情况下case 中仍需要else成功代码。
  • @Larry:如果特定的愿望是故意忽略大于 0 的值,则不涉及“防御性编程”——您故意忽略了它们。但是,基于杰里实际想要处理积极因素的“不相关细节”(如他对问题的评论中所示),我上面的评论不再适用(这是基于他所说的仅处理 @987654334 的值@ 和 < 0)。他改变了问题,我将删除评论。 :-)
  • +1;我喜欢你将代码嵌套成简洁易读的代码的方式。
【解决方案2】:

您试图强制使用严格的 case,而您应该使用 if 和 case 的组合:

if R = 0 then
  // Success
else 
  if R < 0 then
    // Failure
  else
  begin  // Positive values
    case R of
       1..99: ...
     100..199: ...
     // Other expected values
     else
       // Unexpected positive value
     end;
  end;

我个人会格式化以上内容以使流程更清晰,但这是我自己的偏好:

if R = 0 then
  // Success
else if R < 0 then
  // Failure
else
begin  // Positive values
  case R of
     1..99: ...
   100..199: ...
   // Other expected values
   else
     // Unexpected positive value
   end;
end;

或者,更好(正如拉里在对我的回答的评论中提到的,但奇怪的是他没有):

if R < 0 then
  // Failure
else
begin
  case R of 
      0:  // Success
      1..99: // Expected positive values
    100..199:
  else
      // Unexpected positives
  end;
end;  

【讨论】:

  • 0 是一个预期结果(我收集的其中一个是许多可能的成功返回代码),在我看来,它应该与它的同行一起处理,作为 case 语句中的另一个预期值。
  • @Larry:好的。那是你的偏好。它也可能是我的,但这不是问题所要问的。 :-) 而且您发布的答案也没有那样处理。编辑以添加该替代方案。
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多