Questions tagged «programming-practices»

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

5
保持与实现不可知论真的值得吗?
我有一个正在使用Tomcat,Spring 4,Spring Security,MySQL和带有Hibernate的JPA的项目。 我从JPA的角度出发选择了JPA,它是为了使ORM提供程序的基础实现无缝交换,或者至少减轻痛苦。我要说的是,在思想上使用规范而非实现(JAX-RS)是Java开发社区的默认观点。 我很好奇这是否真的值得一做。我敢肯定,如果我直接使用Hibernate,我会获得一些力量,因为我可以使用不属于主要JPA规范的功能。 我的部分担忧来自YAGNI的想法。我本质上是以特定的样式和方式编程(使用JPA而不是Hibernate),以便将来可以在某些时候换出我的ORM实现。我严重怀疑这种情况会在产品的整个生命周期内发生,因此,我实质上是在努力做一些我可能永远不会从中受益的事情。 你怎么看?对于诸如JPA之类的东西,“编程接口”是否值得?您是否曾经在产品中交换过整个ORM实施?您是否曾经能够完全避免像JPA这样的泄漏引起的抽象?我个人已经有一个本地SQL调用(以清理数据库表),并且我想在JPA规范中内置一些功能(获取/设置方法的前缀,以及MEMBER OF之间的区别) / IN,它只会将自己绑定到底层实现上,这给了我避免的机会。

6
CSV是XML和JSON的良好替代方案吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 CSV是否被视为针对XML和JSON的编程语言的不错选择? 我通常使用XML和JSON(有时是纯文本文件)作为平面文件存储。但是,最近我在PHP中遇到了CSV实现。虽然我通常看到CSV用于Excel文件中的输入,但是我从未在编程中使用它。它在任何方面都比XML或JSON更好吗?

10
工程过度是警告标志吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 因此,我们向具有明确定义要求的新候选人提出了直接的编码练习。有时,我们收到的解决方案并不能真正解决眼前的问题,而是过度设计以解决感知到的问题-通常不在练习范围之内。 现在我的问题是,这是一个警告信号吗? 编辑:相当多的讨论是基于有缺陷的测试-这是一个公平的观点。正如我在评论中所述,测试的基本前提是展示如何以一种明智的方式从文件中读取数据(并且您会惊讶于我们看到的各种方法),以及如何匹配计算更新之间的延迟之前的项目。现在,要使此方法起作用,必须对数据做出某些假设,我们将寻找这些假设,并且还明确声明我们希望在两小时内看到您采用的方法(包括OO方法等)。大体时间。 恕我直言,当我面试时,这是我遇到的最完整的练习。 我正在考虑的一种特殊情况是,候选人而不是从文件中读取多线程应用程序中的“网络”输入,这显然不在范围之内。

