这个词似乎在许多情况下被使用.我能想到的最好的是它们意味着一个无法改变的变量.是不是常数/决赛(你是Java!)是为了什么?
我搜索了这个主题,但除了维基百科之外,我没有找到任何进一步有用的文档或文章.
任何人都可以用简单的语言向我解释它的含义或者向我推荐一些简单易懂的文档吗?
有人能为我提供简单的C#例子,包括协方差,逆变,不变性和反不变性(如果存在这种情况).
到目前为止我见过的所有样品都只是投入一些物体System.Object.
当我编写算法时,我通常会在注释中写下不变量.
例如,一个函数可能返回一个有序列表,另一个函数则期望列出一个列表.
我知道定理证明存在,但我没有使用它们的经验.
我也相信智能编译器[sic!]可以利用它们来优化程序.
那么,是否有可能写下不变量并让编译器检查它们?
如算法简介(http://mitpress.mit.edu/algorithms)所示,练习陈述如下:
输入:数组A [1 ... n]
输出:i,其中A [i] = v或未找到时为NIL
为LINEAR-SEARCH写一个伪代码,它扫描序列,寻找v.使用循环不变量,证明你的算法是正确的.(确保你的循环不变量满足三个必要的属性 - 初始化,维护,终止.)
我没有创建算法的问题,但我没有得到的是我如何决定我的循环不变量.我认为我理解了循环不变量的概念,即在循环开始之前,在每次迭代的结束/开始时始终为真的条件,并且当循环结束时仍然为真.这通常是目标,例如,在插入排序时,迭代j,从j = 2开始,[1,j-1]元素始终排序.这对我来说很有意义.但对于线性搜索?我想不出任何东西,想到循环不变只是听起来太简单了.我明白了什么问题吗?我只能想到一些明显的东西(它是NIL或介于0和n之间).非常感谢提前!
我试图在代码契约中展示不变量,我想我会给出一个排序的字符串列表的例子.它在内部维护一个数组,有额外的空间用于添加等 - 就像List<T>基本上一样.当它需要添加一个项目时,它会将它插入到数组中,等等.我想我有三个不变量:
现在,我试图以这种方式实现它:
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(count >= 0 && count <= buffer.Length);
for (int i = count; i < buffer.Length; i++)
{
Contract.Invariant(buffer[i] == null);
}
for (int i = 1; i < count; i++)
{
Contract.Invariant(string.Compare(buffer[i], buffer[i - 1]) >= 0);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,ccrewrite搞乱了循环.
用户文档说该方法应该是一系列调用Contract.Invariant.我是否真的必须像这样重写代码?
Contract.Invariant(count >= 0 && count <= buffer.Length);
Contract.Invariant(Contract.ForAll
(count, buffer.Length, i => buffer[i] == null));
Contract.Invariant(Contract.ForAll
(1, count, i => string.Compare(buffer[i], …Run Code Online (Sandbox Code Playgroud) invariants .net-4.0 code-contracts visual-studio-2010-beta-1
我一直在试图解决C++ 11中的移动语义应该如何工作,而且我很难理解移动对象需要满足的条件.看看这里的答案并没有真正解决我的问题,因为无法看到如何以合理的方式将它应用于pimpl对象,尽管移动语义的参数非常适合pimpls.
我的问题最简单的说明涉及pimpl习语,如下所示:
class Foo {
std::unique_ptr<FooImpl> impl_;
public:
// Inlining FooImpl's constructors for brevity's sake; otherwise it
// defeats the point.
Foo() : impl_(new FooImpl()) {}
Foo(const Foo & rhs) : impl_(new FooImpl(*rhs.impl_)) {}
Foo(Foo && rhs) : impl_(std::move(rhs.impl_)) {}
Foo & operator=(Foo rhs)
{
std::swap(impl_, rhs.impl_);
return *this;
}
void do_stuff ()
{
impl_->do_stuff;
}
};
Run Code Online (Sandbox Code Playgroud)
现在,一旦我离开了,我该怎么办Foo?我可以安全地销毁移动的物体,我可以分配给它,这两者都绝对是至关重要的.但是,如果我尝试do_stuff使用我的Foo,它会爆炸.在我为我的定义添加移动语义之前Foo,每个人都Foo满足了它的不变性do_stuff,而现在已不再是这样了.目前似乎并没有被大量的替代品,或者说,因为(例如)将被移至距离Foo …
我正在寻找有关在何处添加域实体验证规则以及实施最佳实践的建议.我做了搜索,没找到我要找的东西,或者我错过了.
我想知道建议的方法是验证属性不是null,在某个范围或长度等等...我已经看到了几种使用IsValid()和其他关于在构造函数中执行的讨论的方法,所以实体从不处于无效状态,或者使用预处理和后处理,而其他实体使用FluentValidation api,不变量如何影响DRY和SRP.
当使用App Service,Bounded Context,Domain Service,Aggregate Root,Entity layering时,有人能给我一个很好的例子来说明在哪里进行这些检查.这是怎么回事,最好的方法是什么?
谢谢.
domain-driven-design dry single-responsibility-principle invariants
我一直在关注各种Node.js项目的来源,我注意到有些人使用了不变量.根据我的理解,这invariant是一个工具,可以让您在代码中放置断言,并根据需要引发错误.
什么时候你喜欢用invariant传统方式使用vs抛出错误?
// Using invariant
function doSomething(a, b) {
invariant(a > b, 'A should be greater than B');
}
// If throw
function doSomething(a, b) {
if(a <= b) {
throw new Error('A should be greater than B');
}
}
Run Code Online (Sandbox Code Playgroud) invariants ×10
java ×2
.net ×1
.net-4.0 ×1
algorithm ×1
c# ×1
c++ ×1
c++11 ×1
concurrency ×1
covariance ×1
dry ×1
haskell ×1
javascript ×1
pimpl-idiom ×1
single-responsibility-principle ×1
terminology ×1
types ×1
uml ×1