在我的工作领域,我们的代码必须是优质的。
所以,我们专注于两件主要的事情:
这些才能带来真正的收益。
我建议人们在开发环境中编写专制的代码,在生产环境中编写仁慈的代码。
在开发过程中,您希望尽早捕捉到不良数据/逻辑/代码,以防止问题被忽略或导致更晚出现的问题,其中根本原因很难追踪。
在生产中,尽可能优雅地处理问题。如果某些情况确实是无法恢复的错误,则处理并向用户呈现该信息。
这里举个例子,我们的代码用于规范化向量。 如果在开发中提供错误数据,它将会报错;而在生产中则会返回安全值。
inline const Vector3 Normalize( Vector3arg vec )
{
const float len = Length(vec);
ASSERTMSG(len > 0.0f "Invalid Normalization");
return len == 0.0f ? vec : vec / len;
}
我建议在数据进入“组件”或框架时保持防御性。在“组件”或框架内部,人们应该认为数据是“正确”的。
这样想,调用者必须提供正确的参数,否则所有函数和方法都必须检查每个传入的参数。但是,如果只对调用者进行检查,则仅需要进行一次检查。因此,参数应该是“正确的”,因此可以通过传递到较低级别。
如果存在错误并且在调用中使用了错误的值,真正正确的事情是什么?您只有一个指示程序正在处理错误的“数据”,并且有些人喜欢ASSERTS,而其他人则希望使用高级错误报告和可能的错误恢复。无论如何,发现数据是有缺陷的,在少数情况下,继续处理它是好的。(请注意,至少不会出现服务器死机的情况)
从卫星发送的图像可能是一种尝试进行高级错误恢复的情况...下载自互联网的图像以放置错误图标...
我总是努力防止注入攻击之类的事情。不过,当您在内部局域网站点上工作时,大多数安全功能都感觉像是在浪费精力。虽然我仍然会做它们,但可能没有做得那么好。
嗯,安全方面有一套特定的最佳实践。至少对于数据库应用程序,您需要注意防止 SQL 注入攻击。
其他诸如哈希密码、加密连接字符串等也是标准做法。
从这里开始,具体取决于实际应用程序。
幸运的是,如果您使用 .Net 等框架,许多安全保护措施都已内置。
我认为即使是针对内部应用程序,您也必须始终进行防御性编程,因为用户可能仅凭运气就会写出破坏您应用程序的东西。尽管您可能不必担心他们试图欺骗您赚取金钱,但仍然要始终进行防御性编程并假设应用程序将失败。
使用测试驱动开发肯定会有所帮助。您一次只编写一个组件,然后在编写代码之前枚举所有可能的输入情况(通过测试),以确保您已经涵盖了所有情况,并且没有编写任何没人使用但可能会出错的酷代码。
虽然我不做任何正式的事情,但通常会花一些时间查看每个类,并确保:
这要看情况。
如果我是为自己使用而编写代码,那么我会尽可能编写最好的代码,让编译器成为我的朋友,帮助我发现警告等问题,但我不会仅仅为了创建类型而自动创建。
如果代码很可能被使用,即使只是偶尔使用,我会增加检查的级别。