4
一个类方法的数量限制是多少?
在我读过的不同设计书中,有时会着重强调类必须具有的方法数量(考虑OO语言,例如java或C#)。这些书中报道的例子通常非常简洁明了,但很少涉及“严重”或复杂的案例。 但是范围似乎在5到8之间。 在一个项目中,我开发了一个类别为“ Note”的类,其属性为属性:Title,Desctiption,CreateDate等。然后是一些基本方法,例如:getRelations(如果将注释分配给了不同的文档),getExpiryDate等。 但是,在开发应用程序时,需要更多的功能,因此需要更多的方法。 我知道,一个类拥有的方法越少,耦合就越松散。就模块化和可重用性而言,这确实是一个很好的优势,而且更易于编辑。 顺便说一句,如果在我们的上下文中不需要(甚至没有意义)创建子类,并且所有需要的功能都与该类相关,那么我们可以进一步附加几个方法? 我同意拥有15种以上的方法,然后可能需要重新设计。但是即使在那种情况下,如果删除某些方法或继承不是一个选择,那将是正确的方法吗?

2
在现代C语言中,可变宽度类型是否已由固定类型取代?
今天,在对Code Review的回顾中遇到了一个有趣的观点。@Veedrac在recommened 此答案该可变大小类型(例如int和long)具有固定尺寸类型等来代替uint64_t和uint32_t。从该答案的评论中引用: int和long的大小(以及它们可以容纳的值)取决于平台。另一方面,int32_t始终为32位长。使用int只是意味着您的代码在不同平台上的工作方式不同,这通常不是您想要的。 @supercat 在此处部分解释了标准不固定常见类型的背后原因。与当时通常用于系统编程的汇编相反,C被编写为可跨体系结构移植。 我认为最初的设计意图是,除int之外的每种类型都是可以处理各种大小数字的最小事物,而int是可以处理+/- 32767的最实用的“通用”大小。 对于我来说,我一直在使用int,并不真正担心其他选择。我一直认为这是性能最好的大多数类型,故事结束了。我认为固定宽度唯一有用的地方是在对数据进行编码以进行存储或通过网络传输时。我也很少见过其他人编写的代码中的固定宽度类型。 我是停留在70年代还是int在C99及以后的时代实际上有使用的理由?

5
如何避免巨型胶水方法?
在我目前的工作中,我曾几次被要求清理旧代码。通常,代码是迷宫式的,其背后的数据甚至更复杂。我发现自己将事情整理成漂亮,整洁的模块化方法。每种方法都做一件事并且做得很好。那时候事情开始往南走... 最终,我总是得到一个干净的API,并且没有真正的方法将它们捆绑在一起。解决方法是编写一个大的丑陋的“粘合”方法(通常充满条件语句),该方法最终调用我所有的“清洁”方法。 胶水方法通常最终是我试图清除的代码/数据缠结的简洁版本。它通常更具可读性,但仍然很烦人。 如何避免这种方法?这是数据纠结的征兆还是我做错事情的反映?

5
代码中的每个数字都被视为“幻数”吗?
因此,我们将作为参数发送给方法的代码中的每个数字都视为幻数?对我来说,不应该。我想,如果让某个数字代表用户名的最小长度,并且我们开始在代码中使用“ 6” ...那么,是的,我们遇到了维护问题,这里的“ 6”是一个魔术数字....但是如果我们正在调用一个方法,该方法的参数之一例如接受整数作为集合的第ith个成员,然后我们将“ 0”传递给该方法调用,那么在这种情况下,我认为“ 0”不是魔术数。你怎么看?

9
如何为新程序员讲授异常处理?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 您如何向程序员讲授异常处理。轻松教授所有其他内容-数据结构,ASP.NET,WinForms,WPF,WCF-您可以轻松地讲授所有内容。 使用异常处理,最终对它们进行尝试尝试只是异常处理的语法性质。 但是,应该教的是-您将代码的哪一部分放在try块中?你在赶路区做什么? 让我用一个例子来说明。 您正在处理Windows Forms Project(一个小型​​实用程序),并且已按照以下3个不同的项目进行了设计。 UILayer 业务层 数据层 如果在DataLayer上引发了异常(让我们说加载XDocument会引发异常)(UILayer调用BusinessLayer,而BusinessLayer依次调用DataLayer),您是否只需执行以下操作 //In DataLayer try { XDocument xd_XmlDocument = XDocument.Load("systems.xml"); } catch(Exception ex) { throw ex; } 哪些再次在BusinessLayer中引发,哪些在UILayer中捕获,在那里我将其写入日志文件? 这是您进行异常处理的方式吗?

6
有效的try / catch块用法?
应该使用catch块来编写逻辑,即处理流控制等吗?还是仅仅为了抛出异常?它会影响代码的效率或可维护性吗? 在catch块中写逻辑有什么副作用(如果有)? 编辑: 我见过一个Java SDK类,其中他们在catch块内编写了逻辑。例如(摘录自java.lang.Integer课堂): try { result = Integer.valueOf(nm.substring(index), radix); result = negative ? new Integer(-result.intValue()) : result; } catch (NumberFormatException e) { String constant = negative ? new String("-" + nm.substring(index)) : nm.substring(index); result = Integer.valueOf(constant, radix); } 编辑2: 我正在阅读一个教程,他们将其视为在异常内编写例外情况逻辑的优势: 异常使您能够编写代码的主要流程,并处理其他地方的特殊情况。 有什么具体准则,何时在catch块中编写逻辑,何时不编写逻辑?

3
什么是去耦?它适用于哪些发展领域?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我最近注意到去耦是问题中的一个话题,并且想知道它是什么以及它可以在哪里应用。 “在哪里可以适用”,我的意思是: 它仅与涉及C和Java之类的编译语言有关吗? 我应该作为Web开发人员了解/研究它吗?

2
什么时候适合在前端进行计算?
我的团队正在开发一个基于WEB的财务应用程序,并且与一位同事存在争议,该将计算保留在哪里-纯粹在后端还是在前端? 简要说明:我们将Java(ZK,Spring)用于前端,将Progress 4gl用于后端。涉及数据库中一些核心数学和数据的计算都保存在后端,因此我不在谈论它们。我说的是用户输入值X,然后将其添加到值Y(在屏幕上显示),然后结果显示在字段Z中的情况。我的意思是,纯简单的jQuery-ish操作。 因此,这里的最佳做法是: 1)使用JavaScript添加值,该值可保存到后端和后端,然后在后端“保存时”验证它们? 2)将所有业务逻辑放在同一位置-因此将值带到后端并在那里进行计算? 3)在前端进行计算;然后将数据发送到后端,在那里进行验证,仅在结果有效且相等时才再次进行计算,然后将其显示给用户? 4)还有别的吗? 注意:我们在Java中进行了一些基本的验证,但与其他所有业务逻辑一样,大多数验证仍在后端。 通过重新计算后端中的所有内容来发送的数据增加不是问题(XML大小较小;服务器和带宽可以承受用户增加的操作量)。

