Questions tagged «programming-practices»

编程实践是软件开发中常用或不常用的实践。这些可以包括敏捷开发,看板,编码快捷方式等。

13
使用ELSE编程不好吗?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 我经常遇到由于使用该ELSE构造而导致的错误。一个典型的例子是: If (passwordCheck() == false){ displayMessage(); }else{ letThemIn(); } 对我来说,这是安全问题。我知道passwordCheck可能是布尔值,但是我不会将应用程序的安全性放在上面。如果它是字符串,int等会怎样? 我通常会尝试避免使用ELSE,而是选择两个完全独立的IF语句来测试我的期望。然后,其他任何东西都将被忽略,或者将被专门处理。 当然,这是防止错误/安全问题进入您的应用程序的更好方法。 你们是如何做到的?

9
“绷带”修复有多普遍?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 想象以下情况: 您已经检测到您的(或其他人的)程序存在错误-给定特定输入时,函数产生错误的结果。您检查了一下代码,找不到任何错误:输入该命令后,它似乎就会陷入困境。 您现在可以执行以下两项操作之一:您可以进一步检查代码,直到找到实际原因为止;或者 或者您通过添加一条if语句检查输入是否是此特定输入来打绷带-如果是,则返回期望值。 对我来说,使用绷带是完全不能接受的。如果代码在此输入上的行为异常,那么您错过的其他哪些输入会对它产生奇怪的反应?这似乎根本不是一个解决办法-您只是把问题抛在了脑后。 由于我什至不考虑这样做,我对教授和书籍经常提醒我们有关如何使用“绷带”修复方法不是一个好主意感到惊讶。因此,这使我感到奇怪:这些“修复”到底有多普遍?

12
带注释的简短代码与无注释的较长且易于理解的代码-哪个是首选?
有时可以用两种方式编写算法: 一种简短的幻想方式;要么 更长的,易于理解的方式。 例如,这是一种将字符串复制source到destC中的更长,更简单的方法: *dest = *source; while (*source != '\0') { source++; dest++; *dest = *source; } (true); 这是一种简短的幻想方式。 // Copy string source to dest while (*dest++ = *source++); 我一直听到并读过,应该避免使用花哨的代码,我倾向于同意。但是,如果我们考虑到评论该怎么办?假定像上面的示例一样,我们有一个未注释的,较长的并且据说更易于理解的代码,以及一个注释良好的,简短的,精美的代码?非花哨的代码还是首选吗? 编辑:许多人对变量名发表了评论,所以我修改了示例代码,以免在优先选择其他变量时使它成为一个因素。我试图在第一个示例中删除双重分配,但这只会使代码的可读性降低。 也许这不是最好的示例,因为许多人发现“花哨的”代码比较长的代码更具可读性和可理解性。这个想法是要有一个更长的代码,比一个简短但复杂的代码更容易理解。 EDIT2:这是我从SO获得的一个新例子: 评论版本: //direct formula for xoring all numbers from 1 to N int Sum = (N & …

5
“忘记密码”-如何处理?
我阅读了此答案,发现有一条评论坚持不通过电子邮件发送密码: 我不希望通过电子邮件检索密码。这意味着我的密码以纯文本格式存储在某处。仅应将其重置。 这给我提出了处理“忘记密码”选项的问题? 原始密码必须不惜任何代价显示在任何UI中,以便用户能够读取它。那么处理“忘记密码”的方式是什么

