2011-09-22 107 views
8

几天前,我对考试有以下理论问题: (a)解释在处理 程序时可能发生的特殊情况时防御性编程的含义。您可以参考在课堂上看到的示例或使用伪代码来描述在尝试读取文件时防止发生某些情况 所采取的步骤。 (b)简要描述Java中异常处理 的含义,以及这与防御性编程有何不同。 [5 marks]防御性编程和异常处理

我一直认为防御性编程是编程的全部范例,异常处理是其中的一部分。 在考试期间,我在“防守性编程”中写道,程序员在执行逻辑代码之前尝试找出所有可能的问题,并在稍后返回来自此函数的错误值(例子0),而在异常处理中发生潜在错误并且被特殊机制捕获,其中直接解释这些错误。这样对吗?什么应该是正确的答案?

+0

有人已经投票决定关闭的题外话。 WTF?这个问题是根据“我应该在考试中写什么”的方式来表达的,但这是不是一个关于编程的问题? –

回答

1

对我而言,防御性编程意味着编写代码来处理您认为不会或甚至可能发生的情况,因为您认为自己的信仰不可靠。

例如(未编译或测试,条款和条件适用):

private String findSmallestString(Collection<String> strings) { 
    if (strings == null || strings.isEmpty()) return null; 
    Iterator<String> stringsIt = strings.iterator(); 
    try { 
     String smallestString = stringsIt.next(); 
     while (stringsIt.hasNext()) { 
      String candidateString = stringsIt.next(); 
      if (candidateString == null) continue; 
      if (candidateString.compareTo(smallestString) < 0) { 
       smallestString = candidateString; 
      } 
     } 
     return smallestString; 
    } 
    catch (NoSuchElementException e) { 
     return null; 
    } 
} 

在那里,可以说是防御功能包括:

  • 顶部的空值或空后卫子句;这是一种私有方法,因此您应该确保它永远不会被调用为空或空集合。
  • NoSuchElementException的try-catch;你可以证明它所包含的代码在迭代器履行合同时不会抛出这个异常。
  • 从迭代器出来的字符串(不是第一个!)的无效保护子句;再次,由于这是一种私人方法,因此您应该可以确保收集参数不包含空值(并且无论如何您会将空值置入收藏中?)

不是所有人都会同意null检查是防御性的。尝试抓住是完全没有意义的。

对我来说,防守编程的酸性测试就是你不认为防守会被使用。

2

对我来说,防御性编程是最坏的情况:你的用户是完全疯狂的人,你必须为他们的疯狂投入辩护自己和你的程序。我相信在这篇报价中有很多的智慧:

每一天,软件行业都在制造更大更好的傻瓜式软件,而且每一天,大自然都在变得越来越愚蠢。到目前为止,大自然正在赢得大奖

永远不要忘记,你的用户不仅是你的客户。如果您对图书馆API负责,则您的用户可能是其他部门。在这种情况下,大多数恒星之一笙歌我听说过在我的生活是:

即使我们删除所有失败的单元测试,程序没有工作

+1

简洁而有力地摆放。然而,我会走得更远:假设你的用户是疯狂的人,疯狂的投入不是防御性的,这是正常的;假设*你自己*是一个疯狂的人,使疯狂的投入是防御性的。 –