为什么ReSharper会判断我这个代码?
private Control GetCorrespondingInputControl(SupportedType supportedType, object settingValue)
{
this.ValidateCorrespondingValueType(supportedType, settingValue);
switch(supportedType)
{
case SupportedType.String:
return new TextBox { Text = (string)settingValue };
case SupportedType.DateTime:
return new MonthPicker { Value = (DateTime)settingValue, ShowUpDown = true };
default:
throw new ArgumentOutOfRangeException(string.Format("The supported type value, {0} has no corresponding user control defined.", supportedType));
}
}
private void ValidateCorrespondingValueType(SupportedType supportedType, object settingValue)
{
Type type;
switch(supportedType)
{
case SupportedType.String:
type = typeof(string);
break;
case SupportedType.DateTime:
type = typeof(DateTime);
break;
default:
throw new ArgumentOutOfRangeException(string.Format("The supported …Run Code Online (Sandbox Code Playgroud) 我是Guava的新手(说实话,我不是"非常新的",我是这个主题的新手)所以我决定阅读一些文档并在阅读时非常惊讶:
com.google.common.base.Preconditions.checkNotNull(...)
我不明白这个方法的意义.这意味着,而不是做:
myObject.getAnything();
Run Code Online (Sandbox Code Playgroud)
(这可能导致NullPointerExceptionif myObject为null)
我应该用
checkNotNull(myObject).getAnything();
Run Code Online (Sandbox Code Playgroud)
这将抛出NullPointerException如果myObject是空和返回myObject,如果它不为空.
我很困惑,这可能是有史以来最愚蠢的问题,但......
这有什么意义?考虑到我能想到的任何情况,这两行与结果完全相同.
我甚至认为后者更具可读性.
所以我一定错过了什么.它是什么?
在我的脑海中,我可以想到4种方法来检查空参数:
Debug.Assert(context != null);
Contract.Assert(context != null);
Contract.Requires(context != null);
if (context == null) throw new ArgumentNullException("context");
Run Code Online (Sandbox Code Playgroud)
我总是使用最后一种方法,但我刚看到一个使用过的代码片段,Contract.Requires我对此并不熟悉.每种方法有哪些优点/缺点?还有其他方法吗?
在VS2010 w/Resharper中,
Contract.Assert 警告我表达式总是正确的(它怎么知道,我不太确定...... HttpContext不能为空吗?), Contract.Requires 变得淡出它告诉我编译器不会调用该方法(我假设因为前一个原因,它永远不会为null),并且 context != null以下所有代码都会逐渐消失,它会告诉我代码是启发式无法访问的.因此,似乎最后3种方法在VS静态检查器中内置了某种智能,并且Debug.Assert只是愚蠢.
我们最近一直在分析我们的代码,我们遇到了一些恼人的热点.他们是在形式
assert(a == b, a + " is not equal to " + b)
Run Code Online (Sandbox Code Playgroud)
因为其中一些断言可能在代码中被称为字符串concat开始加起来的次数很多.assert定义为:
def assert(assumption : Boolean, message : Any) = ....
Run Code Online (Sandbox Code Playgroud)
为什么不定义为:
def assert(assumption : Boolean, message : => Any) = ....
Run Code Online (Sandbox Code Playgroud)
这样它会懒洋洋地评估.鉴于它没有定义,是否有一种内联方式调用断言与一个懒惰评估的消息参数?
谢谢
例如,当使用Preconditions.checkArgument时,错误消息是否应该反映通过案例或有问题的检查失败的情况?
import static com.google.common.base.Preconditions.*;
void doStuff(int a, int b) {
checkArgument(a == b, "a == b");
// OR
checkArgument(a == b, "a != b");
}
Run Code Online (Sandbox Code Playgroud) 我是"早期失败"策略的粉丝,并希望检查方法params是否具有正确的值.在Java中我会使用像Guava这样的东西:
checkArgument(count > 0, "must be positive: %s", count);
Run Code Online (Sandbox Code Playgroud)
.NET有类似的东西吗?
在Java代码中执行空检查,并且为空值抛出IllegalArgumentExceptions时,您使用什么类型的消息模板?
我们倾向于使用这样的东西
public User getUser(String username){
if (username == null){
throw new IllegalArgumentException("username is null");
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
更好的是:"为空"或"为空",为什么?
对我来说,"无效"感觉更自然.
子类型的实际前提是通过(使用逻辑组合创建的OR)的基类型的先决条件和亚型的先决条件,这使得所得的先决条件 的限制较少
子类型的实际后置条件是通过(使用逻辑组合创建的AND)碱型的后置和一个亚型的后置条件,这使得所得的后置条件 更严格的
以下是加强前提条件和弱化后置条件的例子,因此违反了LSP(Link):
假设您的基类使用成员int.现在你的子类型要求int为正数.这是强化前置条件,现在任何在使用负数之前完全正常工作的代码都会被破坏.
同样,假设相同的场景,但基类用于保证成员在被调用后是正面的.然后子类型更改行为以允许负的int.由于不支持后置条件,因此对该对象起作用的代码(并假设后置条件为正int)现在已被破坏.
a)当重写方法削弱前提条件时,为什么它也不被视为违反LSP ,因为此方法可以使用基类型合约不可接受的参数.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?
乙)为什么是不是也认为是违反LSP时覆盖的方法加强后置条件,因为客户端调用此方法将只接收的原始方法的可能结果的一个子集.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?
例:
基类后置条件保证方法的返回值在范围内1-10,但子类型将后置条件更改为仅允许返回值在范围内2-9.现在,由于不支持后置条件,因此破坏了从此方法返回的对象的代码(并假设后置条件在一个范围内1-10).
inheritance liskov-substitution-principle preconditions post-conditions
你如何为具有前提条件的Swift方法编写测试?这是一个例子:
func doublePositive(n:Int) -> Int {
precondition(n >= 0)
return 2*n
}
Run Code Online (Sandbox Code Playgroud)
使用XCTAssertThrowsError不起作用:
func testDoublePositive() {
XCTAssertEqual(10, testObject.doublePositive(5)) // Works
XCTAssertThrowsError(testObject.doublePositive(-1)) // Breaks
}
Run Code Online (Sandbox Code Playgroud)
这在运行测试时会生成错误:
线程1:EXEC_BAD_INSTRUCTION(代码= EXCI386_INVOP,子代码= 0x0)
有没有办法测试Swift的前提条件?
我想知道,作为一个新手Kotlin编码器,是否有一些良好的实践甚至语言结构来声明函数的前置条件.
在Java中,我一直在使用Guava的Preconditions检查实用程序:
https://github.com/google/guava/wiki/PreconditionsExplained
经过一些进一步的调查后,我遇到了require函数:
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/require.html
这通常用于检查函数的前提条件吗?
preconditions ×10
java ×3
assert ×2
c# ×2
guava ×2
.net ×1
constraints ×1
exception ×1
inheritance ×1
kotlin ×1
liskov-substitution-principle ×1
null ×1
performance ×1
profiling ×1
resharper ×1
scala ×1
swift ×1
validation ×1
xctest ×1