4
使用平面文件与数据库/ API进行前端和后端之间的传输
我有一个应用程序,在几个开发人员之间引起了相当激烈的讨论。 基本上,它分为Web层和后端层。Web层通过一个简单的Web表单收集信息,并将此数据作为JSON文档(字面上是.json文件)存储到后端使用的watch文件夹中。后端每隔几秒钟轮询一次该文件夹,拾取文件并执行其功能。 文件本身非常简单(即所有字符串数据,无嵌套),最大时约为1-2k,系统大部分时间都处于空闲状态(但在任何给定时间突发多达100条消息)。每个邮件的后端处理步骤大约需要10分钟。 当一个开发人员建议使用文件系统作为消息传递层是一个糟糕的解决方案时,这种说法就出现了,而应改为使用诸如关系数据库(MySQL),noSQL数据库(Redis)甚至是普通的REST API调用之类的东西。 应当注意,Redis用于组织中其他地方的队列消息处理。 我听到的论点如下 支持平面文件: 平面文件比任何其他解决方案都更可靠,因为仅在拾取后将文件从“监视”文件夹移至“处理”文件夹,完成后才移至“完成”文件夹。除非存在非常低级的错误,否则消息消失的风险为零,这无论如何都会破坏其他功能。 平面文件需要较少的技术知识来理解-就是cat这样。无需编写查询,也不会意外将消息从队列中弹出并永久消失。 从编程的角度来看,文件管理代码比数据库API更简单,因为它是每种语言的标准库的一部分。这降低了代码库的整体复杂性以及必须引入的第三方代码的数量。 在YAGNI原则规定,平面文件工作得很好,现在,没有表现出需要更换一个更复杂的解决方案,所以离开它。 支持数据库: 扩展数据库比充满文件的目录更容易 平面文件存在有人将“完成”文件复制回“监视”目录的风险。由于此应用程序(虚拟机管理)的性质,这可能会导致灾难性的数据丢失。 要求T / S应用程序具有更高的技术水平,这意味着未受过教育的员工不太可能仅仅通过戳东西来搞砸。 数据库连接代码,尤其是针对Redis之类的数据库连接代码,至少与标准库文件管理功能一样强大。 从开发人员的角度来看,数据库连接代码明显(如果没有功能)更简单,因为它的级别比文件操作更高。 从我的看到,两个开发人员都有很多有效的观点。 因此,在这两个人中,亲文件开发人员或亲数据库开发人员中,哪一个更符合软件工程最佳实践,为什么?

