Questions tagged «language-agnostic»

该标签用于非特定于编程语言或环境的问题。

30
每个程序员应该知道什么?
无论使用哪种编程语言或操作系统,或使用何种操作系统开发,每个程序员都应该知道什么? 一些背景: 我有兴趣成为最好的程序员。作为此过程的一部分,我试图了解我不知道的内容,如果这样做的话,我会受益匪浅。尽管有很多列表围绕着“每个[插入编程语言]开发人员都应该知道的n件事”,但我还没有找到类似的东西,但不仅限于特定的语言。 我也希望这些信息对其他人有好处并从中受益。

20
“ break”和“ continue”是否是不好的编程习惯?
我的老板一直提满不在乎地那么糟糕的程序员使用break,并continue在循环中。 我一直在使用它们,因为它们很有意义。让我向您展示灵感: function verify(object) { if (object->value < 0) return false; if (object->value > object->max_value) return false; if (object->name == "") return false; ... } 这里的要点是,首先该功能检查条件是否正确,然后执行实际功能。IMO同样适用于循环: while (primary_condition) { if (loop_count > 1000) break; if (time_exect > 3600) break; if (this->data == "undefined") continue; if (this->skip == true) continue; ... …

18
短变量名有借口吗?
对于我目前正在使用的代码库,这已经变得非常沮丧。我们的许多变量名都很简短且没有描述性。我是该项目上剩下的唯一一名开发人员,并且没有关于它们大多数功能的文档,因此我不得不花更多的时间来跟踪它们的含义。 例如,我正在阅读一些更新光学表面定义的代码。开始时设置的变量如下: double dR, dCV, dK, dDin, dDout, dRin, dRout dR = Convert.ToDouble(_tblAsphere.Rows[0].ItemArray.GetValue(1)); dCV = convert.ToDouble(_tblAsphere.Rows[1].ItemArray.GetValue(1)); ... and so on 也许只是我一个人,但实际上它们告诉我的内容并没有告诉我,这使得进一步理解代码变得困难。我所知道的是,它是一个变量,该变量从某个地方的特定表中解析出特定行。经过一番搜索,我发现了它们的含义: dR = radius dCV = curvature dK = conic constant dDin = inner aperture dDout = outer aperture dRin = inner radius dRout = outer radius 我将它们重命名为基本上我在那里所拥有的。它延长了一些行,但是我觉得这是一个公平的权衡。但是,在许多代码中都使用了这种命名方案。我不确定这是来自开发人员的作品,他们是通过使用较旧的系统而学习的,还是背后有更深层的原因。是否有充分的理由以这种方式命名变量,还是我在遇到变量时将其更新为更具描述性的名称是否合理?

10
什么时候强制垃圾回收是个好主意?
因此,我正在阅读一个有关强制C#垃圾收集器在几乎每个答案都相同的地方运行的问题:您可以做到,但您不应该这样做-除了一些非常罕见的情况。可悲的是,那里没有人详细说明这种情况。 您能告诉我在哪种情况下强制垃圾回收实际上是一个好主意吗? 我不是在询问C#的特定情况,而是询问所有具有垃圾收集器的编程语言。我知道您不能在所有语言(例如Java)上强制使用GC,但让我们假设可以。

11
执行错误处理的现代方法…
我已经思考了一段时间了,发现自己不断发现警告和矛盾,因此我希望有人可以得出以下结论: 优先于错误代码的异常 据我所知,在从事该行业工作四年,阅读书籍和博客等之后,当前处理错误的最佳实践是抛出异常,而不是返回错误代码(不一定返回错误代码,而是返回错误代码)。类型代表错误)。 但是-对我来说这似乎是矛盾的... 编码接口,而不是实现 我们对接口或抽象进行编码以减少耦合。我们不知道或不想知道接口的特定类型和实现。那么,我们怎么可能知道应该寻找哪些异常呢?该实现可以抛出10个不同的异常,也可以不抛出任何异常。当我们确实捕获到异常时,我们正在对实现进行假设? 除非-接口具有... 异常规格 某些语言允许开发人员声明某些方法会引发某些异常(例如,Java使用throws关键字。)从调用代码的角度来看,这似乎很好-我们明确知道可能需要捕获哪些异常。 但是-这似乎表明... 泄漏抽象 为什么接口应该指定可以引发哪些异常?如果实现不需要引发异常或引发其他异常怎么办?在接口级别,无法知道实现可能要抛出的异常。 所以... 总结一下 当异常(在我看来)与软件最佳实践相矛盾时,为什么还要优先考虑它们?而且,如果错误代码非常糟糕(并且我不需要在错误代码的恶习上卖掉),还有其他选择吗?满足(如上所述)最佳实践要求但不依赖于调用代码检查错误代码返回值的错误处理技术的当前(或即将成为最新技术)是什么?

