Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Addison-Wesley
Upper Saddle River, NJ Boston Indianapolis San Francisco New York Toronto Montreal London Munich Paris Madrid Capetown Sydney Tokyo Singapore Mexico City
Contents
Figures xiii Tables xv Foreword xvii Preface xix Acknowledgments xxv About the Authors xxvii 1 Introduction 1 1.1 Qualities of a Well-Designed Framework 1.1.1 Well-Designed Frameworks Are Simple 3
1.1.2 Well-Designed Frameworks Are Expensive to Design 3 1.1.3 Well-Designed Frameworks Are Full of Trade-Offs 4 1.1. A Well-Designed Frameworks Borrow from the Past 5 1.1.5 Well-Designed Frameworks Are Designed to Evolve 5 1.1.6 Well-Designed Frameworks Are Integrated 5 1.1.7 Well-Designed Frameworks Are Consistent 6 2 Framework Design Fundamentals 7 2.1 Progressive Frameworks 9 2.2 Fundamental Principles of Framework Design 12 2.2.1 The Principle of Scenario-Driven Design 13 2.2.2 The Principle of Low Barrier to Entry 19 2.2.3 The Principle of Self-Documenting Object Models 23 2.2 A The Principle of Layered Architecture 29 2.3 S u m m a r y 31
VII
3.7 Naming Parameters 64 3.8 Naming Resources 65 3.9 Summary 66 4 Type Design Guidelines 67 4.1 Types and Namespaces 69
4.1.1 Standard Subnamespace Names 73
Choosing Between Class and Struct 74 Choosing Between Class and Interface 77 Abstract Class Design 83 Static Class Design 85 Interface Design 86
4.7 4.8
Struct Design 89 E n u m Design 91 4.8.1 Designing Flag Enums 97 4.8.2 Adding Values to Enums 100 N e s t e d Types 101
4.9
6.1.4 Virtual Members 168 6.1.5 Abstractions (Abstract Types and Interfaces) 170
6.2 Base Classes 172 6.3 Sealing 174 6.4 Summary 177 7 Exceptions 179
7.1 7.2 Exception Throwing 183 Choosing the Right Type of Exception to Throw 7.2.1 Error Message Design 189 7.2.2 Exception Handling 7.2.3 Wrapping Exceptions 7.3 191 195 197 197 189
7.3.3 InvalidOperationException 198 7 3 A ArgumentException, ArgumentNullException, and .. ArgumentOutOfRangeException 198 7.3.5 NullReferenceException, 7.3.6 StackOverflowException IndexOutOfRangeException, 200 and AccessViolationException 199 7.3.7 OutOfMemoryException 200 7.3.8 ComException, SEHException, and other CLR Exceptions 201 7.3.9 ExecutionEngineException 7.4 7.5 Exceptions and Performance 203 7.5.1 Tester-Doer Pattern 203 7.5.2 Try-Parse Pattern 204 201 Designing Custom Exceptions 202
8.3.3 Choosing Between Arrays and Collections 218 8.3.4 Implementing Custom Collections 219 8.4 8.5 8.6 I C l o n e a b l e 221 IComparable<T> and I E q u a t a b l e < T > IDisposable 223 224 225 222
8.7 Object 224 8.7.1 Object.Equals 8.7.2 Object.GetHashCode 8.7.3 Object. ToString 227 8.8 Uri 228 8.8.1 System. Uri Implementation Guidelines 229 8.9 System.Xml Usage 230 8.10 Equality Operators 231 8.10.1 Equality Operators on Value Types 232 8.10.2 Equality Operators on Reference Types 232 9 Common Design Patterns 235 9.1 Aggregate Components 235 9.1.1 Component-Oriented Design 237 9.1.2 Factored Types 240 9.13 Aggregate Component Guidelines 240 9.2 9.3 The Async Pattern 243 9.2.1 Async Pattern Basic Implementation Example 247 Dispose Pattern 248 9.3.1 Basic Dispose Pattern 251 9.3.2 Finalizable Types 256 9.4 Factories 260 9.5 Optional Feature Pattern 264 9.6 Template Method 267 9.7 Timeouts 269 9.8 And in the End... 271 A C# Coding Style Conventions 273 A.I General Style Conventions 274
A. 1.1 Brace Usage 274 A.I.2 Space Usage 275 A. 1.3 Indent Usage 276
A. 2 Naming Conventions 277 A3 Comments 277 A.4 File Organization 278 B Using FxCop to Enforce the Design Guidelines 281 B.I WhatlsFxCop? 281 B.2 The Evolution of FxCop 282 B.3 How Does It Work? 283 B.4 FxCop Guideline Coverage 284
B.4.1 FxCop Rules for the Naming Guidelines 284 B.4.2 FxCop Rules for the Type Design Guidelines 293 B.4.3 FxCop Rules for Member Design 296 B.4.4 FxCop Rules for Designing for Extensibility 302 B.4.5 FxCop Rules for Exceptions 303 B.4.6 FxCop Rules for Usage Guidelines 305 B.4.7 FxCop Rules for Design Patterns 309