zoukankan      html  css  js  c++  java
  • [读书笔记] 代码整洁之道(五): 系统

    第十一章 系统

    1. 将系统的构造和使用分开。

      系统的构造和使用是非常不一样的过程,在起始过程中构建应用对象,会存在相互结缠的依赖关系。

       public Service getService() { 
       	if (service == null)
       		service = new MyServiceImpl(...); // Good enough default for most cases? 			return service;
       }
      

      这就是所谓延迟初始化/赋值

      • 好处:在真正使用到对象之前,无需操心这种架空构造,起始时间更短,而且永远不会返回null值。

      • 坏处:我们也得到了MyServiceImpl及其构造器所需一切的硬编码依赖,不分解这些依赖关系就无法编译,即便在运行时永不使用这种类型的对象!

      解决方法:

      • 将全部构造过程搬迁到main或被称之为main的模块中,设计系统其余部分时,假设所有对象都已经构造和设置。

      • 工厂: 有的时候应用程序也要负责确定何时创建对象。
        设计模式——抽象工厂模式(Coming out...)

      • 依赖注入DI控制反转IOC在依赖管理中的一种应用手段。控制反转将第二权责从对象中拿出来,转移到另一个专注于此的对象,符合SRP。

        JNDI是查找DI的一种部分实现。在JNDI中,对象请求目录服务器提供一种符合某个特定命名的服务。

        MyService myService = (MyService)(jndiContext.lookup("NameOfMyService"));
        调用对象并不控制真正返回对象的类别(前提是实现了恰当的接口),但调用对象仍然主动分解了依赖。

        Spring框架提供了最有名的Java DI容器。

    2. 扩容

      EJB架构处理持久化、安全和事务的方法是预期面向方面编程AOP,AOP是恢复横贯式关注面模块化的普适手段。

      AOP中,方面aspect的模块构造指明了系统中那些点的行为会以某种一致方式被修改,从而支持某种特定的场景。这种说明是用某种简洁的声明或编程机制来实现的。

      以持久化为例,可以声明哪些对象和属性应当被持久化,然后将持久化任务委托给持久化框架。行为的修改由AOP框架以无损方式在目标代码中进行。

    3. Java代理

      适用于简单情况的,例如在单独的对象或类中包装方法调用。JDK提供的动态代理仅能与接口协同工作

      代码量和复杂度是代理的两大弱点,同时代理没有提供在系统范围内执行点的机制(AOP解决方案必须的)。

    4. 纯Java AOP框架

      Spring AOP和JBoss AOP内嵌代理,从而能够以纯Java代码实现面向方面编程。

    5. AspectJ的方面

      通过方面来实现关注面切分的功能最全语言——AspectJ。

    6. 最佳的系统架构是由模块化的关注面领域组成,每个关注面均用Java对象实现,不同领域之间用最不具有侵害性的方面或类方面工具整合起来。这种架构能测试驱动,就像代码一样。

    7. 优化决策

      模块化和关注面切分成就了分散化管理和决策。

      拥有模块化关注面的POJO系统提供的敏捷能力,允许我们基于最新的知识做出优化的、时机刚好的决策。决策的复杂性也降低了。

  • 相关阅读:
    如何编写自己的Linux安全检查脚本?
    ubuntu桌面版打开终端Terminal的几种方法
    Docker 学习笔记(CentOS 7.1)
    发送验证码倒计时
    在Thinkphp中使用AJAX实现无刷新分页
    php加密解密
    浏览器用户用滤镜实现网页的翻转效果
    PHP定时执行任务的实现
    PHP GBK UTF8互转
    在php4下可用,简单的php数组转成json格式,
  • 原文地址:https://www.cnblogs.com/nextStep/p/4842227.html
Copyright © 2011-2022 走看看