Clean Code(评注版)

Clean Code(评注版)
作 者: Robert Martin
出版社: 电子工业出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: 软件工程/开发项目管理
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  作者简介Robert C. Martin软件工程领域的大师级人物,设计模式和敏捷开发运动的主要倡导者之一,曾经担任C++ Report杂志主编多年。他的Agile Software Development:Principles, Patterns, and Practices一书曾荣获Jolt大奖。评注者简介韩磊技术管理者和作译者,互联网专家。2001年创办CoDelphi.com中文开发在线网站;2003年加入CSDN,历任网络总监、副总经理、CSDN网站和《程序员》杂志总编辑等职;2010年加入21世纪传媒,现任21世纪新媒体副总经理、CTO。拥有美国Borland公司“Delphi产品专家”及“微软最有价值专家”称号。译有《C#编程风格》(Elements of C# Style)、《梦断代码》(Dreaming in Code)、《代码整洁之道》(Clean Code),合著有《网络媒体教程》,合译有《Beginning C#Objects:对象到代码》。

内容简介

软件质量,不但依赖架构及项目管理,而且与代码质量紧密相关。这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认。《传世经典书丛:Clean Code(评注版)》提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好的基础。《传世经典书丛:Clean Code(评注版)》作者给出了一系列行之有效的整洁代码操作实践。这些实践在本书中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两方面的范例。只要遵循这些规则,就能写出干净的代码,从而有效提升代码的质量本书适合致力于改善代码质量的程序员及技术经理阅读。本书介绍的规则均来自作者多年的实践经验,涵盖从命名到重构的多个方面,虽为一“家”之言,然诚有借鉴意义。本书是CleanCode一书的评注版,力邀国内资深专家执笔,在英文原著的基础上增加了中文点评和注释,旨在融合二者之长,既保留经典的原创文字与味道,又以先行者的学研心得与实践感悟,对读者的阅读和学习加以点拨,指明捷径。

图书目录

录Chapter

1:

CleanCode(新增评注47条)

1There

Will

BeCode

2BadCode

3The

Total

Cost

ofOwning

a

Mess

5The

Grand

Redesign

inthe

Sky

6Attitude

6The

PrimalConundrum

7The

Art

of

CleanCode?

8What

Is

CleanCode?

9Schools

ofThought

15We

AreAuthors

17The

Boy

ScoutRule

18Prequel

andPrinciples

18Conclusion

18Bibliography

19Chapter

2:

MeaningfulNames(新增评注19条)

21Introduction

21Use

Intention-RevealingNames

22AvoidDisinformation

24Make

MeaningfulDistinctions

25Use

PronounceableNames

26Use

SearchableNames

27AvoidEncodings

28HungarianNotation

28MemberPrefixes

29Interfaces

andImplementations

29Avoid

MentalMapping

30ClassNames

30MethodNames

30Don’t

Be

Cute31Pick

One

Word

perConcept

32Don’tPun

32Use

Solution

DomainNames

33Use

Problem

DomainNames

33Add

MeaningfulContext

33Don’t

Add

GratuitousContext

35FinalWords

36Chapter

3:Functions(新增评注25条)

39Small!

42Blocks

andIndenting

43Do

One

Thing44Sections

withinFunctions

45One

Level

ofAbstraction

per

Function

45Reading

Code

from

Topto

Bottom:The

StepdownRule

46SwitchStatements

46Use

DescriptiveNames

48FunctionArguments

49Common

MonadicForms

50FlagArguments

50DyadicFunctions

51Triads

52ArgumentObjects

52ArgumentLists

52Verbs

andKeywords

53Have

No

SideEffects

53OutputArguments

54Command

QuerySeparation

55Prefer

Exceptions

toReturning

Error

Codes

56Extract

Try/CatchBlocks

57Error

Handling

Is

OneThing

57The

Error.javaDependency

Magnet

57Don’t

RepeatYourself

58StructuredProgramming

59How

Do

You

WriteFunctions

Like

This?

59Conclusion

60SetupTeardownIncluder

60Bibliography

62Chapter

4:Comments(新增评注18条)

65Comments

Do

Not

Make

Upfor

Bad

Code

67Explain

Yourself

inCode

68GoodComments

68LegalComments

68InformativeComments

69Explanation

ofIntent

69Clarification

70Warning

ofConsequences

71TODOComments

71Amplification72Javadocs

in

Public

APIs72BadComments

72Mumbling

73RedundantComments

73MisleadingComments

76MandatedComments

76JournalComments

77NoiseComments

78ScaryNoise

80Don’t

Use

a

CommentWhen

You

Can

Use

a

Function

oraVariable

80PositionMarkers

80Closing

BraceComments

81Attributions

andBylines

82Commented-OutCode

82HTMLComments