6
REST端点在发布前显示预览
我正在设计一个新的Web应用程序,该应用程序由REST后端和HTML + JS前端提供支持。 它具有一个POST方法来更改一个实体(我们称为Config),这在应用程序的许多元素的状态下具有多种副作用。假设以这种方式执行POST: POST /api/config BODY {config: ....} 因此,我想在进行这些更改之前显示预览,以使最终用户能够注意到要更改的内容。 我首先想到的是为预览创建一个GET端点,发送实体新状态的主体。这条路: GET /api/preview/items BODY {config: ....} 可能显示具有新配置的项目的新状态。 GET /api/preview/sales BODY {config: ....} 可能会使用新配置显示销售的新状态。 使用GET动词似乎是个好主意,因为我不会更改应用程序的状态。然而,随着使用请求主体的GET请求似乎气馁。 有什么好的做法吗?其他选择可能是使用一种方法将配置存储为草稿,并使用其他方法显示结果,但这将需要额外的步骤,并且必须在服务器中管理草稿: POST /api/preview/config BODY {config: ....} GET /api/preview/items?idPreviewConfig=1

3
如何测试数据访问层?
我有一个DAO方法,该方法利用Spring进行JDBC访问。它计算出卖家出售商品的成功率。 这是代码: public BigDecimal getSellingSuccessRate(long seller_id) { String sql = "SELECT SUM(IF(sold_price IS NOT NULL, 1, 0))/SUM(1) FROM transaction WHERE seller_id = ?"; Object[] args = {seller_id}; return getJdbcTemplate().queryForObject(sql, args, BigDecimal.class); } 我应该如何使用JUnit测试此方法或任何DAO方法?有哪些最佳实践来测试数据访问逻辑?我正在考虑针对加载了一些数据的可嵌入数据库进行测试,但是就RDBMS和架构而言,我们不应该进行类似于生产环境的集成测试吗?