2
是否应该仅通过查看代码就总是知道API在做什么?
最近,我一直在开发自己的API,随着对API设计的投入,我一直对如何改善API设计非常感兴趣。 出现了几个方面(不是我的API用户使用,而是在我对该主题的观察讨论中):一个人应该只通过查看调用API的代码来知道它在做什么。 例如,请参见GitHub上有关此讨论的讨论,例如: foo.update_pinned(true, true); 仅仅通过查看代码(不知道参数名称,文档等),就无法猜测它会做什么-第二个参数是什么意思?建议的改进措施如下: foo.pin() foo.unpin() foo.pin_globally() 这就清除了一切(我猜第二个参数是是否全局固定foo),在这种情况下,我同意后者肯定会有所改进。 但是我相信,在某些情况下,设置不同但与逻辑相关的状态的方法最好作为一个方法调用而不是单独的方法公开,即使您仅通过查看代码也不知道它在做什么。(因此,您必须求助于参数名称和文档以查明-如果我不熟悉API,我个人将始终这样做)。 例如,我SetVisibility(bool, string, bool)在FalconPeer上公开了一种方法,并且我承认只看了一下这一行: falconPeer.SetVisibility(true, "aerw3", true); 您将不知道它在做什么。它设置了3个不同的值来控制falconPeer逻辑上的“可见性” :仅接受接受密码的加入请求,然后回复发现请求。将其分为3个方法调用可能会导致API的用户设置“可见性”的一个方面而忘记设置其他设置,而我仅通过公开一种方法来设置“可见性”的所有方面而迫使他们考虑。此外,当用户想要更改一个方面时,他们几乎总是会想要更改另一个方面,现在可以在一个呼叫中进行更改。

3
编写代码时,我是否必须考虑编译后的机器代码?
例如,我有以下代码: auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; 后来我多次打电话给我。在asm代码中,我看到了使用lambda进行的外部调用。因此,也许我在元编程中获胜,但在asm调试和性能方面是否会输?我是否应该避免使用现代语言功能,宏和其他元编程方面,以确保性能和调试简便性?

10
作为程序员奋斗。需要一些建议[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我已经成为开发人员很多年了。我擅长做我的工作,可以“完成工作”。 但是,“完成任务”和“正确完成任务”之间是有区别的。让我们举个例子。 最近,我从头开始开发了一个网站。该网站运行良好,我没有任何问题。通过查看代码,我认为自己可以做得更好。我本可以减少MySQL查询。我本可以使用MVC来使其扩展更容易(它现在确实需要扩展)。 我决定使用CodeIgniter重写该项目。我喜欢这个框架。但是后来我陷入了困境,因为要减少我的MySQL查询,我必须学习高级联接。 这就是问题所在。每当我做好工作时,我就会不断学习。而且诸如高级MySQL联接之类的主题需要花费一些时间来学习,然后再花费一些时间来实现。 我不在公司工作。我一个人做。因此,我想如果我是一家公司的PHP开发人员,将会有单独的团队来处理SQL。 独奏很难。有时,尽管我的知识很发达,但我发现自己一个问题又一个问题。我可能对自己的工作感到很自豪。但是,如果我必须为一家处理完整项目的公司工作,我可以想象项目会花费一些时间,因为我必须学习越来越多的知识来满足自己的自豪感,并确保我做的事情“正确”。 我确实计划在新的一年后找到工作。我需要工作保障。这就是为什么我问这个问题。 关于自我发展和自我完善,您能提供什么建议?我应该少担心吗?或者,当我不直接处理SQL查询时,可能会找一份PHP开发人员的工作?

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.