同事昨天接收到这样一份任务:梳理现在Android项目中“顶层包”的依赖关系,从而进行层次结构的梳理。

在一起的探索的过程中,发觉收获还是蛮大的,灵感突发,马上梳理于此。

(一)使用Java包的目的

在了解做一件事之前,我们需要了解做这件事的目的。而使用Java包的目的大概如下:

1    对类进行归类,便于开发查找。

2    将软件在代码层面上模块化,提升可测试,可维护性。

3    将软件在代码层面上层次化,提升可读性,层次分明。

(二)包的命名 要梳理包的依赖关系,首先我们要把握包的命名规则,一旦名字取的不好。在梳理包依赖关系时,便将各种纠结。

Java的包是多个类的集合。包的命名,或以独立功能为准,或以层次划分为准。

(三)命名与依赖关系

项目中以独立功能命名的包,往往倾向被其它包依赖,而不能依赖其它包。

项目中以层次划分的包,往往倾向于向下依赖,而不能依赖于上层包。

总的来说,“包依赖关系体现出软件层次划分(竖向),功能模块划分(横向)”。

(四)获取代码中的包依赖关系

a.使用Java编译报错特性:同事通过Eclipse工具,对依赖包进行“refrector”操作(不勾选“update reference”选项),查看编译时的其它包报错,这样去确定哪些包依赖此包。从而逐个通过画图工具把包依赖关系绘制出来。(注:这种方式比较取巧,幸亏项目中的包并不是很多,同事花了30分钟就搞定了)

b.使用Eclipse插件modelgoon:http://www.oschina.net/p/modelgoon。利用此工具可以方便的导出包依赖关系。(注:同事觉得非常简单好用)

(五)对“单向依赖”的追求

从包依赖关系图中,我们通过箭头呢,我们可以清晰的看到:一个包被哪些包依赖,而这个包又依赖哪些包。一般呢,一个包更倾向于“被单向依赖”,这意味这个包是可独立,可维护。对于软件测试来讲,单向依赖的包更容易进行单元测试。额外的,如果此包被广泛使用,我们更多会将该包作为一个开发组件,并以一个独立项目的方式来对其进行维护,当然这只是后话了。

吐槽:一个三年开发过程的项目,可能才诞生出一个独立的开发组件。而这种组件,除非牛b闪闪,前无古人,后无来者。要不然随便来一个第三方库都可以把你替换掉。

(六)消灭“循环依赖”

“循环依赖”是指两个包之间互相依赖。如何消灭“循环依赖”呢?,我归类出以下三种方法:

1  拆迁法。

A包的某些类或某些方法规划不合理,应该将其放在B包或者放在C包。

2  合并法。

B包所包含的业务属于A包的范围。将B包作为A包的子包。

3  依赖于接口法。

A包依赖B包,B包依赖A包的特定函数方法。这样可以通过依赖于抽象,来执行包与包之间的解耦。

(七)附转:包划分的几个小原则:

1  一个包要么包含独立的功能,要么代表某层的功能。否则包的划分就没有意义,且查找起来很混乱。

2 某类的子类。(比如接口或者虚类不同的实现)应当单独放到某个包中。

3 假设A包依赖B包,那么B包不应该依赖A包。例如不应当在B包中出现包含A包中类的接口或属性。如果必须增加接口,则应当使用普通类或者B依赖的包中的类组织信息。

否则提取B包中的功能时,会牵扯出不需要的A包。

4 如果A包,B包均依赖于C包,则包c不应当为A或B的子包。

java 包 划分_Java包的命名与划分相关推荐

  1. java jar包示例_Java包isCompatibleWith()方法与示例

    java jar包示例 包类的isCompatibleWith()方法 (Package Class isCompatibleWith() method) isCompatibleWith() met ...

  2. java jar包示例_Java包getSpecificationVendor()方法和示例

    java jar包示例 包类的getSpecificationVendor()方法 (Package Class getSpecificationVendor() method) getSpecifi ...

  3. java jar包示例_Java包getImplementationTitle()方法和示例

    java jar包示例 包类的getImplementationTitle()方法 (Package Class getImplementationTitle() method) getImpleme ...

  4. java jar包示例_Java包getImplementationVersion()方法和示例

    java jar包示例 包类的getImplementationVersion()方法 (Package Class getImplementationVersion() method) getImp ...

  5. java jar包示例_Java包getSpecificationVersion()方法和示例

    java jar包示例 包类的getSpecificationVersion()方法 (Package Class getSpecificationVersion() method) getSpeci ...

  6. java怎么导入包语句_java包(package),包导入详解

    之前给大家介绍了一下java包包定义的内容,下面的话,就接着来给大家讲一下包导入的内容,一起来了解一下吧. 假如,使用不同包当中的其他类,就要使用这个类的全名,也就是包名加上类名,下面是代码:exam ...

  7. java 包别名_Java包导入别名

    不,你不能做"导入x为y;"在Java中. 你可以做的是扩展类,或为它编写一个包装类,然后导入它. import com.backend.mypackage.a.b.c.UserD ...

  8. java老年代_Java新生代老年代的划分及回收算法

    Java堆(Java Heap)是JVM所管理的最大内存区域,也是所有线程共享的一块区域,在JVM启动时创建. 此内存区域存放的都是对象的实例和数组.JVM规范中说到:"所有的对象实例以及数 ...

  9. JAVA多态/封装/接口/包/包的命名规则——java面向对象

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点 消除类型之间的耦合关系 可替换性 可扩充性 接口性 灵活性 简化性 多态存在的三个必要条件 继承 重写 父类引用指向子类 ...

最新文章

  1. php会话(session)生命周期概念介绍及设置更改和回收
  2. 专注力 化繁为简的惊人力量
  3. DIY一个高大上带提醒的计时器,简单实用,你还在等什么
  4. CodeForces - 1324F Maximum White Subtree(树形dp)
  5. 运行ant脚本(转载)
  6. 在操作系统重启后恢复应用程序的工作状态
  7. 【java web】java执行预编译Groovy脚本
  8. [转载] Linux进程基础
  9. 决策树ID3算法[分类算法]
  10. 四个简单的步骤告别烦人的flash广告
  11. matlab 生成dbc文件,simulink中使用dbc文件实现CAN消息发送与代码生成
  12. 基于穿戴式智能化步态分析仪的步态分析
  13. MySQL 5.7--------多实例部署最佳实战
  14. 在Termux中安装Kali教程
  15. 获取电信光猫TEWA-600超级管理密码,修改电信光猫为桥接模式
  16. .NET中LinkButton的使用
  17. 怎样理解人生观、价值观、世界观?
  18. 柯桥留学日语培训机构有吗日本人平时都喝什么酒?
  19. pdf 加深 扫描件_福昕PDF如何用更高的DPI将文档扫描成PDF
  20. 2022/3/26扫雷

热门文章

  1. Linux系统分区及LVM使用(一)
  2. 克鲁斯卡尔重构树小结
  3. PHP操作图片简单案例
  4. 列表list,元组tuple,字符串
  5. java实现.net中的枚举
  6. C#性能优化考虑的几个方向
  7. JSP中鼠标禁用代码
  8. numpy 加速 矩阵相加_图解入门 NumPy !
  9. asp.net 设置 excel alignment_Python 进阶(六): Excel 基本操作
  10. 一文带你领略JS中原型链的精妙设计