Tag: 可读性

特征:编码风格对性能的影响

从我读到的Eigen( 这里 )看来, operator=()似乎是懒惰评估的“障碍” – 例如它会导致Eigen停止返回expression式模板并实际执行(优化的)计算,将结果存储在=的左侧。 这似乎意味着一个人的“编码风格”对性能有影响 – 即使用命名variables来存储中间计算结果可能会对性能产生负面影响,因为计算的某些部分“过早” 。 为了validation我的直觉,我写了一个例子,并对结果感到惊讶( 完整的代码在这里 ): using ArrayXf = Eigen::Array <float, Eigen::Dynamic, Eigen::Dynamic>; using ArrayXcf = Eigen::Array <std::complex<float>, Eigen::Dynamic, Eigen::Dynamic>; float test1( const MatrixXcf & mat ) { ArrayXcf arr = mat.array(); ArrayXcf conj = arr.conjugate(); ArrayXcf magc = arr * conj; ArrayXf mag = magc.real(); return mag.sum(); […]

如何“自我logging”可以编码而不恼人?

我不确定最佳实践在这里,但是我经常会看到缩写的variables名,特别是当范围很小的时候。 所以(使用简单的Ruby示例)而不是def add_location(name, coordinates) ,我看到了诸如def add_loc(name, coord)东西 – 我甚至可能会看到类似def add_loc(n, x, y) 。 我想象一下,当他们习惯于看缩写词的时候,更长的名字可能会使人厌倦。 冗长是否有助于可读性,还是只是伤害了每个人的眼睛?人们更喜欢缩写和缩短的名字,而不是更长的名字?

新(std :: nothrow)与try / catch块中的New

我在学习new之后做了一些研究,与我习惯的malloc()不一样,不会因为失败的分配而返回NULL,并且发现有两种不同的方法来检查new是否成功。 这两种方法是: try { ptr = new int[1024]; } catch(std::bad_alloc& exc) { assert(); }; 和 ptr = new (std::nothrow) int[1024]; if(ptr == NULL) assert(); 我相信这两种方式能达到同样的目的(如果我错了,就纠正我),所以我的问题是: 这是检查new成功的更好select,完全基于可读性,可维护性和性能,而忽视事实上的c ++编程约定。

应该尝试尽可能严格的java范围块?

我被告知使用Java try-catch机制会有一些开销。 因此,虽然有必要将在try块中引发checked checked的方法放在可能的exception处理中,但在性能方面,限制try块的大小只包含那些可能会引发exception的操作是一个很好的做法。 我不太确定这是一个明智的结论。 考虑处理指定文本文件的函数的两个实现。 即使第一个是不必要的开销,我也觉得要容易得多。 目前还不清楚哪些例外情况只是从查看报表而来,但评论清楚地表明了哪些报表是有责任的。 第二个比第一个更长更复杂。 特别的,第一个好的阅读习语必须被修改,以适应readLine调用。 在一个函数中处理exception的最佳实践是什么? 这个包含try块中的所有处理代码: void processFile(File f) { try { // construction of FileReader can throw FileNotFoundException BufferedReader in = new BufferedReader(new FileReader(f)); // call of readLine can throw IOException String line; while ((line = in.readLine()) != null) { process(line); } } catch (FileNotFoundException ex) { handle(ex); […]

“公共静态”还是“静态公共”?

关于PHP中函数声明关键字的一个小问题:如果你有一个静态类方法, static关键字应该在可见性关键字之前还是之后( public , protected , private )? 假设你所有的方法,静态或其他,有一个可见性关键字,那么你会希望可见性关键字保持在相对于function关键字相同的地方: public function foo() {} public function bar() {} protected function baz() {} private function quux() {} 现在假装一对夫妇是静态的: public function foo() {} static public function bar() {} protected function baz() {} static private function quux() {} 另外,如果一个方法是静态的,那么你就希望这是第一个被看到的东西,因为这对于什么types的方法甚至比可见性关键字有更多的影响。 这是严格的可读性问题,因为它显然没有function或devise后果。 (我能想到)

使用明确的编号重复,而不是问号,星号和加号

我见过正则expression式模式使用明确的数字重复,而不是? , *和+ ,即: Explicit Shorthand (something){0,1} (something)? (something){1} (something) (something){0,} (something)* (something){1,} (something)+ 问题是: 这两种forms是相同的吗? 如果你添加所有格/不情愿的修饰词怎么办? 如果它们是相同的,哪一个更习惯? 更可读? 只是“更好”?

我如何编写更多可维护的正则expression式?

我开始觉得使用正则expression式会降低代码的可维护性。 正则expression式的简洁和力量是邪恶的。 Perl会像默认操作符那样带有副作用。 我有养成正则expression式的习惯,至less有一个句子给出了基本意图,至less有一个例子说明什么可以匹配。 由于build立了正则expression式,所以我觉得评论expression式中每个元素的最大组成部分是绝对必要的。 尽pipe如此,即使我自己的正则expression式,让我仿佛在读克林贡一样,挠挠脑袋。 你有意贬低你的正则expression式吗? 你是否可以将更短更强大的分解成更简单的步骤? 我放弃了嵌套正则expression式。 是否存在由于可维护性问题而避免的正则expression式构造? 不要让这个例子云问题。 如果迈克尔·阿什 ( Michael Ash)的以下内容存在某种缺陷,你会有什么前景可以完全抛弃它吗? ^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[13-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 根据要求,可以使用Ash先生的链接find确切的目的。 匹配 01.1.02 | 11-30-2001 | 2000年2月29日 非匹配 02/29/01 | 13/01/2002 | 11/00/02

将C ++string拆分为多行(代码语法,不parsing)

不要混淆如何拆分明智的stringparsing,例如: 在C ++中拆分string? 我有点困惑,如何将一个string拆分成多行c ++。 这听起来像一个简单的问题,但采取下面的例子: #include <iostream> #include <string> main() { //Gives error std::string my_val ="Hello world, this is an overly long string to have" + " on just one line"; std::cout << "My Val is : " << my_val << std::endl; //Gives error std::string my_val ="Hello world, this is an overly long string […]

为什么大多数STL实现中的代码如此复杂?

STL是C ++世界的重要组成部分,大多数实现都是由Stepanov和Musser最初的努力所衍生出来的。 我的问题是代码的关键性,它是人们查看编写良好的C ++的例子,敬畏和学习的主要来源之一:为什么STL的各种实现如此令人厌恶地看着 – 令人费解和一般很好的例子,从美学的angular度来看如何不写C ++代码。 下面的代码示例不会在我工作的地方通过代码审查,因为variables命名,布局,macros和使用操作符的原因不尽相同,因为这些操作符需要的不仅仅是简单的一瞥,而是要查明实际发生的事情。 template<class _BidIt> inline bool _Next_permutation(_BidIt _First, _BidIt _Last) { // permute and test for pure ascending, using operator< _BidIt _Next = _Last; if (_First == _Last || _First == –_Next) return (false); for (; ; ) { // find rightmost element smaller than successor _BidIt _Next1 = […]

为什么JavaScript中的“continue”语句不好?

在书中Javascript:好部分由道格拉斯克罗克福德,这是所有作者不得不说继续声明: continue语句跳转到循环的顶部。 我从来没有看到过一个代码没有通过重构来消除continue语句的改进。 这真让我困惑。 我知道Crockford对JavaScript有一些非常有见地的观点,但这听起来完全错误。 首先, continue不仅仅是跳到循环的顶部。 默认情况下,它也进行到下一个迭代。 那么克劳福德的说法是不是完全错误的信息呢? 更重要的是,我不完全明白为什么continue会被认为是不好的。 这篇文章提供了什么似乎是一般的假设: 为什么在一个循环内继续一个坏主意? 虽然我理解在某些情况下continue可能会使代码难以阅读,但我认为它可能会使代码更具可读性。 例如: var someArray=['blah',5,'stuff',7]; for(var i=0;i<someArray.length;i++){ if(typeof someArray[i]==='number'){ for(var j=0;j<someArray[i];j++){ console.log(j); } } } 这可以被重构为: var someArray=['blah',5,'stuff',7]; for(var i=0;i<someArray.length;i++){ if(typeof someArray[i]!=='number'){ continue; } for(var j=0;j<someArray[i];j++){ console.log(j); } } 在这个具体的例子中, continue并不是特别有益,但它确实certificate了它降低了嵌套深度。 在更复杂的代码中,这可能会增加可读性。 克罗克福德没有解释为什么不应该continue使用,那么在这个意见背后有什么更深的意义,我失踪了?