With the award-winning book Agile Software Development: Principles, Patterns, and Practices, Robert C. Martin helped bring Agile principles to tens of thousands of Java and C++ programmers. Now .NET programmers have a definitive guide to agile methods with this completely updated volume from Robert C. Martin and Micah Martin, Agile Principles, Patterns, and Practices in C#.
This book presents a series of case studies illustrating the fundamentals of Agile development and Agile design, and moves quickly from UML models to real C# code. The introductory chapters lay out the basics of the agile movement, while the later chapters show proven techniques in action. The book includes many source code examples that are also available for download from the authors' Web site.
Readers will come away from this book understanding
Agile principles, and the fourteen practices of Extreme Programming
Spiking, splitting, velocity, and planning iterations and releases
Test-driven development, test-first design, and acceptance testing
Refactoring with unit testing
Agile design and design smells
The five types of UML diagrams and how to use them effectively
Object-oriented package design and design patterns
How to put all of it together for a real-world project
Whether you are a C# programmer or a Visual Basic or Java programmer learning C#, a software development manager, or a business analyst, Agile Principles, Patterns, and Practices in C# is the first book you should read to understand agile software and how it applies to programming in the .NET Framework.
Robert C. Martin has been a software professional since 1970 and an international software consultant since 1990. He is founder and president of Object Mentor, Inc., a team of experienced consultants who mentor their clients in the fields of C++, Java, OO, Patterns, UML, Agile Methodologies, and Extreme Programming. Micah Martin works with Object Mentor as a developer, consultant, and mentor on topics ranging from object-oriented principles and patterns to agile software development practices. Micah is the cocreator and lead developer of the open source FitNesse project. He is also a published author and speaks regularly at conferences.
Forewords xixPreface xxiiiAcknowledgments xxxiAbout the Authors xxxiiiSection I: Agile Development 1Chapter 1: Agile Practices 3The Agile Alliance 4 Principles 8 Conclusion 10 Bibliography 11 Chapter 2: Overview of Extreme Programming 13The Practices of Extreme Programming 14 Conclusion 22 Bibliography 22 Chapter 3: Planning 23Initial Exploration 24 Release Planning 25 Iteration Planning 25 Defining "Done" 26 Task Planning 26 Iterating 27 Tracking 28 Conclusion 29 Bibliography 29 Chapter 4: Testing 31Test-Driven Development 32 Acceptance Tests 36 Serendipitous Architecture 37 Conclusion 38 Bibliography 39 Chapter 5: Refactoring 41A Simple Example of Refactoring: Generating Primes 42 Conclusion 53 Bibliography 54 Chapter 6: A Programming Episode 55The Bowling Game 56 Conclusion 98 Overview of the Rules of Bowling 99 Section II: Agile Design 101Chapter 7: What Is Agile Design? 103Design Smells 104 Why Software Rots 107 The Copy Program 108 Conclusion 113 Bibliography 114 Chapter 8: The Single-Responsibility Principle (SRP) 115Defining a Responsibility 117 Separating Coupled Responsibilities 119 Persistence 119 Conclusion 119 Bibliography 120 Chapter 9: The Open/Closed Principle (OCP) 121Description of OCP 122 The Shape Application 124 Conclusion 132 Bibliography 133 Chapter 10: The Liskov Substitution Principle (LSP) 135Violations of LSP 136 Factoring Instead of Deriving 148 Heuristics and Conventions 150 Conclusion 151 Bibliography 151 Chapter 11: The Dependency-Inversion Principle (DIP) 153Layering 154 A Simple DIP Example 157 The Furnace Example 160 Conclusion 161 Bibliography 162 Chapter 12: The Interface Segregation Principle (ISP) 163Interface Pollution 163 Separate Clients Mean Separate Interfaces 165 Class Interfaces versus Object Interfaces 166 The ATM User Interface Example 169 Conclusion 174 Bibliography 175 Chapter 13: Overview of UML for C# Programmers 177Class Diagrams 180 Object Diagrams 182 Collaboration Diagrams 183 State Diagrams 184 Conclusion 185 Bibliography 185 Chapter 14: Working with Diagrams 187Why Model? 187 Making Effective Use of UML 189 Iterative Refinement 194 When and How to Draw Diagrams 200 Conclusion 202 Chapter 15: State Diagrams 203The Basics 204 Using FSM Diagrams 208 Conclusion 209 Chapter 16: Object Diagrams 211A Snapshot in Time 212 Active Objects 213 Conclusion 217 Chapter 17: Use Cases 219Writing Use Cases 220 Diagramming Use Cases 222 Conclusion 223 Bibliography 223 Chapter 18: Sequence Diagrams 225The Basics 226 Advanced Concepts 232 Conclusion 241 Chapter 19: Class Diagrams 243The Basics 244 An Example Class Diagram 247 The Details 249 Conclusion 258 Bibliography 258 Chapter 20: Heuristics and Coffee 259The Mark IV Special Coffee Maker 260 OOverkill 279 Bibliography 292 Section III: The Payroll Case Study 293Rudimentary Specification of the Payroll System 294 Exercise 295 Chapter 21: Command and Active Object: Versatility and Multitasking 299Simple Commands 300 Transactions 302 Undo Method 304 Active Object 305 Conclusion 310 Bibliography 310 Chapter 22: Template Method and Strategy: Inheritance versus Delegation 311Template Method 312 Strategy 319 Conclusion 324 Bibliography 324 Chapter 23: Facade and Mediator 325Facade 325 Mediator 327 Conclusion 329 Bibliography 329 Chapter 24: Singleton and Monostate 331Singleton 332 Monostate 336 Conclusion 343 Bibliography 343 Chapter 25: Null Object 345Description 345 Conclusion 348 Bibliography 348 Chapter 26: The Payroll Case Study: Iteration 1 349Rudimentary Specification 350 Analysis by Use Cases 351 Reflection: Finding the Underlying Abstractions 360 Conclusion 363 Bibliography 363 Chapter 27: The Payroll Case Study: Implementation 365Transactions 366 Main Program 408 The Database 409 Conclusion 411 About This Chapter 411 Bibliography 412 Section IV: Packaging the Payroll System 413Chapter 28: Principles of Package and Component Design 415Packages and Components 416 Principles of Component Cohesion: Granularity 417 Principles of Component Coupling: Stability 420 Conclusion 435 Chapter 29: Factory 437A Dependency Problem 440 Static versus Dynamic Typing 441 Substitutable Factories 442 Using Factories for Test Fixtures 443 Importance of Factories 444 Conclusion 445 Bibliography 445 Chapter 30: The Payroll Case Study: Package Analysis 447Component Structure and Notation 448 Applying the Common Closure Principle (CCP) 450 Applying the Reuse/Release Equivalence Principle (REP) 452 Coupling and Encapsulation 454 Metrics 455 Applying the Metrics to the Payroll Application 457 The Final Packaging Structure 463 Conclusion 465 Bibliography 465 Chapter 31: Composite 467Composite Commands 469 Multiplicity or No Multiplicity 470 Conclusion 470 Chapter 32: Observer: Evolving into a Pattern 471The Digital Clock 472 The Observer Pattern 491 Conclusion 493 Bibliography 494 Chapter 33: Abstract Server, Adapter, and Bridge 495Abstract Server 496 Adapter 498 Bridge 503 Conclusion 505 Bibliography 506 Chapter 34: Proxy and Gateway: Managing Third-Party APIs 507Proxy 508 Databases, Middleware, and Other Third-Party Interfaces 526 Table Data Gateway 528 Using Other Patterns with Databases 539 Conclusion 541 Bibliography 541 Chapter 35: Visitor 543VISITOR 544 Acyclic Visitor 548 Decorator 560 Extension Object 565 Conclusion 576 Bibliography 577 Chapter 36: State 579Nested Switch/Case Statements 580 Transition Tables 584 The State Pattern 586 Classes of State Machine Application 598 Conclusion 602 Bibliography 602 Chapter 37: The Payroll Case Study: The Database 603Building the Database 604 A Flaw in the Code Design 605 Adding an Employee 607 Transactions 618 Loading an Employee 623 What Remains? 636 Chapter 38: The Payroll User Interface: Model View Presenter 637The Interface 639 Implementation 640 Building a Window 650 The Payroll Window 657 The Unveiling 669 Conclusion 670 Bibliography 670 Appendix A: A Satire of Two Companies 671Rufus Inc.: Project Kickoff 671 Rupert Industries: Project Alpha 671 Appendix B: What Is Software? 687Index 699