演化架构和紧急设计(笔记)

一,可重用代码

1. 惯用模式有两种类型:

         a. 技术模式 —— 包括事务、安全性和其他基础结构元素

         b. 域模式 —— 包括单个应用程序内或跨多个应用程序的业务问题的解决方案

2. 设计即代码

   last responsible moment  — 不是将决定推迟到最后时刻,而是最后可靠时刻。等待的时间越长,就越有机会拥有适合的设计。

3. 表达性

   应该尽量选择表达性最强的语言

4. 抽象的风格

  不同的语言以不同的方式处理抽象

  函数式语言: Scala 和Clojure

  在大多数函数式语言中,默认方式是创建不可变变量

  这意味着以函数式语言编写多线程应用程序要容易得多,因为不可变数据结构与线程交互起来非常自然,因而代码可以很简洁

  Collaborative Diffusion: Programming Antiobjects

5.将模式作为 APIs 予以获取

   目前使用的大多数开源框架都是与解决特定问题相关的惯用模式集。

   Spring 是用于处理依赖项注入和构建的技术惯用模式集合

   避免结构重复

   强制用户输入主机对象(desc)会给代码增加不必要的干扰。大部分 APIs 包括主机对象并将其作为 API 的入口点,您必须携带它们才能访问 API。

   解决:

       a. 通过一个匿名内部类的作用域界定 “携带” 主机对象

          负面效应 :   难以区分您提取的设计元素,因为它们看起来就像您的所有其他代码。

MarketingDescription desc = new MarketingDescriptionImpl() {{
    setType("Box");
    setSubType("Insulated");
    setAttribute("length", "50.5");
    setAttribute("ladder", "yes");
    setAttribute("lining type", "cork");

}};  
  

   Java 语言中的 4 种不同的初始化方法:

       a. 在 main() 方法中

       b. 在构造函数中

       c. 在一个静态 初始化块中,在加载类时执行

       d. 在一个初始化块中,仅在构造函数之前执行

    //初始化顺序
    public class InitializerDemo {
        //4. 
        public InitializerDemo() {
            out.println("in constructor");
        }
        //1. 类加载的时候调用   
        static {
            out.println("in static initializer");
        }
        //3.  
        {
            out.println("in instance initializer");
        }

        //2. 
        public static void main(String[] args) {
            out.println("in main() method");
            new InitializerDemo();
        }
    }  
6.  使用元程序设计

元程序设计提供一种不错的方式将模式代码与实现代码区分开来

二。使用 DSL

   使这些代码看起来不像源代码而更像您正在尝试解决的问题

   DSL 特征 (Martin Fowler 所定义的)

   1. 计算机编程语言

   2. 语言天性 : DSL 对于非程序员至少是隐约可读的

   3. 领域焦点:只关注一个特定的问题领域

   4. 有限的表现力: 很少能找到一个 DSL 含有诸如循环和判定的控制结构。相当多的 DSL 是声明式的,而不是指令式的。

   5.非图灵完整的(Turing complete):


三。连贯接口

      Fowler 的书中确定的一个公共 DSL 模式叫作连贯接口(能够为一系列方法调用中转或维护指令上下文的行为

1. 几种连贯接口

   a.方法链接:  使用方法的返回值来中转指令上下文,在这种情况下是进行第一个方法调用的对象实例。

        calendar.add("dentist"). from(fourPM). to(fivePM). at("123 main street");     

        连贯接口固有的一个缺陷:终了问题

   b.通过参数进行包装:

       calendar.add( new Appointment("Dentist"). at(fourPM));

    c. 通过功能序列进行包装

       使用继承性和匿名内部类来创建上下文包装器

       calendar.add(new Appointment() {{ name("dentist"); from(fourPM); to(fivePM); at("123 main street");}});


       

 

Architecture represents the significant decisions, where significance is measured by cost of change.
-Grady Booch

架构 关注点
1.结构(Structure)
2.一致性(Consistency)
3.交互性(Interoperability)
4.Frameworks and Libraries
5.Team&Technology

流程解耦
办法:Mediator模式,Worker-Controller模型
1.节点和流程分离;
2.Notify-Dispatch;
3.上下游节点低耦合;
4.Global View集中在controller;
5.流程管理变更点少。

Mediator Pattern的其他应用场景
1.对象耦合:Spring IoC Container;
2.数据耦合:Canonical Data Format;
3.通讯耦合:Enterprise Service Bus(ESB)
            Internet

Asynchronous 航信通讯
1.查询请求存入DB,不直接调通讯服务器;
2.通讯服务器从DB取得查询请求;
3.API在写入时判断并排除重复查询;
4.峰值流量得到控制。


艺龙架构案例-面向运维
1.Cacti SNMP Proxy;
  Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。
  它通过snmpget来获取数据,使用 RRDtool绘画图形。
  snmpget是linux的命令
 
总结
1.架构需要有Big picture;
2.立足现有系统,兼顾未来系统;
3.架构的原则可以灵活应用在各个层级:
  a.应用架构(class,Object,Interface)
  b.系统架构(子系统,交互,接口)
  c.数据架构(数据处理,结构,整合)
  d.企业架构
4.Focus on Value, 适度架构


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值