一,可重用代码
1. 惯用模式有两种类型:
a. 技术模式 —— 包括事务、安全性和其他基础结构元素
b. 域模式 —— 包括单个应用程序内或跨多个应用程序的业务问题的解决方案
2. 设计即代码
last responsible moment — 不是将决定推迟到最后时刻,而是最后可靠时刻。等待的时间越长,就越有机会拥有适合的设计。
3. 表达性
4. 抽象的风格
函数式语言: Scala 和Clojure
在大多数函数式语言中,默认方式是创建不可变变量
这意味着以函数式语言编写多线程应用程序要容易得多,因为不可变数据结构与线程交互起来非常自然,因而代码可以很简洁
Collaborative Diffusion: Programming Antiobjects
目前使用的大多数开源框架都是与解决特定问题相关的惯用模式集。
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
使这些代码看起来不像源代码而更像您正在尝试解决的问题
1. 计算机编程语言
4. 有限的表现力: 很少能找到一个 DSL 含有诸如循环和判定的控制结构。相当多的 DSL 是声明式的,而不是指令式的。
Fowler 的书中确定的一个公共 DSL 模式叫作连贯接口(能够为一系列方法调用中转或维护指令上下文的行为)
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, 适度架构