5
描述性命名与80个字符行的比较[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我经常听到这两种有价值的编程实践:(1)代码行应少于80个字符,并且(2)为变量,方法,类等使用描述性名称。我理解这两个建议的含义,它们似乎常常是彼此权衡的。如果我将代码的字符数保持在80个字符/行以下,那么最终我将使用较少的描述性名称(特别是在Python中,每个缩进均计为4个字符),但如果使用的描述性名称较多,则最终将使用80个字符以上的行。 因此,我的问题是,如果必须做出选择,那么遵循这两个建议中哪个更重要?我想作为一个独立的(业余爱好者)程序员来这件事,但更重要的是,从一个为大公司工作的软件工程师的角度来看。

2
如何开始竞争性编程?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我已经练习编码一段时间了,但是问题是我花了很多时间来编写解决方案。我想问一下竞争性编程是否可以帮助我改善这一点。 如果是,那么我应该如何开始以及可以从哪个网站使用(例如TopCoder)?我现在显然无法解决非常棘手的问题。我该怎么办? 如果没有,我该怎么办? 我还想学习编码还有另一个问题,但事实是我觉得自己不太擅长。我该怎么办?就像从内部烦扰我。 我知道有些人可能找不到这个问题,但是至少请允许我得到答案。

4
C ++中move构造函数的动机和使用
最近,我一直在阅读有关C ++中的move构造函数的信息(请参见例如此处),我试图了解它们的工作方式以及何时使用它们。 据我了解,移动构造函数用于缓解由于复制大型对象而导致的性能问题。维基百科页面上说:“ C ++ 03的一个长期性能问题是,当对象按值传递时,可能隐式地发生昂贵且不必要的深拷贝。” 我通常会解决这种情况 通过引用传递对象,或 通过使用智能指针(例如boost :: shared_ptr)来传递对象(智能指针而不是对象被复制)。 在哪种情况下上述两种技术还不够,而使用move构造函数更方便?

4
编写公司范围内的开发人员手册
我在一家小公司工作。在我被雇用之前,公司的软件开发部门由一个自学成才的工作人员组成。现在,我已经为公司编写软件了几年,我的任务是建立正式的公司范围内的软件开发实践。目前,除了 编写代码,对其进行测试,将其放入.zip文件中,然后将其发送给客户端。TDD和版本控制的加分。 我的老板要我写一份软件开发人员手册,该手册定义了我们用来完成工作的一般流程,协议,工具和指南。换句话说,他想要一本“这就是我们在这里所做的”书,以使新员工更容易熟悉我们的处事方式,并帮助我的老板了解他的奴才在做什么以及他们的工作方式它。 从我的角度来看,我正在奠定基础,并且需要正确完成。您将如何选择此类手册的主题?您可以提供一些示例主题吗? 旁注:如果重要,我们主要是Microsoft .NET商店。我们正在研究诸如XP和Scrum之类的敏捷实践,但我们可能必须对其进行大量修改以使其在我们公司中正常工作。

4
贵公司是否有关于个人(技术)博客的书面政策?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 贵公司是否有关于个人(技术)博客的书面政策? 想要分享? 我们鼓励开发人员保留个人博客,并谈论他们在工作中遇到的非核心能力或核心IP的技术问题。我们一直在做“不问不说”的风格,但是现在该写下些东西了。 更新:谢谢大家的回答,上周我们实施了一项政策-全文在此处。

10
您通常如何布置班级的区域?
我想知道是否有制定班级区域布局的标准。 我目前使用 Fields Constructor Properties Public Methods Private Methods Fields成为私有财产而Properties成为公共财产。通常,如果需要,我通常在其中使用子区域,或者偶尔在下面添加其他区域(例如interface或baseClass成员)。


10
为什么我们需要“回调函数”?
我正在读书programming in Lua。它说 在许多情况下,封闭提供了一种有价值的工具。如我们所见,它们可用作排序等高阶函数的参数。闭包对于构建其他功能的功能也很有价值,例如我们的newCounter示例;这种机制允许Lua程序结合功能世界中的复杂编程技术。闭包对于回调函数也很有用。当您在传统的GUI工具箱中创建按钮时,就会出现一个典型的示例。每个按钮都有一个回调函数,当用户按下该按钮时会被调用。您希望不同的按钮在按下时会做一些略有不同的事情。例如,一个数字计算器需要十个类似的按钮,每个数字一个。您可以使用以下功能创建每个: function digitButton (digit) return Button{label = tostring(digit), action = function () add_to_display(digit) end} end 看来,如果调用digitButton,它将返回action(将创建一个闭包),因此,我可以访问digit传递给digitButton。 我的问题是: Why we need call back functions? what situations can I apply this to? 作者说: 在此示例中,我们假定Button是创建新按钮的工具包函数。label是按钮标签;而action是按下按钮时要调用的回调闭包。在digitButton完成其任务之后以及在局部变量digit超出作用域之后,可以很长一段时间调用该回调,但是仍然可以访问此变量。 根据作者,我认为类似的例子是这样的: function Button(t) -- maybe you should set the button here return t.action -- so …

6
(过度)使用反射是个坏习惯吗?
如果大大减少了样板代码的数量,使用反射是否是一种好习惯? 基本上,在性能和一方面的可读性与另一方面的抽象/自动化/简化样板代码之间要进行权衡。 编辑:这是推荐使用反射的示例。 举一个例子,假设有一个抽象类Base,其具有10个字段和具有3个亚类SubclassA,SubclassB并且SubclassC每个具有10个不同的字段; 它们都是简单的豆子。问题是您有两个Base类型引用,并且想要查看它们的对应对象是否属于相同(子)类型并且相等。 作为解决方案,有一个原始解决方案,在该解决方案中,您首先要检查类型是否相等,然后检查所有字段,或者可以使用反射并动态查看它们是否属于同一类型,并遍历以“ get”开头的所有方法(约定超出配置),请同时在两个对象上调用它们,并在结果上调用equals。 boolean compare(Base base1, Base, base2) { if (base1 instanceof SubclassA && base2 instanceof SubclassA) { SubclassA subclassA1 = (SubclassA) base1; SubclassA subclassA2 = (SubclassA) base2; compare(subclassA1, subclassA2); } else if (base1 instanceof SubclassB && base2 instanceof SubclassB) { //the same } //boilerplate } …

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.