1.易被理解和挑错
2.易被测试
3.易于重构
1.拥有许多依赖,使模块难以理解和独立测试
2.总是访问全局作用域下的数据
3.代码存在副作用,没法被初始化和被重复使用
4.接口众多且不隐藏实现细节,难以在不修改其他组件的情况下重构。