logo资料库

A Philosophy of Software Design - John Ousterhout.pdf

第1页 / 共207页
第2页 / 共207页
第3页 / 共207页
第4页 / 共207页
第5页 / 共207页
第6页 / 共207页
第7页 / 共207页
第8页 / 共207页
资料共207页,剩余部分请下载后查看
Title Page
Copyright
Contents
Preface
1 Introduction
1.1 How to use this book
2 The Nature of Complexity
2.1 Complexity defined
2.2 Symptoms of complexity
2.3 Causes of complexity
2.4 Complexity is incremental
2.5 Conclusion
3 Working Code Isn’t Enough
3.1 Tactical programming
3.2 Strategic programming
3.3 How much to invest?
3.4 Startups and investment
3.5 Conclusion
4 Modules Should Be Deep
4.1 Modular design
4.2 What’s in an interface?
4.3 Abstractions
4.4 Deep modules
4.5 Shallow modules
4.6 Classitis
4.7 Examples: Java and Unix I/O
4.8 Conclusion
5 Information Hiding (and Leakage)
5.1 Information hiding
5.2 Information leakage
5.3 Temporal decomposition
5.4 Example: HTTP server
5.5 Example: too many classes
5.6 Example: HTTP parameter handling
5.7 Example: defaults in HTTP responses
5.8 Information hiding within a class
5.9 Taking it too far
5.10 Conclusion
6 General-Purpose Modules are Deeper
6.1 Make classes somewhat general-purpose
6.2 Example: storing text for an editor
6.3 A more general-purpose API
6.4 Generality leads to better information hiding
6.5 Questions to ask yourself
6.6 Conclusion
7 Different Layer, Different Abstraction
7.1 Pass-through methods
7.2 When is interface duplication OK?
7.3 Decorators
7.4 Interface versus implementation
7.5 Pass-through variables
7.6 Conclusion
8 Pull Complexity Downwards
8.1 Example: editor text class
8.2 Example: configuration parameters
8.3 Taking it too far
8.4 Conclusion
9 Better Together Or Better Apart?
9.1 Bring together if information is shared
9.2 Bring together if it will simplify the interface
9.3 Bring together to eliminate duplication
9.4 Separate general-purpose and special-purpose code
9.5 Example: insertion cursor and selection
9.6 Example: separate class for logging
9.7 Example: editor undo mechanism
9.8 Splitting and joining methods
9.9 Conclusion
10 Define Errors Out Of Existence
10.1 Why exceptions add complexity
10.2 Too many exceptions
10.3 Define errors out of existence
10.4 Example: file deletion in Windows
10.5 Example: Java substring method
10.6 Mask exceptions
10.7 Exception aggregation
10.8 Just crash?
10.9 Design special cases out of existence
10.10 Taking it too far
10.11 Conclusion
11 Design it Twice
12 Why Write Comments? The Four Excuses
12.1 Good code is self-documenting
12.2 I don’t have time to write comments
12.3 Comments get out of date and become misleading
12.4 All the comments I have seen are worthless
12.5 Benefits of well-written comments
13 Comments Should Describe Things that Aren’t Obvious from the Code
13.1 Pick conventions
13.2 Don’t repeat the code
13.3 Lower-level comments add precision
13.4 Higher-level comments enhance intuition
13.5 Interface documentation
13.6 Implementation comments: what and why, not how
13.7 Cross-module design decisions
13.8 Conclusion
13.9 Answers to questions on page 113
14 Choosing Names
14.1 Example: bad names cause bugs
14.2 Create an image
14.3 Names should be precise
14.4 Use names consistently
14.5 A different opinion: Go style guide
14.6 Conclusion
15 Write The Comments First
15.1 Delayed comments are bad comments
15.2 Write the comments first
15.3 Comments are a design tool
15.4 Early comments are fun comments
15.5 Are early comments expensive?
15.6 Conclusion
16 Modifying Existing Code
16.1 Stay strategic
16.2 Maintaining comments: keep the comments near the code
16.3 Comments belong in the code, not the commit log
16.4 Maintaining comments: avoid duplication
16.5 Maintaining comments: check the diffs
16.6 Higher-level comments are easier to maintain
17 Consistency
17.1 Examples of consistency
17.2 Ensuring consistency
17.3 Taking it too far
17.4 Conclusion
18 Code Should be Obvious
18.1 Things that make code more obvious
18.2 Things that make code less obvious
18.3 Conclusion
19 Software Trends
19.1 Object-oriented programming and inheritance
19.2 Agile development
19.3 Unit tests
19.4 Test-driven development
19.5 Design patterns
19.6 Getters and setters
19.7 Conclusion
20 Designing for Performance
20.1 How to think about performance
20.2 Measure before modifying
20.3 Design around the critical path
20.4 An example: RAMCloud Buffers
20.5 Conclusion
21 Conclusion
Index
Summary of Design Principles
Summary of Red Flags
About the Author
A Philosophy of Software Design John Ousterhout Stanford University
A Philosophy of Software Design by John Ousterhout Copyright © 2018 John K. Ousterhout. All rights reserved. No part of this book may be reproduced, in any form or by any means, without permission in writing from the author. Published by Yaknyam Press, Palo Alto, CA. Cover design by Pete Nguyen and Shirin Oreizy (www.hellonextstep.com). Printing History: April 2018: First Edition (v1.0) November 2018: First Edition (v1.01) ISBN 978-1-7321022-0-0 Digital book(s) (epub and mobi) produced by Booknook.biz.
Contents Preface 1 Introduction 1.1 How to use this book 2 The Nature of Complexity 2.1 Complexity defined 2.2 Symptoms of complexity 2.3 Causes of complexity 2.4 Complexity is incremental 2.5 Conclusion 3 Working Code Isn’t Enough 3.1 Tactical programming 3.2 Strategic programming 3.3 How much to invest? 3.4 Startups and investment 3.5 Conclusion 4 Modules Should Be Deep 4.1 Modular design 4.2 What’s in an interface? 4.3 Abstractions 4.4 Deep modules 4.5 Shallow modules 4.6 Classitis 4.7 Examples: Java and Unix I/O
4.8 Conclusion 5 Information Hiding (and Leakage) 5.1 Information hiding 5.2 Information leakage 5.3 Temporal decomposition 5.4 Example: HTTP server 5.5 Example: too many classes 5.6 Example: HTTP parameter handling 5.7 Example: defaults in HTTP responses 5.8 Information hiding within a class 5.9 Taking it too far 5.10 Conclusion 6 General-Purpose Modules are Deeper 6.1 Make classes somewhat general-purpose 6.2 Example: storing text for an editor 6.3 A more general-purpose API 6.4 Generality leads to better information hiding 6.5 Questions to ask yourself 6.6 Conclusion 7 Different Layer, Different Abstraction 7.1 Pass-through methods 7.2 When is interface duplication OK? 7.3 Decorators 7.4 Interface versus implementation 7.5 Pass-through variables 7.6 Conclusion 8 Pull Complexity Downwards 8.1 Example: editor text class 8.2 Example: configuration parameters
8.3 Taking it too far 8.4 Conclusion 9 Better Together Or Better Apart? 9.1 Bring together if information is shared 9.2 Bring together if it will simplify the interface 9.3 Bring together to eliminate duplication 9.4 Separate general-purpose and special-purpose code 9.5 Example: insertion cursor and selection 9.6 Example: separate class for logging 9.7 Example: editor undo mechanism 9.8 Splitting and joining methods 9.9 Conclusion 10 Define Errors Out Of Existence 10.1 Why exceptions add complexity 10.2 Too many exceptions 10.3 Define errors out of existence 10.4 Example: file deletion in Windows 10.5 Example: Java substring method 10.6 Mask exceptions 10.7 Exception aggregation 10.8 Just crash? 10.9 Design special cases out of existence 10.10 Taking it too far 10.11 Conclusion 11 Design it Twice 12 Why Write Comments? The Four Excuses 12.1 Good code is self-documenting 12.2 I don’t have time to write comments 12.3 Comments get out of date and become misleading 12.4 All the comments I have seen are worthless
12.5 Benefits of well-written comments 13 Comments Should Describe Things that Aren’t Obvious from the Code 13.1 Pick conventions 13.2 Don’t repeat the code 13.3 Lower-level comments add precision 13.4 Higher-level comments enhance intuition 13.5 Interface documentation 13.6 Implementation comments: what and why, not how 13.7 Cross-module design decisions 13.8 Conclusion 13.9 Answers to questions from Section 13.5 14 Choosing Names 14.1 Example: bad names cause bugs 14.2 Create an image 14.3 Names should be precise 14.4 Use names consistently 14.5 A different opinion: Go style guide 14.6 Conclusion 15 Write The Comments First 15.1 Delayed comments are bad comments 15.2 Write the comments first 15.3 Comments are a design tool 15.4 Early comments are fun comments 15.5 Are early comments expensive? 15.6 Conclusion 16 Modifying Existing Code 16.1 Stay strategic 16.2 Maintaining comments: keep the comments near the code 16.3 Comments belong in the code, not the commit log
16.4 Maintaining comments: avoid duplication 16.5 Maintaining comments: check the diffs 16.6 Higher-level comments are easier to maintain 17 Consistency 17.1 Examples of consistency 17.2 Ensuring consistency 17.3 Taking it too far 17.4 Conclusion 18 Code Should be Obvious 18.1 Things that make code more obvious 18.2 Things that make code less obvious 18.3 Conclusion 19 Software Trends 19.1 Object-oriented programming and inheritance 19.2 Agile development 19.3 Unit tests 19.4 Test-driven development 19.5 Design patterns 19.6 Getters and setters 19.7 Conclusion 20 Designing for Performance 20.1 How to think about performance 20.2 Measure before modifying 20.3 Design around the critical path 20.4 An example: RAMCloud Buffers 20.5 Conclusion 21 Conclusion Index
分享到:
收藏