是否有系统或是否有软件开发,并提供正确的证据来支持它?或者所有关键系统都是仅通过积极的代码审查和测试周期开发的?
我正在创建一个用于学习目的的图形框架.我正在使用TDD方法,因此我正在编写大量的单元测试.但是,我仍然在弄清楚如何证明我的单元测试的正确性
例如,我有这个类(不包括实现,我已经简化了)
public class SimpleGraph(){
//Returns true on success
public boolean addEdge(Vertex v1, Vertex v2) { ... }
//Returns true on sucess
public boolean addVertex(Vertex v1) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我也创建了这个单元测试
@Test
public void SimpleGraph_addVertex_noSelfLoopsAllowed(){
SimpleGraph g = new SimpleGraph();
Vertex v1 = new Vertex('Vertex 1');
actual = g.addVertex(v1);
boolean expected = false;
boolean actual = g.addEdge(v1,v1);
Assert.assertEquals(expected,actual);
}
Run Code Online (Sandbox Code Playgroud)
好的,真棒它有效.这里只有一个关键,我已经证明这些函数只适用于这种情况.然而,在我的图论课程中,我所做的只是在数学上证明定理(归纳,矛盾等等).
所以我想知道有没有办法证明我的单元测试在数学上是正确的?那么这是一个很好的做法.因此,我们正在测试单元的正确性,而不是针对某个特定结果对其进行测试.
我需要n从一组N(where 0 < n < N)中随机选择记录.
一种可能的算法是:
遍历列表并为每个元素,使选择的概率=
(number needed) / (number left)因此,如果您有40个项目,则第一个项目有
5/40可能被选中.如果是,下一个有
4/39机会,否则它有5/39机会.当你到达目的地时,你会得到5件物品,而且在此之前你通常会拥有所有物品.
假设一个好的伪随机数发生器,这个算法是否正确?
注意
stackoverflow上有很多这类问题(其中很多都被标记为C#中List <T>中选择N个随机元素的重复).
上面的算法经常被提出(例如Kyle Cronin的答案)并且总是受到质疑(例如,见 这里,这里,这里,这里 ......).
我可以对此事做最后的决定吗?
使用随机数生成器时,这是使用它来获得新值的更大随机性的更好方法:
有一个方法每次都实例化一个新的RNG实例,然后返回一个值吗?
在类级别有一个RNG实例,它在构造函数中实例化一次,然后使用现有实例调用新的随机值吗?
问题在于可能存在许多对随机数的调用,通常在不相互连接的不同范围内.
这不是性能问题,因此每个调用可能实例化一个新实例的事实没有区别.这完全是关于返回值的随机性.
有没有办法强制Maven使用远程工件而不是机器上安装的工件?因为我担心运行时错误而不是编译错误构建服务器无效选项.
PS我知道我可以删除或重命名.m2文件夹,但我敢打赌,有一些更聪明的方法可以做到这一点.也许一些插件或特殊命令参数?
在第一次尝试完成某些编程任务时,我经常犯很多错误(逻辑错误,语法错误).我必须编写单元测试来检测这些错误.当我在接受采访时,这尤其成问题.在那种情况下,我处于压力之下,我无法使用编译器和单元测试来测试我的代码.
我的问题是,我怎样才能首先编写正确的代码?我知道这很难.是否有任何务实的方法来首次减少错误?
我被要求编写一个函数,它接收一个指向int数组的指针和数组的大小.用素数填充该数组.这根本不是一个难题.但是我第一次犯了很多错误,不断发现新的错误.由于这是一次电话采访,我被要求输入答案并发送邮件.
我的第一次尝试
void prim(int * array, int size)
{ bool isPrime = true;
for (int i=0;i<size;i++)
{
for (int j = 2;j<i/2;j++)
{ if (i%j==0){
isPrime = ture;
*array = i;
array++;
} } } }
Run Code Online (Sandbox Code Playgroud)
在gmail中编写代码是一个非常糟糕的主意.我永远不会再这样做了.我知道程序需要两个for循环.但是代码中存在一些大问题
我的第二次尝试,我添加了isPrime测试,修复了一些错误并重新提交.
void prim(int * array, int size)
{
bool isPrime = true;
for (int i=0;i<size;i++)
{
isPrime = true;
for (int j = 2;j<i/2;j++)
{
if (i%j==0){
isPrime = false;
} …Run Code Online (Sandbox Code Playgroud) 更具体地说,我不确定彼此之后的"%"和"\"符号应该是什么意思:
return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % \
(self.id, a, b, c, d, e, f)
Run Code Online (Sandbox Code Playgroud)
难道这return语句看作是一个行代码?因为我最初认为"\"是为了提高可读性和避免环绕而将那些看似过长的线分成两部分.
另外,我这里的列表反映了我的代码中的内容.表示'(self.id,a,b,c,d,e,f)'的部分确实比return语句的开头更加标签.
基本上,该陈述相当于:
return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % (self.id, a, b, c, d, e, f)
Run Code Online (Sandbox Code Playgroud)
在这一个没有"\"涉及....
我试图了解一些前任代码,他们帮助我们使用'var'来声明一切.
我有一个使用声明如下:
using (var postStream = request.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
}
Run Code Online (Sandbox Code Playgroud)
当我在这里放置断点时,postStream在Autos窗口中显示为System.Net.ConnectStream.而不是'var'我想使用'ConnectStream',但编译器不喜欢这样.
我错过了什么,为什么我不能这样写我的代码:
using (ConnectStream postStream = request.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
}
Run Code Online (Sandbox Code Playgroud)
我知道这是微不足道的,但我总是被告知不要使用"变种",除非你有特别的理由这样做(如使用LINQ打交道时).我错了吗?
我想学习有关使用空格来编写正确的运算符重载的规则(如果有)。
我见过不同的形式:
T operator+(T t1, T t2) /* etc. */
T operator+ (T t1, T t2) /* etc. */
T operator +(T t1, T t2) /* etc. */
T operator + (T t1, T t2) /* etc. */
Run Code Online (Sandbox Code Playgroud)
我说的是关键字、运算符字符和第一个括号之间的空格operator。
哪一个是正确的?与其他相比,什么是首选?其中有些是错误的,还是有些在某些情况下是正确的,而在其他情况下是错误的(反之亦然)?
简而言之:空格在这里有什么特殊含义吗(在这个特定主题中(我不询问代码中一般使用空格的情况)?
如果是这样,何时以及为什么?如果不是,什么被认为是最佳实践?
correctness ×9
algorithm ×2
artifacts ×1
c# ×1
c++ ×1
formatting ×1
java ×1
line-endings ×1
maven-2 ×1
proof ×1
python ×1
random ×1
rules ×1
spaces ×1
string ×1
unit-testing ×1