13
我们为什么不存储语法树而不是源代码?
我们有很多编程语言。在将每种语言转换为代码之前,都要对每种语言进行解析和语法检查,以便构建抽象语法树(AST)。 我们有这个抽象的语法树,为什么不存储这个语法树而不是源代码(或在源代码旁边)呢? 通过使用AST而不是源代码。团队中的每个程序员都可以将此树序列化为他们想要的任何语言(具有适当的上下文无关语法),并在完成后解析回AST。因此,这将消除有关编码样式问题(在何处放置{和},在何处放置空格,缩进等)的争论。 这种方法的优缺点是什么?

30
编程中的有害诱惑
很好奇,编程中的哪种诱惑对您的项目真的有害吗? 就像当您真的有想做某事的冲动,并且相信它将使项目受益时,或者只是骗自己相信它确实如此,而一周之后,您意识到您并没有解决任何实际问题,而是创建了新问题或,最好的情况是,您的内在野兽不会受到明显影响。 就个人而言,我很难不重构不良代码。我处理了很多不良的旧代码,并且当我没有测试证明重构不会破坏任何东西时,需要花一口气才能不碰它。 在用户界面上对我来说是另一个恶魔,我可以花几个小时更改UI布局,只是因为我喜欢这样做。有时我告诉自己我正在研究可用性,但事实是我喜欢移动按钮。 您的编程恶魔是什么,如何避免它们?

1
回调和Promises之间真的有根本的区别吗?
在执行单线程异步编程时,我熟悉两种主要技术。最常见的一种是使用回调。这意味着将传递给异步操作的函数的回调函数作为参数。当异步操作完成时,将调用回调。 jQuery这样设计一些典型的代码: $.get('userDetails', {'name': 'joe'}, function(data) { $('#userAge').text(data.age); }); 但是,当我们要在前一个完成后一个接一个地进行其他异步调用时,这种类型的代码可能会变得混乱且高度嵌套。 因此,第二种方法是使用Promises。Promise是一个对象,它表示可能不存在的值。您可以在其上设置回调,当准备读取值时将调用该回调。 Promises和传统的回调方法之间的区别在于,异步方法现在可以同步返回Promise对象,客户端将在其上设置回调。例如,在AngularJS中使用Promises的类似代码: $http.get('userDetails', {'name': 'joe'}) .then(function(response) { $('#userAge').text(response.age); }); 所以我的问题是:实际上有真正的区别吗?区别似乎纯粹是语法上的。 是否有更深层次的理由使用一种技术而不是另一种技术?

