第十二、十三章:迭进和并发编程

一、迭进

Kent Beck关于简单设计的四条原则:

  • 运行所有测试
  • 不可重复
  • 表达程序猿的意图
  • 尽可能减少类和方法的数量
  • 以上顾着按其重要程度排序

1.1 简单设计规则1:运行所有测试

设计的首要目的是设计出如预期一般工作的系统。
  全面测试并持续通过所有测试的系统,就是可测试系统。看似浅显,但却重要。不可测试的系统不可验证。不可验证的系统不可部署。紧耦合的代码难以编写测试。同样,测试编写越多,就越会遵循DIP之类的规则。

1.2 简单设计规则2~4:重构

有了测试,就能保持代码和类的整洁,方法就是递增式地重构代码。完成修改,运行测试,保证没有破坏任何东西。所以,<b>测试消除了清除代码就会破坏代码的恐惧</b>。
  重构的过程中,可以应用有关优秀软件设计的一切知识。提升内聚性,降低耦合度,切分关注切面,模块化系统关注面,缩小函数和类的尺寸,选用更好的名称。即消除重复,保证表现力,尽可能较少类和方法数量。

1.3不可重复

重复是拥有良好设计系统的大敌。Repeat Code代表extra work,意味着extra risk。大量重复可以用模板方法来消除。

1.4表现力

这需要尝试,让后来者易于阅读代码。

1.5尽可能减少类和方法

这是为了防止教条主义,片面追求设计原则,从而导致过度切分。例如给每一个类编写接口,所有行为都切分为数据类和行为类。但是这是优先级最低的一条。

二、并发编程

对象是过程的抽象,线程是调度的抽象。——James O Coplien

并发是一种解耦策略。它帮助我们把做什么(目的)和何时(时机)做分解开。这种解耦能有效改进应用程序的吞吐量和结构。
并发编程很难,往往不细心,你会搞出不知道什么鬼的恶心东西出来。看看下面的迷思和误解:

  • 并发总能改变性能
    并发有时候能改变性能,但一般在多个线程或处理器之间能风向大量等待时间的时候管用。
  • 编写并发程序无须修改设计
    这是完全bullshit。目的和时机的解耦代表着往往对系统结构产生巨大的影响。
  • 在采用Web或EJB容器的时候,理解并发问题其实不重要。
      实际上你最好理解并发在干什么。
      总结一下:并发有额外的开销;正确的并发是复杂的;并发缺陷并不总能重现,所以被当做是“基因突变”;并发往往需要对设计策略的根本性的修改。

2.1并发防御原则

2.1.1单一权责原则

SRP:方法、类、组件应当只有一个修改理由。

  • 并发相关代码有自己的开发、修改和调优生命周期
  • 并发相关代码有自己要对付的挑战,和并发相关代码不同
  • 并发编程错误不可控,可能会导致game over、
      建议:分离相关代码和其他代码。

2.1.2推论:限制数据作用域

如我们所见,连个线程修改共享对象的统一字段时。采用临界区域形式保护(synchronize)。限制临界区数目,临界区数目越多:

  • 忘记保护一个或多个临界区——破坏了共享数据的代码。
  • 花力气保护一切都受到保护。(遵循DRY原则:Don't repeat yourself)
  • 很难找到错误源。

2.1.3推论:使用数据副本和线程尽可能独立

避免共享数据的方法就是一开始就避免共享数据。
  让每个线程在自己的世界里存在,不与其他线程论短长。

2.2执行模型

基础定义:互斥、线程饥饿、死锁、活锁。
  执行模型:

  • 生产者-消费者:生产者和消费者之间的队列是一种限定资源。
  • 读者-作者模型:当存在一个主要围读者线程提供资源的共享资源,其偶尔才被作者进行写。协调吞吐量很重要。
  • 宴席哲学家:获得所有资源,执行,否则等待。

2.3警惕同步方法的依赖和保持同步区域微小

同步方法之间的依赖会导致并发代码中的狡猾缺陷。Java有synchronize关键字,保护单个方法,然而,如果再同一共享类中有多个同步方法,系统就可能写得不太正确了。
<b>建议:避免使用一个共享对象的多个方法。</b>
  三种对写代码保护方法:

  • 基于客户端锁定
  • 基于服务端锁定
  • 适配服务器
      尽量减少同步区。

2.4很难编写正确的关闭代码和测试线程代码

关闭的建议:尽早考虑关闭问题,尽早令其工作。
  尽管测试无法证明代码的正确性,但测试可以降低风险。
  测试的建议:编写有潜力暴露问题的测试,在不同的环境下频繁运行。

  • 将伪失败看做是线程的问题:不要讲系统错误归咎于“基因突变”。
  • 先使非先线程代码可工作:不要同时最终非线程缺陷和线程缺陷。
  • 编写可插拔的线程代码:在不同配置环境下运行。
  • 编写可调整的线程代码。
  • 运行多余处理器数量的线程。
  • 在不同平台运行。
  • 调整代码并强迫错误发生。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,401评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 泰国化妆品主要是以纯天然无添加为生产理念,向大众推崇一种健康护肤的态度。而中国现在已经成为泰国化妆品第二大出口国,...
    身在泰国阅读 227评论 0 0
  • 小归 昨天,原本以为是要看《变形金刚5》,到了电影院才知道老公买的是《逆时营救》,因为有霍建华、杨幂,所以感觉这部...
    小归ing阅读 214评论 0 2
  • 昨天得知自己被调整到了一个新学校,今天第一天参加岗前培训,感觉自己又回到了06年第一天上班的情景。而今少...
    彭晓芬阅读 174评论 0 1