Questions tagged «programming-practices»

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

6
渐进增强与单页面应用程序
我刚从波士顿的一次会议“ An Event Apart”回来。 演讲者中一个真正流行的主题是渐进增强的想法-网站的内容应以HTML形式出现,而JavaScript仅应用于增强行为。 发言者提出的逐步提高的论点非常有说服力。它不仅是支持旧版浏览器和低带宽网络设备的可靠模式,而且HTML失败的可能性要远远超过JavaScript(例如,不支持的标记会被忽略,而如果浏览器在执行您的浏览器时抛出异常)脚本-您被水喉)。 杰里米·基思(Jeremy Keith)对此进行了特别有见地的演讲。 但是,诸如Backbone和Angular的单页Web应用程序呢?这些框架背后的整个设计似乎促使开发人员将内容移出HTML,并移入JSON API之类的东西。 我似乎无法凝结这两种设计模式:渐进式增强与单页Web应用程序。有没有一种情况比另一种更好?还是它们甚至不是对抗性技术,而我的思维模式却在这里缺失了一些东西?

5
为什么我们需要动态类型语言的枚举?
我在这里阅读一些代码,发现一个枚举用于存储html标签的名称。为什么我们需要这样做?使用此策略有什么好处? 我知道枚举在编译或静态类型的语言中有多么有用,但是当我看到动态类型的语言中的枚举时,我会感到好奇,就像上面显示的示例代码一样。因此,问题基本上可以归结为为什么我们需要使用动态类型语言的枚举,或者根本不需要它们?