7
短路评估,这是不好的做法吗?
我已经知道了一段时间,但从未考虑过的一件事是,在大多数语言中,可以根据其顺序在if语句中为运算符赋予优先级。我经常用这种方法来防止空引用异常,例如: if (smartphone != null && smartphone.GetSignal() > 50) { // Do stuff } 在这种情况下,代码将导致首先检查对象是否不为null,然后在知道该对象存在的情况下使用该对象。该语言很聪明,因为它知道如果第一条语句为假,那么即使评估第二条语句也没有意义,因此永远不会抛出空引用异常。对于and和or运算符,其作用相同。 据我所知,这在其他情况下也很有用,例如检查索引是否在数组的边界内,并且可以用各种语言执行这种技术:Java,C#,C ++,Python和Matlab。 我的问题是:这种代码是否代表不良做法?这种不良做法是由某种隐藏的技术问题引起的(例如,这最终可能导致错误)还是对其他程序员而言导致可读性问题?会令人困惑吗?

18
在工作面试中辨别优秀程序员的最佳方法是什么?
在面试中:可靠地确定某人何时是优秀的程序员的最佳方法是什么。我的意思是,他是效率低下的同龄人的10/15倍,比同龄人的效率高/快/好。 我们中的许多人都听说过FizzBu​​zz问题,以淘汰弱者。当然,花5到10分钟来解决这个问题是一个很明显的指标,表明申请人是一个薄弱的候选人。我认为一个好的指标能够尽快解决这个问题。但是,这似乎还不够。 可能是像给他一个中等复杂的越野车程序,看看他能以多快的速度完成它并找出所有问题所在?

6
垃圾回收如何以本地编译的语言工作?
浏览了堆栈溢出的几个答案之后,很明显,一些本机编译的语言具有垃圾回收功能。但是我不清楚这将如何工作。 我了解垃圾收集如何与解释语言一起工作。垃圾收集器将仅与解释器一起运行,并从程序的内存中删除未使用和无法访问的对象。他们俩一起跑。 但是,如何使用编译语言呢?我的理解是,一旦编译器将源代码编译为目标代码(特别是本机代码),就完成了。它的工作完成了。那么,编译后的程序又如何被垃圾回收呢? 在执行程序删除“垃圾”对象时,编译器是否以某种方式与CPU一起工作?还是编译器在编译程序的可执行文件中包括一些最小的垃圾回收器。 我相信我的后一种说法将比前一种更具有效性,这是由于从Stack Overflow的答案中摘录的: 一种这样的编程语言是埃菲尔。大多数Eiffel编译器出于可移植性原因而生成C代码。该C代码用于通过标准C编译器生成机器代码。埃菲尔实现为该已编译的代码提供GC(有时甚至是精确的GC),并且不需要VM。特别是,VisualEiffel编译器直接在完全GC支持下生成了本机x86机器代码。 最后一条语句似乎暗示编译器在最终的可执行文件中包含一些程序,该程序在运行时充当垃圾回收器。 在页面d语言的关于垃圾收集的网站这是本地编译并具有可选的垃圾收集器- -似乎也暗示了一些后台程序运行沿着原来的可执行程序来实现垃圾回收。 D是一种支持垃圾回收的系统编程语言。通常,没有必要显式释放内存。只需根据需要进行分配,垃圾收集器就会定期将所有未使用的内存返回到可用内存池。 如果方法上面提到的被使用,究竟会工作的呢?编译器是否存储一些垃圾回收程序的副本并将其粘贴到它生成的每个可执行文件中? 还是我的思维有缺陷?如果是这样,使用什么方法来实现编译语言的垃圾回收,它们将如何工作?

7
什么是早晚绑定?
我不断听到有关早期和晚期绑定的信息,但我不了解它们是什么。我发现以下我不理解的解释: 早期绑定是指在设计时将值分配给变量,而后期绑定是指在运行时将值分配给变量。 有人可以定义两种绑定类型并进行比较吗?

17
如何训练自己,避免编写“聪明”的代码?[关闭]
您是否只需要用Expression s 来展示新技巧或将三个不同的过程归纳起来就知道吗?这并不一定要达到宇航员的规模,实际上可能会有所帮助,但是我不禁注意到其他人将以更清晰,直接(有时很无聊)的方式实现相同的类或程序包。 我注意到我经常通过过度解决问题来设计程序,有时是故意的,有时是出于无聊。无论哪种情况,我通常都会诚实地相信我的解决方案是清晰而优雅的,直到我看到相反的证据,但通常为时已晚。我中还有一部分人喜欢无证假设而不是代码重复,而更喜欢简单性。 我该怎么做才能抵制写“聪明的”代码的冲动,什么时候我应该做错了? 当我现在与一个经验丰富的开发人员团队一起工作时,问题变得更加严峻,有时我写智能代码的尝试即使是我自己,经过一段时间消除优雅的幻想似乎也是愚蠢的。


16
有什么正确的方法告诉管理层我们的代码很烂?
我们的代码是错误的。它可能并不总是被认为是坏的,但它是坏的,而且只会走下坡路。我不到一年前刚从大学毕业,我们代码中的许多内容使我感到难以置信。最初,我认为作为一个新手,我应该闭嘴,直到我对我们的代码库有所了解为止,但是我已经看到很多知道它不好的地方。 一些亮点: 我们仍然使用框架(尝试从查询字符串中获取内容,几乎是不可能的) VB脚本 源安全 我们“使用” .NET-意思是说,我们有.net包装器,它们调用COM DLL,几乎不可能轻松调试 一切基本上都是一项巨大的功能 代码不可维护。每个页面都有多个文件,每次创建新页面时都会创建这些文件。基本上,主页做了很多次Response.Write()来呈现HTML(无法运行runat =“ server”?)。之后,客户端(VBScript)上可能会有很多逻辑,最后页面提交给自己(通常将很多东西存储在隐藏字段中),然后在页面上发布到处理页面,该页面可以执行诸如保存数据到数据库。 我们得到的规格是可笑的。通常,他们会要求诸如“使用字段Y或字段Z自动填充字段X”之类的内容,却没有指示何时选择字段Y或字段Z。 我确信其中部分原因是没有在软件公司工作,但我觉得编写软件的人们至少应该在乎其代码的质量。我什至无法想象,如果我提出一些建议,那么很快就会发生任何事情,因为迫在眉睫的最后期限迫在眉睫,但是我们将继续编写不良代码并使用不良做法。 我能做什么?我什至如何提出这些问题?我的团队中有75%同意我的观点,并且过去曾提出过这些问题,但没有任何改变。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.