代码之家  ›  专栏  ›  技术社区  ›  Adam Liss

健壮性最佳实践[已关闭]

  •  10
  • Adam Liss  · 技术社区  · 17 年前

    我刚遇到 this question vs。

    • 以允许设备继续运行的方式最大限度地处理每个错误。

    • 尽快 发生编程错误或致命错误后。

    我们都接受过验证输入的培训,以防止设备因用户(或其他外部)输入而损坏;始终假设数据可能无效,并对其进行相应的测试。

    具体的 您遵循哪些实践来确保健壮性? 例子很有帮助,但我也对 这是普遍适用的。

    10 回复  |  直到 9 年前
        1
  •  7
  •   jkchu Zak    7 年前

    我非常喜欢“中描述的技术” The Pragmatic Programmer “。我也使用 TDD

    • 经常考试。早点测试。自动测试
    • 不要重复你自己
    • 使用破坏者来测试你的测试
    • 对异常问题使用异常
    • 不要使用手动程序

    这些似乎都是常识,但令人惊讶的是,当团队面临最后期限时,他们会如此迅速地偏离这些基本原则。

        2
  •  6
  •   Adam Liss    17 年前

    我喜欢这首歌

        3
  •  5
  •   Jason Hernandez    17 年前

    听起来你已经有两个了:
    http://en.wikipedia.org/wiki/Fail-fast
    故障保险。 http://en.wikipedia.org/wiki/Fail-safe

    这三个可能比其他任何一个都更适合我:


    风格元素 “由斯特伦克和怀特来编程。

    每隔10分钟左右问问自己:“这是不是很蠢?”说实话。这个更难。

        4
  •  2
  •   Jonas    17 年前

    我试着用 Design by contract 尽可能多。但我发现这在我的工作领域很少实用。

        5
  •  2
  •   Johannes Schaub - litb    17 年前

    我是你的粉丝 初始化局部变量。需要时,应设置它们。否则,阅读您的代码的程序员可能会像中一样感到困惑 "hmm why is this 0 at the beginning..." . 如果你没有初始化它,很明显它还没有被使用。

        6
  •  2
  •   Community Mohan Dere    9 年前

    我喜欢。。。 limit values in (java)doc . (参数是否可以为空?是否可以为空?)

    该文件还明确区分了以下内容: static and runtime exceptions . 这样,如果为了提高健壮性,程序必须尽快失败,我知道它是因为预见到的异常(静态,必须在编码时通过捕获或重新抛出处理),还是因为参数不正确(运行时异常,仅在应用程序生存期内检测到)。

        7
  •  2
  •   Adam Liss    17 年前

        8
  •  2
  •   Jim C    17 年前

    偏执狂是程序员的生存特征。不断地问自己这怎么会失败?然后试着找出如何防止失败。

        9
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    我实施了多种方法来防止和恢复错误:

    1) 处理所有异常。正如你所说,“处理每一个错误”。如果用户单击表单上的按钮,应用程序不可能从未处理的异常中消失(“poof”)。因此,我用一个通用的try-catch包装事件处理程序。

    IRestartable IReusable . 任何没有实现它的对象在使用一次后都必须扔掉。

    4) 永远不要假设线程安全。我从中学到了.NET非常多线程。许多事件在任意线程上处理。用.NET编写的给定应用程序可以有多个同时执行的线程,而没有一行代码显式创建线程。

    5) 很简单,但我仍然看到它的发生。避免像瘟疫一样的全球性疾病。我看到过包含数百个未使用/重用变量的代码。这是一个混乱的弄清楚和重构。

        10
  •  1
  •   Olof Forshell    15 年前

    硬件总是会出现故障,除此之外,还存在从外部进入系统的无效数据问题。我在这些领域的解决方案通常是精心设计的(为安全而设计),而在几乎所有其他领域的设计都是为失败而设计的,基本上只有极其简单的代码,根本没有数据验证。

    为了进行调试,我有时编写不应输入的条件代码,该代码包含除零或类似的内容,以便在处理进入时立即调用调试器。

    我通常不初始化本地堆栈变量,因为编译器告诉我哪些需要初始化,哪些可以完全忽略。

    推荐文章