5
不良做法-将案例切换到设置环境
在我担任开发人员的最近三年中,我看到了许多示例,这些示例中的人们使用switch语句设置URL的路径(后端和前端)。下面是一个示例: 后端示例(C#): public static string getHost(EnvironmentEnum environment){ var path = String.Empty; switch (environment) { case EnvironmentEnum.dev: path = "http://localhost:55793/"; break; case EnvironmentEnum.uat: path = "http://dev.yourpath.com/"; break; case EnvironmentEnum.production: path = "http://yourpath.com/"; break; } return path; } 前端示例(JavaScript): (function () { if (window.location.host.indexOf("localhost") !== -1) { window.serviceUrl = "http://localhost:57939/"; } else …

5
为什么现在n层开发中的代码库现在有相等数量(甚至更多)的JavaScript代码?
我已经从事Web编程很长时间了,在某个地方,我无法知道为什么我们现在正在做我们所做的事情(或者我们是如何以这种方式来做事情的)? 我从基本的ASP Web开发开始,很早就在页面上混合了显示和业务逻辑。客户端开发之间千差万别(VBScript,不同的JavaScript风格),并且我们对服务器端验证有很多警告(因此我远离客户端逻辑)。 然后我搬到了ColdFusion了一段时间。ColdFusion可能是第一个使用其标签将显示和业务逻辑分开的Web开发框架。对我来说似乎很清楚,但非常冗长,并且ColdFusion的市场需求不高,所以我继续前进。 然后,我跳上ASP.NET的旅行车,开始使用他们的MVC方法。我还意识到Java似乎是企业系统的象牙塔语言,并尝试了MVC方法。后来,ASP.NET开发了这种MVVM设计模式,而Java(准确地说是J2EE或JEE)也很挣扎,并提出了其MVC2方法。 但是今天,我发现,后端编程不再是令人兴奋和进步的地方。而且,基于服务器端的MVC做法似乎已经过时了(人们真的不再使用JSTL吗?)。今天,在我从事的大多数项目中,我发现JavaScript框架和客户端开发是所有令人激动和创新的进步的来源。 为什么要进行从服务器到客户端的开发?我对我的一个JEE项目进行了简单的行计数,并且JavaScript中的代码行比Java多(第三方库除外)。我发现使用Java或C#等编程语言进行的大多数后端开发只是为了生成类似REST的界面,并且解决了显示,可视化,数据输入/输出,用户交互等所有艰苦的工作。通过诸如Angular,Backbone,Ember,Knockout等客户端框架... 在jQuery之前的时代,我看到了很多图,其中n层开发中的MVC中的M,V和C之间存在清晰的概念性界线。jQuery后,这些线在哪里绘制?看起来MVC和MVVM都可以在客户端的JavaScript代码中找到。 我想知道的是,为什么我们要进行这样的转换(从服务器端编程的重点到客户端的方方面面,从偏爱编译语言到脚本语言,从命令式到功能性编程,所有这些似乎都是同时发生的) ),此过渡/转移解决了哪些问题?

9
while(true)和循环中断-反模式?
考虑以下代码: public void doSomething(int input) { while(true) { TransformInSomeWay(input); if(ProcessingComplete(input)) break; DoSomethingElseTo(input); } } 假设此过程涉及有限但与输入有关的步骤数;循环的目的是由于算法而自行终止,而不是设计为无限期地运行(直到被外部事件取消为止)。因为检查循环是否应该结束的测试是在逻辑步骤的中间,所以while循环本身目前不检查任何有意义的事情;而是在概念算法的“适当”位置执行检查。 有人告诉我这是错误的代码,因为由于循环结构未检查结束条件,所以它更容易出错。弄清楚如何退出循环会更加困难,并且由于将来的更改可能会意外地忽略或破坏中断条件,因此可能会引发错误。 现在,代码的结构如下: public void doSomething(int input) { TransformInSomeWay(input); while(!ProcessingComplete(input)) { DoSomethingElseTo(input); TransformInSomeWay(input); } } 但是,这会重复调用代码中的方法,这违反了DRY。如果TransformInSomeWay后来被其他方法替换,则必须找到并更改这两个调用(在更复杂的代码中可能不那么明显地存在两个调用)。 您也可以这样写: public void doSomething(int input) { var complete = false; while(!complete) { TransformInSomeWay(input); complete = ProcessingComplete(input); if(!complete) { DoSomethingElseTo(input); } …

11
typedefs和#defines
我们每个人肯定都使用了typedefs和#defines。今天,在与他们一起工作时,我开始思考一件事。 请考虑以下两种情况,以使用int其他名称的数据类型: typedef int MYINTEGER 和 #define MYINTEGER int 与上述情况类似,在很多情况下,我们可以使用#define很好地完成某件事,并且也可以使用typedef进行相同的操作,尽管我们进行相同操作的方式可能完全不同。#define还可以执行typedef不能执行的MACRO操作。 尽管使用它们的基本原因是不同的,但是它们的工作有何不同?当两者都可以使用时,什么时候应该优先使用另一种呢?另外,在某些情况下,是否可以保证一个比另一个更快?(例如,#define是预处理程序指令,因此所有操作都比编译或运行时更早完成)。

15
如何在不感到极端焦虑的情况下自动化生产部署?
在我们的工厂中,我们使用SVN进行源代码控制,使用Cruise Cruise进行CI处理处理针对我们的开发,测试和集成环境的自动构建和部署。 所有这些都可以顺利进行,但是由于硬件和资源的限制,我们的集成环境不是像生产环境那样的2服务器负载平衡环境。尽管其他所有条件都相同,但这将是我们的集成和生产环境之间的唯一区别(尽管很大!) 从理论上讲,区别是我们的应用程序服务器的配置稍有不同,并且部署脚本仅需将构建工件放到两台服务器中,而不是仅仅放到两台服务器中,但是为什么我如此紧张地自动化我们的生产部署? 我通常不是控制狂,但是我总是感到需要手动将生产部署到生产中。我从同事那里听说,这通常是Really BAD Thing™,但他们没有提出反对的理由。 我知道,当我手动执行操作时,可以看到我正在物理上复制正确的文件,正在物理上关闭应用程序服务器并确保它们成功关闭,我正在物理上启动服务器,然后进行物理检查以创建日志确保启动正常并且部署成功。它使我安心。 对于自动脚本化生产部署,反对此OR参数的参数是什么?


6
在无法到达的代码中抛出新的RuntimeExceptions是否不好?
我被指派去维护一个由更熟练的开发人员编写的应用程序。我遇到了这段代码: public Configuration retrieveUserMailConfiguration(Long id) throws MailException { try { return translate(mailManagementService.retrieveUserMailConfiguration(id)); } catch (Exception e) { rethrow(e); } throw new RuntimeException("cannot reach here"); } 我很好奇投掷RuntimeException("cannot reach here")是否合理。知道这段代码来自经验丰富的同事,我可能会漏掉一些明显的东西。 编辑:这是一些答案所指的扔尸体。我认为这个问题并不重要。 private void rethrow(Exception e) throws MailException { if (e instanceof InvalidDataException) { InvalidDataException ex = (InvalidDataException) e; rethrow(ex); } if (e …

11
一个程序员的Scrum?[关闭]
在我很小的公司中,我被誉为“ Windows专家”,其中包括我自己,担任销售和培训职位的机械工程师以及担任设计,开发和支持职位的公司总裁。 我的角色与一般情况相同,但主要是我设计和实现产品上需要完成的所有编程,以便我们的产品可以在任何最新版本的Windows上运行。 我刚刚看完了网络广播中对Scrum范例的高级概述。我的问题是:鉴于我的开发工作项目通常是在很高的层次上给出的,例如“产品国际化和本地化”,是否值得我花更多时间来学习这种产品开发方法。 如果是这样,您将如何建议改编Scrum以仅使用一名程序员?有哪些工具(基于云的工具或其他工具)对此有用? 如果不是,您会建议一个程序员每天采用哪种方法来组织他的工作?(也许问题简化为那个简单的问题。)

10
您通常将对象或其成员变量发送到函数中吗?
这两种情况之间普遍接受的做法是: function insertIntoDatabase(Account account, Otherthing thing) { database.insertMethod(account.getId(), thing.getId(), thing.getSomeValue()); } 要么 function insertIntoDatabase(long accountId, long thingId, double someValue) { database.insertMethod(accountId, thingId, someValue); } 换句话说,通常是将整个对象传递给您,还是只传递所需的字段,这更好吗?

4
何时不应该对提交进行版本标记?
上下文:我最近发现了语义版本控制,并且正在尝试确定如何在我自己的项目中最佳地实际使用它。 鉴于semver需要对主要更改,次要更改和补丁进行版本控制,何时不应使用更​​新的版本标记提交?在我看来,每项更改都将属于这些类别之一,因此,应对每项更改进行版本控制,但是当我查看GitHub上的各种流行项目时,这似乎并不是事情的完成方式(只是看一下实际上,大型项目只有数以百计的标签才有成千上万次提交。

4
当难以或无法获得硬件设置来重现错误时,如何有效地排除故障或测试新代码?
我在一家中型公司(拥有150名员工,约有10名规模的工程团队)工作,我的大多数项目都涉及与实验室设备(示波器,光谱分析仪等)的接口,以实现半自动化测试应用。我遇到了几种不同的情况,由于我不再或从来没有可用的硬件设置,因此无法有效地排除故障或测试新代码。 示例1:使用台式型传感器独立运行10-20个“老化”过程的设置-我能够获得一个这样的传感器进行测试,并且偶尔可以花一秒钟来模拟与之连接的所有方面多个设备(搜索,连接,流式传输等)。 最终出现了一个错误(最终最终归结于设备固件和驱动程序中),仅用一个单元就很难准确地再现该错误,但是当同时使用10-20个此类设备时,该错误接近“显示停止器”的水平。这仍未解决,仍在进行中。 示例2:需要昂贵的光谱分析仪作为其核心组件的测试。该设备相当老旧,是一家制造商遗留下来的,后者被一家较大的公司收购,并且基本上已经解散,并且它的唯一文档是冗长的(且内容不丰富的)文档,翻译起来似乎不好。在最初的开发过程中,我能够将设备保持在桌面上,但现在在24/7多周的测试中,无论是在物理上还是在计划中都将其捆绑在一起。 当错误显示出与设备相关或无关的错误时,我经常需要麻烦测试应用程序外部的代码并将其装入,或者盲目编写代码并尝试在两次运行之间的某个测试时间内进行压缩,程序逻辑要求OSA和其余测试硬件都安装到位。 我想我的问题是我应该如何处理?我可能会花一些时间来开发设备模拟器,但是弄清楚开发估算值将使它比大多数人想像的更多。它也可能无法准确地重现所有问题,而且很少有人看到同一设备在这里两次使用过。我可以在单元测试方面变得更好...等等...我也可以大声地谈论这个问题,并让其他人理解将需要暂时的延迟,这不只是研究和开发的头痛,而是通常被认为是在开玩笑当投入制造业时。


5
何时何地应使用void(而不是例如bool / int)
我偶尔会碰到一些方法,开发人员选择返回一些对函数不重要的东西。我的意思是,当看代码时,它显然void和一样好,并且经过一会儿思考,我问“为什么?” 这听起来很熟悉吗? 有时我会同意,通常最好返回一个诸如boolor的值int,而不是仅仅做一个void。从总体上看,我不确定优缺点。 根据情况,返回int可以使调用方知道受该方法影响的行或对象的数量(例如,将5条记录保存到MSSQL)。如果“ InsertSomething”之类的方法返回布尔值,那么我可以将设计为true成功的方法返回,否则返回false。呼叫者可以选择对该信息采取行动或不采取行动。 另一方面, 会导致方法调用的目的不明确吗?错误的编码经常迫使我仔细检查方法的内容。如果返回某些内容,它将告诉您该方法的类型必须对返回的结果进行某些处理。 另一个问题是,如果您不知道方法的实现,那么开发人员决定返回什么功能并不关键的东西?您当然可以发表评论。 当处理可以在方法的右括号中结束时,必须处理返回值。 引擎盖下会发生什么?调用的方法是否false由于抛出错误而得到?还是由于评估结果而返回false? 您对此有何经验?您将如何处理?

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.