标签: preconditions

ReSharper好奇心:"参数仅用于前置条件检查."

为什么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)

c# resharper preconditions

92
推荐指数
4
解决办法
1万
查看次数

什么是番石榴checkNotNull的重点

我是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,如果它不为空.

我很困惑,这可能是有史以来最愚蠢的问题,但......

这有什么意义?考虑到我能想到的任何情况,这两行与结果完全相同.

我甚至认为后者更具可读性.

所以我一定错过了什么.它是什么?

java null preconditions guava

64
推荐指数
3
解决办法
3万
查看次数

测试前提条件的不同方法的优缺点?

在我的脑海中,我可以想到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只是愚蠢.

c# assert constraints code-contracts preconditions

17
推荐指数
1
解决办法
3797
查看次数

慢斯卡拉断言

我们最近一直在分析我们的代码,我们遇到了一些恼人的热点.他们是在形式

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)

这样它会懒洋洋地评估.鉴于它没有定义,是否有一种内联方式调用断言与一个懒惰评估的消息参数?

谢谢

performance profiling assert scala preconditions

12
推荐指数
2
解决办法
1519
查看次数

提供给Google Guava的Preconditions.*方法的正确错误信息是什么?

例如,当使用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)

java exception preconditions guava

12
推荐指数
1
解决办法
1216
查看次数

检查.NET中的前提条件

我是"早期失败"策略的粉丝,并希望检查方法params是否具有正确的值.在Java中我会使用像Guava这样的东西:

checkArgument(count > 0, "must be positive: %s", count);
Run Code Online (Sandbox Code Playgroud)

.NET有类似的东西吗?

.net validation code-contracts preconditions

12
推荐指数
2
解决办法
2412
查看次数

空检查错误消息为"为空"或"为空"

在Java代码中执行空检查,并且为空值抛出IllegalArgumentExceptions时,您使用什么类型的消息模板?

我们倾向于使用这样的东西

public User getUser(String username){
   if (username == null){
     throw new IllegalArgumentException("username is null");   
   }
   // ...
}
Run Code Online (Sandbox Code Playgroud)

更好的是:"为空"或"为空",为什么?

对我来说,"无效"感觉更自然.

java preconditions illegalargumentexception

11
推荐指数
2
解决办法
3750
查看次数

不能削弱先决条件和加强后置条件也违反Liskov替代原则吗?

子类型的实际前提是通过(使用逻辑组合创建的OR)的基类型的先决条件亚型的先决条件,这使得所得的先决条件 的限制较少

子类型的实际后置条件是通过(使用逻辑组合创建的AND)碱型的后置一个亚型的后置条件,这使得所得的后置条件 更严格的

以下是加强前提条件弱化后置条件的例子,因此违反了LSP(Link):

  1. 假设您的基类使用成员int.现在你的子类型要求int为正数.这是强化前置条件,现在任何在使用负数之前完全正常工作的代码都会被破坏.

  2. 同样,假设相同的场景,但基类用于保证成员在被调用后是正面的.然后子类型更改行为以允许负的int.由于不支持后置条件,因此对该对象起作用的代码(并假设后置条件为正int)现在已被破坏.

a)当重写方法削弱前提条件时,为什么它也不被视为违反LSP ,因为此方法可以使用基类型合约不可接受的参数.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?

乙)为什么是不是也认为是违反LSP时覆盖的方法加强后置条件,因为客户端调用此方法将只接收的原始方法的可能结果的一个子集.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?

例:

基类后置条件保证方法的返回值在范围内1-10,但子类型后置条件更改为仅允许返回值在范围内2-9.现在,由于不支持后置条件,因此破坏了从此方法返回的对象的代码(并假设后置条件在一个范围内1-10).

inheritance liskov-substitution-principle preconditions post-conditions

9
推荐指数
1
解决办法
2195
查看次数

使用前置条件测试Swift代码

你如何为具有前提条件的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的前提条件?

preconditions xctest swift

9
推荐指数
1
解决办法
980
查看次数

Kotlin中的前提条件功能 - 良好实践

我想知道,作为一个新手Kotlin编码器,是否有一些良好的实践甚至语言结构来声明函数的前置条件.

在Java中,我一直在使用Guava的Preconditions检查实用程序:

https://github.com/google/guava/wiki/PreconditionsExplained

经过一些进一步的调查后,我遇到了require函数:

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/require.html

这通常用于检查函数的前提条件吗?

preconditions kotlin

9
推荐指数
1
解决办法
1360
查看次数