方法参数比较多时,将参数封装为参数对象
任何有返回值的方法,都不应该有副作用
临时变量仅使用一次或者取值逻辑成本很低的情况下
将复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途
把复杂的条件表达式拆分成多个条件表达式 , 减少嵌套 。嵌套了好几层的if - then-else语句,转换为多个if语句
当出现大量类型检查和判断时,if else(或switch)语句的体积会比较臃肿 , 这无疑降低了代码的可读性 。另外,if else(或switch)本身就是一个“变化点”,当需要扩展新的类型时,我们不得不追加if else(或switch)语句块,以及相应的逻辑,这无疑降低了程序的可扩展性,也违反了面向对象的开闭原则 。
非正常业务状态的处理,使用抛出异常的方式代替返回错误码
某一段代码需要对程序状态做出某种假设,以断言明确表现这种假设 。
当使用一个方法返回的对象时,而这个对象可能为空,这个时候需要对这个对象进行操作前,需要进行判空,否则就会报空指针 。当这种判断频繁的出现在各处代码之中,就会影响代码的美观程度和可读性,甚至增加Bug的几率 。
空引用的问题在Java中无法避免 , 但可以通过代码编程技巧(引入空对象)来改善这一问题 。
根据单一职责原则 , 一个类应该有明确的责任边界 。但在实际工作中,类会不断的扩展 。当给某个类添加一项新责任时,你会觉得不值得分离出一个单独的类 。于是,随着责任不断增加,这个类包含了大量的数据和函数,逻辑复杂不易理解 。
此时你需要考虑将哪些部分分离到一个单独的类中 , 可以依据高内聚低耦合的原则 。如果某些数据和方法总是一起出现,或者某些数据经常同时变化,这就表明它们应该放到一个类中 。另一种信号是类的子类化方式:如果你发现子类化只影响类的部分特性 , 或者类的特性需要以不同方式来子类化,这就意味着你需要分解原来的类 。
继承使实现代码重用的有力手段 , 但这并非总是完成这项工作的最佳工具,使用不当会导致软件变得很脆弱 。与方法调用不同的是,继承打破了封装性 。子类依赖于其父类中特定功能的实现细节 , 如果父类的实现随着发行版本的不同而变化 , 子类可能会遭到破坏 , 即使他的代码完全没有改变 。
举例说明,假设有一个程序使用HashSet,为了调优该程序的性能,需要统计HashSet自从它创建以来添加了多少个元素 。为了提供该功能,我们编写一个HashSet的变体 。
通过在新的类中增加一个私有域,它引用现有类的一个实例 , 这种设计被称为组合,因为现有的类变成了新类的一个组件 。这样得到的类将会非常稳固 , 它不依赖现有类的实现细节 。即使现有的类添加了新的方法 , 也不会影响新的类 。许多设计模式使用就是这种套路 , 比如代理模式、装饰者模式
继承与组合如何取舍
Java提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类 。自从Java8为接口增加缺省方法(default method),这两种机制都允许为实例方法提供实现 。主要区别在于 , 为了实现由抽象类定义的类型,类必须称为抽象类的一个子类 。因为Java只允许单继承,所以用抽象类作为类型定义受到了限制 。
接口相比于抽象类的优势:
接口虽然提供了缺省方法,但接口仍有有以下局限性:
接口缺省方法的设计目的和优势在于:
推荐阅读
- 棋牌游戏可以用支付宝吗的简单介绍
- 显卡装驱动黑屏了怎么恢复,显卡装驱动黑屏怎么办
- pg数据库内存溢出,pg数据库的剩余空间
- 怎么设置u盘系统,u盘怎么设置系统盘
- php菜鸟教程数据库查询 php实现数据库查询
- 关注山西电信公众号是多少,山西省电信
- 电脑怎么开启快手视频功能,电脑快手怎么弄的
- 即时战略游戏蒸汽朋克怎么玩,蒸汽朋克游戏 即时策略
- vb.net删除换行符 vb 删除行