83NonlocalInformation

83Too

MuchInformation

84InobviousConnection

84FunctionHeaders

84Javadocs

in

NonpublicCode

85Example

85Bibliography

88Chapter

5:Formatting(新增评注13条)

89The

Purpose

ofFormatting

90Vertical

Formatting90The

NewspaperMetaphor

91Vertical

OpennessBetween

Concepts

92VerticalDensity

93VerticalDistance

94VerticalOrdering

99HorizontalFormatting

99Horizontal

Openness

andDensity

100HorizontalAlignment

101Indentation

103DummyScopes

104TeamRules

105Uncle

Bob’s

FormattingRules

106Chapter

6:

Objects

andData

Structures(新增评注12条)

109DataAbstraction

110Data/ObjectAnti-Symmetry

111The

Law

ofDemeter

114TrainWrecks

115Hybrids

116HidingStructure

116Data

TransferObjects

117Active

Record118Conclusion

118Bibliography

119Chapter

7:

ErrorHandling(新增评注7条)

121Use

Exceptions

RatherThan

Return

Codes

122Write

YourTry-Catch-Finally

StatementFirst

123Use

UncheckedExceptions

125Provide

Context

withExceptions

126Define

ExceptionClasses

in

Terms

of

a

Caller’sNeeds

126Define

the

NormalFlow

128Don’t

ReturnNull

129Don’t

PassNull

130Conclusion

131Bibliography

131Chapter

8:Boundaries(新增评注6条)

133Using

Third-Party

Code134Exploring

and

LearningBoundaries

136Learninglog4j

137Learning

Tests

AreBetter

Than

Free

138Using

Code

That

DoesNot

Yet

Exist

139CleanBoundaries

140Bibliography

141Chapter

9:

UnitTests(新增评注13条)

143The

Three

Laws

of

TDD144Keeping

TestsClean

145Tests

Enable

the-ilities

146CleanTests

147Domain-Specific

TestingLanguage

150A

DualStandard

150One

Assert

per

Test153Single

Concept

perTest

154F.I.R.S.T.

155Conclusion

156Bibliography

156Chapter

10:Classes(新增评注12条)

157ClassOrganization

158Encapsulation158Classes

Should

BeSmall!

158The

SingleResponsibility

Principle

161Cohesion

162Maintaining

CohesionResults

in

Many

Small

Classes

163Organizing

forChange

169Isolating

fromChange

172Bibliography

174Chapter

11:Systems(新增评注10条)

175How

Would

You

Build

aCity?

176Separate

Constructing

aSystem

from

Using

It

176Separation

of

Main178Factories178DependencyInjection

179ScalingUp

180Cross-CuttingConcerns

183JavaProxies

184Pure

Java

AOPFrameworks

186AspectJAspects

189Test

Drive

the

SystemArchitecture

190Optimize

DecisionMaking

191Use

Standards

Wisely,When

They

Add

DemonstrableValue

191Systems

NeedDomain-Specific

Languages

191Conclusion

192Bibliography

192Chapter

12:Emergence(新增评注5条)

195Getting

Clean

viaEmergent

Design

195Simple

Design

Rule

1:Runs

All

the

Tests

196Simple

Design

Rules2–4:

Refactoring

196NoDuplication

197Expressive

199Minimal

Classes

andMethods

200Conclusion

201Bibliography

201Chapter

13:Concurrency(新增评注15条)

203Why

Concurrency?204Myths

andMisconceptions

205Challenges

206Concurrency

DefensePrinciples

207Single

ResponsibilityPrinciple

207Corollary:

Limit

theScope

of

Data

207Corollary:

Use

Copiesof

Data

208Corollary:

ThreadsShould

Be

as

Independent

as

Possible

208Know

YourLibrary

209Thread-Safe

Collections209Know

Your

ExecutionModels

210Producer-Consumer

210Readers-Writers

211DiningPhilosophers

211Beware

DependenciesBetween

SynchronizedMethods

212Keep

SynchronizedSections

Small

212Writing

CorrectShut-Down

Code

Is

Hard

212Testing

ThreadedCode

213Treat

Spurious

Failuresas

Candidate

Threading

Issues

214Get

Your

NonthreadedCode

Working

First

214Make

Your

Threaded

CodePluggable

214Make

Your

Threaded

CodeTunable

215Run

with

More

ThreadsThan

Processors

215Run

on

DifferentPlatforms

215Instrument

Your

Code

toTry

and

Force

Failures

215Hand-Coded

216Automated

217Conclusion

218Bibliography

219Chapter

14:

SuccessiveRefinement(新增评注18条)

221ArgsImplementation

223How

Did

I

DoThis?

228Args:

The

RoughDraft

229So

IStopped

240On

Incrementalism241StringArguments

243Conclusion

