草庐IT

java - 为什么字符串在许多编程语言中是不可变的?

这个问题在这里已经有了答案:关闭10年前.PossibleDuplicate:Whycan'tstringsbemutableinJavaand.NET?Why.NETStringisimmutable?为此选择了多种语言,例如C#、Java和Python。如果是为了节省内存或提高compare等操作的效率,那么它对连接和其他修改操作有什么影响? 最佳答案 不可变类型通常是一件好事:它们更适合并发(您无需锁定无法更改的内容!)它们减少了错误:可变对象很容易在您不期望的情况下被更改,这可能会引入各种奇怪的错误(“远距离操作”)它们可以

c++ - 声明一个没有 const 的 C 风格的字符串是不是很糟糕?如果是这样,为什么?

在C++中执行此操作char*cool="cool";编译得很好,但给了我一个警告:deprecatedconversionfromstringconstanttochar*.我绝不会故意在std::string上使用C风格的字符串,但以防万一我被问到这个问题:在没有const修饰符的情况下声明C风格的字符串是不好的做法吗?如果有,为什么? 最佳答案 是的,这种声明是不好的做法,因为它允许通过写入字符串文字来意外引发未定义行为的多种方式,包括:cool[0]='k';strcpy(cool,"oops");另一方面,这很好,因为它分

javascript - 让构造函数返回 Promise 是不好的做法吗?

我正在尝试为博客平台创建一个构造函数,它内部正在进行许多异步操作。这些范围包括从目录中抓取帖子、解析它们、通过模板引擎发送它们等等。所以我的问题是,让我的构造函数返回一个promise而不是他们调用new反对的函数的对象是不明智的。例如:varengine=newEngine({path:'/path/to/posts'}).then(function(eng){//allowusertointeractwiththenewlycreatedengineobjectinside'then'engine.showPostsOnOnePage();});现在,用户也可以不提供补充的Prom

javascript - 在 HTML 数据属性上添加 JSON 是不是很糟糕?

由于HTMLdata属性允许添加任何自定义数据,我想知道包含一组JSON是否是个好主意列为data属性?那么,对应的JSON可以通过JavaScript轻松访问getAttribute("data-x")的事件.其实我的问题是:将大量数据添加到HTML中是否标准、高效、合理?属性?例如或者必须将大量JSON数据存储在中标签和HTML属性不适合放置大量数据,即使是data属性。 最佳答案 您可以使用标识符来访问数据,而不是将所有内容都存储在data属性中。例如,你可以这样做:varmyBigJsonObj={data1:{//lots

c - 用 Valgrind 运行单元测试是不是有点矫枉过正?

就在几天前,我开始研究一个名为check的单元测试框架,我打算在Linux下对c代码进行测试。现在检查一下,一些设计良好的代码和一些测试代码可以帮助我验证基本功能是正确的,我的意思是很容易只看变量和响应判断一个函数是否正确。但是假设我想测试一个动态内存结构,其中包含大量的malloc和free,事实证明,我可以输入数据并再次取出正确的数据。但这并不能证明我在这个过程中没有破坏一些内存,假设我忘记释放一半的内存并丢失了指针(经典的memleak)。该代码可能会通过大部分单元测试。那么现在的问题是:使用Valgrind运行整个单元测试代码并让他运行是个好主意吗?检测任何malloc/fre

java - 在单元测试中使用反射是不好的做法吗?

这个问题在这里已经有了答案:HowdoItestaclassthathasprivatemethods,fieldsorinnerclasses?(58个回答)关闭4年前.在过去的几年里,我一直认为在Java中,反射在单元测试中被广泛使用。由于必须检查的一些变量/方法是私有(private)的,因此有必要读取它们的值。我一直认为ReflectionAPI也用于这个目的。上周我不得不测试一些包,因此编写了一些JUnit测试。与往常一样,我使用反射来访问私有(private)字段和方法。但是我检查代码的主管对此并不满意,并告诉我反射API不适合用于这种“黑客攻击”。相反,他建议修改生产代码

java - 为什么 exception.printStackTrace() 被认为是不好的做法?

有很多material出there这表明打印异常的堆栈跟踪是不好的做法。例如。来自Checkstyle中的RegexpSingleline检查:Thischeckcanbeused[...]tofindcommonbadpracticesuchascallingex.printStacktrace()但是,我正在努力寻找任何可以提供正当理由的地方,因为堆栈跟踪对于跟踪导致异常的原因肯定非常有用。我所知道的事情:堆栈跟踪永远不应对最终用户可见(出于用户体验和安全目的)生成堆栈跟踪是一个相对昂贵的过程(尽管在大多数“特殊”情况下不太可能成为问题)许多日志框架会为您打印堆栈跟踪(我们的没有,

c++ - 使用 std::move() 是不是过早的优化?

假设我有以下代码:intmain(){std::vectorstrs;std::stringvar("HelloWorld");//Makesomemodificationsto'var'strs.push_back(std::move(var));}我要指出的示例部分是std::move()的用法。基本上我担心push_back()调用的拷贝。假设我要添加的字符串非常大。我仍在学习C++11右值引用,所以我不确定编译器如何在没有std::move()的情况下优化拷贝(如果有的话)。谁能解释这是否是一种过早的优化(通常在所有要避免复制的情况下强制移动)?如果是这样,我应该期望编译器遵循

c++ - 在 C++ 中使用 assert() 是不好的做法吗?

我倾向于在我的C++代码中添加大量断言,以便在不影响发布版本的性能的情况下更轻松地进行调试。现在,assert是一个纯C宏,设计时没有考虑C++机制。另一方面,C++定义了std::logic_error,这是为了在程序逻辑中出现错误的情况下抛出(因此得名)。抛出一个实例可能只是assert的完美、更C++的替代方案。问题是assert和abort都立即终止程序而不调用析构函数,因此跳过了清理,而手动抛出异常会增加不必要的运行时成本。解决这个问题的一种方法是创建一个自己的断言宏SAFE_ASSERT,它的工作方式与C对应项一样,但在失败时抛出异常。关于这个问题,我能想到三种意见:坚持C

c++ - 在 C++ 中,从函数返回 vector 仍然是不好的做法吗?

短版:在许多编程语言中,返回大型对象(例如vector/数组)很常见。如果类具有移动构造函数,这种风格现在在C++0x中是否可以接受,还是C++程序员认为它很奇怪/丑陋/可憎?长版:在C++0x中,这仍然被认为是不好的形式吗?std::vectorBuildLargeVector();...std::vectorv=BuildLargeVector();传统版本如下所示:voidBuildLargeVector(std::vector&result);...std::vectorv;BuildLargeVector(v);在较新的版本中,从BuildLargeVector返回的值是一个