源代码分离
不同的代码,放在不同的目录,或放在工程下的不同模块,分开管理
这点初学者基本都能做到
功能分离
不同模块的功能定位非常清晰,没有交叉混乱的情况
当工程规模变大,需求变得复杂,或者有很多奇葩要求时,很多人就做不到这一点了
依赖分离
当我们不需要使用某个模块时,可以直接在打包时去除整个模块
大多初中级工程师做不到这一点,大多工程师的模块化,只是将不同功能,不同实现写到不同的模块
主模块还是会使用到所有的子模块代码,只是通过if-else或switch控制调用哪个子模块代码而已
绝对的依赖分离,应当是通过配置文件和接口化编程去实现的
比如我们定义了一个登录功能的接口ILogin,它有两种实现方案LoginImplA和LoginImplB,这两个模块的代码写在不同的模块
当我们需要使用LoginImplA时,就在配置文件中指定ILogin的实现类为LoginImplA,同时可以直接屏蔽LoginImplB模块
而不是通过if(xxx) login = new LoginA else login = new LoginB这种方式,这种代码就算你不使用LoginImplB模块了,还是得将它打包进去,否则编译就会报错
这种方式需要配合一些动态技术去实现,比如Java的反射,C++的make脚本等,完全做到并不容易