问题标签 [defensive-programming]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1099 浏览

c++ - 我可以阻止派生类调用自己的函数吗?(C++)

考虑以下基类,它将计算我调用 CallDerivedFunction 的次数:

除了我之外,其他人将编写实现 DerivedFunction 的派生类。但是,我试图计算调用 DerivedFunction 的次数。

有什么方法可以防止派生类 D 直接调用它自己的 DerivedFunction 实现,例如。不允许:

注意:好的,当然这是一个简化;更普遍的问题是,当我的基类应该充当管理器并为派生类的集合执行跟踪使用模式等操作时,我可以强制派生类通过管理器类调用吗?还是我必须依靠派生类开发人员来做正确的事情?

0 投票
7 回答
251 浏览

c# - 我怎样才能声明派生的“shell”类除了作为重命名之外什么都不做?

我有两种不同类型的字符串在我的代码中传递和使用,两者密切相关,但不应相互混淆。我认为我可以通过拥有两个只是字符串但名称不同的类来帮助自己避免错误,以便方法签名(以及一般的类型不兼容)将强制执行两种不同类型字符串的语义含义。同时,我不想在一百个地方重构 from something = "foo";to 。something.Value = "foo";

第一个想法:

这个想法是,如果我有

,然后尝试用 调用它MyMethod(secondKindVar, firstKindVar);,我会得到一个编译器错误。

我撞到的墙: string被密封了。

第二个想法:创建泛型KindOf<T>类,它只会使用隐式转换运算符接收和吐出值。像这样:

这样我可以做这样的事情:

我击中的墙:KindOf<T>该类似乎没有继承:派生类型中既不存在构造函数,也不存在运算符,这意味着我必须在派生类中重新实现整个基类。代码复制。呸。

所以我觉得我在这里错过了一些基本的东西,也许我已经离开了杂草。对我正在尝试做的事情有任何想法吗?

0 投票
24 回答
44063 浏览

c++ - 对单行 if 或循环使用大括号(即 {})的目的是什么?

我正在阅读我的 C++ 讲师的一些讲义,他写了以下内容:

  1. 使用缩进 // OK
  2. 永远不要依赖运算符优先级 - 始终使用括号 // OK
  3. 始终使用 { } 块 - 即使是单行 //也不行,为什么 ???
  4. 比较左侧的 const 对象 // OK
  5. 对 >= 0 的变量使用无符号 // 好技巧
  6. 删除后将指针设置为 NULL - 双重删除保护 // 不错

第三种技术对我来说不是很清楚:在 a 中放置一条线会得到{ ... }什么?

例如,拿这个奇怪的代码:

并将其替换为:

使用第一版有什么好处?

0 投票
2 回答
128 浏览

c++ - C++ 中的正确形式

可能重复:
这些(bCondition == NULL)和(NULL==bCondition)有什么区别?

this question它说“比较左侧的const对象”比其他方式“更好”。为什么是这样?

0 投票
2 回答
524 浏览

java - 从 Java Map 添加*副本*条目属性图

我想将propertyMap 的副本添加到我的 propertyMap:

上面的代码没有这样做,但希望能传达意图?

最好的方法是什么?我已经阅读了一些关于“克隆”、“防御性复制”、“不可变对象”、Collections.unmodifiable 等的内容,但我比以前更困惑了。

我所需要的,以典型的 SO 风格,是一种更好的方式来写我在代码片段中的意思,拜托。

0 投票
4 回答
665 浏览

asp.net - User.Identity.Name 是否曾经抛出?

我注意到User.Identity.Name当没有用户经过身份验证时似乎返回空字符串,而不是抛出空引用异常。

User.Identity.Name假设永远不会抛出是有效的吗?或者我应该Identity在访问之前检查 null。

0 投票
1 回答
22913 浏览

c++ - C++ 总是使用显式构造函数

阅读以下博客后:

http://xania.org/200711/ambiguous-overloading

我开始问自己“我不应该总是明确定义我的构造函数吗?”

所以我开始阅读比发现这篇文章更多的内容:

http://www.sjbrown.co.uk/2004/05/01/always-use-explicit/

这显示了另一个例子,也解释了他背后的想法。但当然,这是一位博主的想法。

我很高兴听到你们中的一些人的意见,你对这种方式的看法,你对这个主题的经验以及任何一种方式的一些例子都会很好。

0 投票
2 回答
3099 浏览

c# - XmlSerializer - 反序列化枚举时如何设置默认值?

我有一个看起来像这样的类(高度简化):

我从外部源接收 XML 文件。他们的文档指出 Foo 元素在 Bar 属性中只会有“ValueOne”或“ValueTwo”(他们不提供 XSD)。

所以,我像这样反序列化它:

...而且一切正常。

然而,昨晚,他们向我发送了一些看起来像这样的 XML ,而我的反序列化失败了(应该如此):<Foo Bar="" />

有没有一种很好的方法来围绕这个进行防御性编码?理想情况下,我想说“如果这里出现问题,默认使用 ValueOne”。我不想丢弃整个 XML 文件,因为单个属性被破坏了。

0 投票
6 回答
211 浏览

java - 标识符名称中的数字没有问题吗?

由于在C\C++\Java -

int 2a ; //invalid suffix "a" on integer constant

尽管它是有效的语法,但变体名称的其余部分中的数字没有问题吗?

像 -

0 投票
2 回答
211 浏览

objective-c - 访问器方法中的 Objective-C 防御性复制

来自 Java 背景,我在想办法在 Objective-C 中进行防御性编程时遇到了麻烦。
假设SomeClass是可变的并提供了一个复制方法,这是我用 Java 编写的一段典型代码:

我花了一些时间才弄清楚

在将 setter 的参数分配给 customerList 属性之前,会对其进行复制。让我困惑的是写一个合适的吸气剂。到目前为止,它看起来像这样:

它适用于所有内部方法调用,如 self.customerList = ...,但会将直接指针传递给任何造成安全漏洞的外部调用。我正在考虑提供一个不同的公共 getter 来返回一个副本,但想避免它,因为它需要一个非常规的名称。你会如何处理这种情况?
谢谢你。