import类,而不是import整个包
在很多语言里,这通常是一种被推荐的做法,有些甚至是必须的。如果是在C++里,这还算是有点意义,因为更少 #include 意味着更快的编译速度,然而,这种意义仅体现在需要花很长时间去编译的大型项目中。
而对很多像Java这样的语言,这毫无意义。因为它不影响编译的时间,所有你得到的回报只是花更多的努力来维护你的import语句。虽然IDE可以帮助你做这些事情,但你仍然需要时不时的多点几次鼠标/键盘,在版本控制系统里多留几条变更记录,干扰你的代码审查。有什么实际用处?向官僚机构表明代码很规范,无它用途。
面向接口编程
这项编程法则要求程序员定义接口,并针对接口来编程,而不是针对实现编程。理由非常简单:容易开发第二种实现,易于测试(真的吗?),更有效的使用代码。
问题就出在你不能凡事都按照这个原则。我个人认为,如果一个方法需要有多个实现,那使用接口是不二选择。但除此之外,如果你仍遵守的话,除了增加代码量,增添麻烦外,不会有任何好处。而且,把一个类重构成接口和它的实现并不困难,事实上是非常简单,所以,为什么一开始就要写接口呢,当需要时把它改造成接口也不晚。
禁用某种语言功能
在很多企业、组织使用的编码规范中,你会发现各种各样的类似于“不要使用goto语句”,“不要使用三元操作符”等规则。
如果一种语言的某种语法并未标志为“deprecated”,为什么不让人使用?当然,要正确的使用!即使像 goto 这样的语法同样可以让代码更可读、更易理解——只要你能以正确的方式、用在正确的地方。
使用Setters/getters,禁止public属性
这是最著名的Java风格,Java里任何公有属性都是不提倡的,任何属性都应该通过 setters 和 getters 操作,不允许有任何质疑。有些共用框架更加强化了这些。每次当我看到一个5年前的老类里只有一些私有属性和公有的无聊的 setters 和 getters ,我都会奇怪这是要干嘛?是为了增加代码量?是为了预防将来有可能出现意外的属性值修改?但是如果真的有人修改了,这又能起到什么预防效果?
单个返回语句
有人说多个返回语句会让代码变复杂。我发现却正好完全相反。当方法/函数在退出之前需要做一些收尾工作时,单一return语句会让函数更简单,但在其它很多情况下,这反而会让事情变得复杂,你需要添加额外的if-else来处理各种非正常退出情况。
尽量责任分离
我这里主要是针对“尽量”。有些人把这做到了极限,甚至有些变态。没错,把大的复杂的问题拆分成小的简单问题,这很好。但拆的太小就会引起新的问题。如果你把一棵树砍成牙签那么大小的块,你得到的就是一堆垃圾。
有些问题本身就是很复杂,你无法通过拆解来让它变简单。
为了让这篇文章有个比较积极的结尾,下面是我认为的放之四海皆准的最佳实践方法:
- 做任何事情都要有个理由
- 如果你做的未能符合预期,重做,替换方法或给予修正
- 扔掉垃圾通常是你最应该做的事情——不论这垃圾造价多高
本文转载自http://www.aqee.net/programming-best-practices-i-disaprove/
相关推荐
### 多维随机数的生成方法 #### 一、一维随机数生成方法 ##### 1.1 常见随机数的生成 在实际应用中,常常...不同的应用场景可能需要选择不同的方法来达到最佳效果。在实践中,应根据具体需求灵活选择合适的方法。
模拟退火算法的核心步骤包括以下几个部分: 1. 初始化:设置初始温度(通常较高)和初始状态(如随机路径)。 2. 计算当前状态的能量(代价),例如路径的总距离。 3. 生成一个新的状态(邻居解),例如通过交换...
9. **网络安全和最佳实践**:讨论网络编程中应考虑的安全问题,如数据加密、身份验证、防止拒绝服务攻击等,并给出相应的安全编码建议。 通过学习这本书,读者将能够掌握Windows环境下使用Winsock进行网络编程的...
在JavaScript中使用Promise,有以下几个关键点: 1. Promise构造函数接受一个函数作为参数,这个函数也接受两个参数:resolve和reject,分别用于将Promise状态改变为fulfilled或rejected。 2. Promise.all方法可以...
在MFC中处理注册表,我们通常会用到几个关键类,如`CRegKey`。`CRegKey`类提供了对注册表进行读写、创建、删除键值等操作的方法。下面将详细介绍如何使用MFC进行注册表安全设计: 1. **打开注册表键**:首先,我们...
**软件生命周期**通常包括以下几个阶段: 1. **需求分析**:此阶段主要任务是收集和理解用户的需求,并明确软件的功能和性能要求。 2. **设计**: - **架构设计**:定义软件的整体结构和组成部分。 - **详细设计*...
- **官方文档**:各种编程语言的官方文档通常包含有关并发编程的指南和最佳实践。 - **社区和论坛**:Stack Overflow、Reddit等,可以提供实际问题的帮助和讨论。 ### 线程池的优雅使用 #### 线程池引入 线程池是...
在MATLAB源程序`anneal.txt`中,我们可以预期看到以下几个关键部分: 1. **初始化**:首先,程序会定义初始解,这通常是一个随机的解决方案。此外,还会设置初始温度(T)、最终温度(T_min)和冷却因子(α),...
**MATLAB编程实践** 在MATLAB中实现这两种算法,主要涉及以下几个方面: - **矩阵运算**:MATLAB是矩阵运算的利器,适合处理大量数据的计算。 - **函数定义**:定义适应度函数、接受概率函数、禁忌判断函数等。 - ...
在.NET安全编程中,我们主要关注以下几个关键知识点: 1. **代码访问安全(CAS)** 代码访问安全是.NET框架的核心安全机制之一,它允许系统根据代码的来源、数字签名和其它属性来确定代码的权限。CAS可以防止恶意...
该指南分为相关规则的几个部分。 我试图添加规则背后的基本原理(如果省略,我认为这很明显)。 我不是凭空想出所有规则的; 它们主要基于我作为专业软件工程师的广泛职业生涯、来自 Emacs Lisp 社区成员的反馈和...
在编程实践中,我们可以创建一个deferred对象,然后通过.then()方法来处理异步操作的不同结果。在给定的代码片段中,$scope.send()函数内部首先创建了一个deferred对象,然后通过promise对象的链式调用来处理promise...
动态权限申请的基本流程包括以下几个步骤: 1. **检查当前权限状态**:首先,你需要在需要使用权限的地方检查用户是否已经授予了该权限。这可以通过`ContextCompat.checkSelfPermission()`方法完成,传入上下文和...
【信息安全技术:防御CSRF攻击】\n\nCSRF(Cross-Site Request Forgery,跨站...同时,开发人员也应遵循最佳实践,如限制GET请求的敏感操作,使用HTTPS加密通信,以及保持软件和框架的更新,以应对不断演化的攻击手段。
在Struts中实现文件上传,主要涉及以下几个步骤: 1. **配置Action类**:首先,你需要创建一个处理文件上传的Action类。这个类通常会继承自`org.apache.struts2.dispatcher.multipart.MultiPartRequest`或使用...
OPC分为OPC DA(Data Access)、OPC HDA(Historical Data Access)、OPC AE(Alarms and Events)等几个主要部分,分别用于实时数据访问、历史数据访问和报警事件处理。C#中的OPC编程通常涉及与OPC服务器的交互,...
用户端的实现可能包括以下几个模块: 1. 用户登录注册:使用C#的ASP.NET框架,结合数据库进行用户身份验证和信息存储。 2. 预约挂号:涉及到数据库查询、事务处理和时间冲突检查,确保预约的公平性和准确性。 3. ...
除此之外,C++的“四书五经”还包括更多其他经典著作,如《Effective C++》、《More Effective C++》、《Exceptional C++》等,它们从不同的角度提供实用的编程技巧和最佳实践,帮助程序员写出高效、可靠的代码。...
- **拒绝策略**:当线程池已满且无法接受新任务时的处理策略。 #### 八、结论 综上所述,线程池是Java并发编程中的一个重要概念,它可以帮助开发者更高效地管理线程资源,提高应用程序的性能。理解线程池的工作...