280关于第15章、第16章和第17章

281Chapter

15:

JUnitInternals

283The

JUnitFramework

284Conclusion

297Chapter

16:

RefactoringSerialDate

299First,

Make

ItWork

300Then

Make

ItRight

302Conclusion

316Bibliography

316Chapter

17:

Smells

andHeuristics

317Comments

318C1:

InappropriateInformation

318C2:

ObsoleteComment

318C3:

RedundantComment

318C4:

Poorly

WrittenComment

319C5:

Commented-OutCode

319Environment

319E1:

Build

Requires

MoreThan

One

Step

319E2:

Tests

Require

MoreThan

One

Step

319Functions

320F1:

Too

ManyArguments

320F2:

OutputArguments

320F3:

FlagArguments

320F4:

DeadFunction

320General

320G1:

Multiple

Languagesin

One

Source

File

320G2:

Obvious

Behavior

IsUnimplemented

320G3:

Incorrect

Behaviorat

the

Boundaries

321G4:

Overridden

Safeties321G5:Duplication

321G6:

Code

at

Wrong

Levelof

Abstraction

322G7:

Base

ClassesDepending

on

TheirDerivatives

323G8:

Too

MuchInformation

324G9:

DeadCode

324G10:

VerticalSeparation

324G11:

Inconsistency324G12:Clutter

325G13:

ArtificialCoupling

325G14:

Feature

Envy325G15:

SelectorArguments

326G16:

ObscuredIntent

327G17:

MisplacedResponsibility

328G18:

InappropriateStatic

328G19:

Use

ExplanatoryVariables

329G20:

Function

NamesShould

Say

What

TheyDo

329G21:

Understand

theAlgorithm

330G22:

Make

LogicalDependencies

Physical

330G23:

PreferPolymorphism

to

If/Else

or

Switch/Case

331G24:

Follow

StandardConventions

332G25:

Replace

MagicNumbers

with

Named

Constants

332G26:

BePrecise

333G27:

Structure

overConvention

333G28:

EncapsulateConditionals

334G29:

Avoid

NegativeConditionals

334G30:

Functions

ShouldDo

One

Thing

334G31:

Hidden

TemporalCouplings

335G32:

Don’t

BeArbitrary

336G33:

EncapsulateBoundaryConditions

336G34:

Functions

ShouldDescend

Only

One

Level

of

Abstraction

337G35:

Keep

ConfigurableData

at

High

Levels

338G36:

Avoid

TransitiveNavigation

339Java

339J1:

Avoid

Long

ImportLists

by

Using

Wildcards

339J2:

Don’t

InheritConstants

340J3:

Constants

versusEnums

341Names

342N1:

Choose

DescriptiveNames

342N2:

Choose

Names

at

theAppropriate

Level

of

Abstraction

343N3:

Use

StandardNomenclature

Where

Possible

344N4:

UnambiguousNames

344N5:

Use

Long

Names

forLong

Scopes

345N6:

AvoidEncodings

345N7:

Names

ShouldDescribe

Side-Effects

345Tests

346T1:

InsufficientTests

346T2:

Use

a

CoverageTool

346T3:

Don’t

Skip

TrivialTests

346T4:

An

Ignored

Test

Isa

Question

about

anAmbiguity

346T5:

Test

BoundaryConditions

346T6:

Exhaustively

TestNear

Bugs

346T7:

Patterns

of

FailureAre

Revealing

347T8:

Test

CoveragePatterns

Can

BeRevealing

347T9:

Tests

Should

BeFast

347Conclusion

347Bibliography

347Appendix

A:

ConcurrencyII

349Client/ServerExample

349TheServer

349AddingThreading

351ServerObservations

351Conclusion

353Possible

Paths

ofExecution

353Number

ofPaths

354DiggingDeeper

355Conclusion

358Knowing

YourLibrary

359ExecutorFramework

359NonblockingSolutions

359Nonthread-SafeClasses

361Dependencies

BetweenMethods

Can

Break

ConcurrentCode

362Tolerate

the

Failure363Client-BasedLocking

363Server-Based

Locking

365IncreasingThroughput

366Single-ThreadCalculation

of

Throughput

367Multithread

Calculationof

Throughput

367Deadlock

368MutualExclusion

369Lock

&Wait

369NoPreemption

369CircularWait

370Breaking

MutualExclusion

370Breaking

Lock

&Wait

370BreakingPreemption

371Breaking

CircularWait

371Testing

MultithreadedCode

372Tool

Support

forTesting

Thread-BasedCode

374Conclusion

375Tutorial:

Full

CodeExamples

375Client/ServerNonthreaded

375Client/Server

UsingThreads

379Appendix

B:org.jfree.date.SerialDate

381Appendix

C:

CrossReferences

of

Heuristics

441Epilogue