Search icon
Arrow left icon
All Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Newsletters
Free Learning
Arrow right icon
Refactoring with C#

You're reading from  Refactoring with C#

Product type Book
Published in Nov 2023
Publisher Packt
ISBN-13 9781835089989
Pages 434 pages
Edition 1st Edition
Languages
Author (1):
Matt Eland Matt Eland
Profile icon Matt Eland

Table of Contents (24) Chapters

Preface 1. Part 1: Refactoring with C# in Visual Studio
2. Chapter 1: Technical Debt, Code Smells, and Refactoring 3. Chapter 2: Introduction to Refactoring 4. Chapter 3: Refactoring Code Flow and Iteration 5. Chapter 4: Refactoring at the Method Level 6. Chapter 5: Object-Oriented Refactoring 7. Part 2: Refactoring Safely
8. Chapter 6: Unit Testing 9. Chapter 7: Test-Driven Development 10. Chapter 8: Avoiding Code Anti-Patterns with SOLID 11. Chapter 9: Advanced Unit Testing 12. Chapter 10: Defensive Coding Techniques 13. Part 3: Advanced Refactoring with AI and Code Analysis
14. Chapter 11: AI-Assisted Refactoring with GitHub Copilot 15. Chapter 12: Code Analysis in Visual Studio 16. Chapter 13: Creating a Roslyn Analyzer 17. Chapter 14: Refactoring Code with Roslyn Analyzers 18. Part 4: Refactoring in the Enterprise
19. Chapter 15: Communicating Technical Debt 20. Chapter 16: Adopting Code Standards 21. Chapter 17: Agile Refactoring 22. Index 23. Other Books You May Enjoy

Avoiding Code Anti-Patterns with SOLID

The right design principles can keep your code from quickly going stale. While there are many right ways of writing code, there are anti-patterns and code smells that constitute the wrong way of writing code.

Additionally, the community has identified several principles to keep in mind when building software that can help your code resist accumulating technical debt for as long as possible. In this chapter, we’ll cover a number of these principles, including the famous SOLID acronym, and see how they can help you build software that actively resists the gradual decline toward legacy code.

In this chapter, we’ll cover the following topics:

  • Identifying anti-patterns in C# code
  • Writing SOLID code
  • Considering other architectural principles

Identifying anti-patterns in C# code

I’ve often found myself telling new programmers that to build good software, you have to first build a lot of really bad software and learn from it.

While this statement is somewhat in jest, there is some truth to it: almost every developer can recognize code that’s written the wrong way and discover things that make it difficult to work with, and doing so helps you write better code the next time.

When your code is bad, there’s usually a part of you that knows it. You see little things that you don’t love: duplicated pieces of code, inconsistencies in naming or parameter ordering, passing too many parameters around, methods, or even classes that are just too big to manage effectively.

These symptoms are what we commonly refer to as code smells, and we’ll revisit them later in this section.

Beyond code smells are something called anti-patterns, which is code that significantly deviates from community...

Writing SOLID code

SOLID is an acronym introduced by Michael Feathers summarizing the words of Robert C. Martin. The intent of SOLID is to provide developers with a set of principles that will guide them toward more maintainable code that resists becoming technical debt.

The five principles of SOLID code are:

  • Single Responsibility Principle (SRP)
  • Open-Closed Principle (OCP)
  • Liskov Substitution Principle (LSP)
  • Interface Segregation Principle (ISP)
  • Dependency Inversion Principle (DIP)

In this section, we’ll cover all five of these principles.

Single Responsibility Principle

The Single Responsibility Principle (SRP) says that a class should be responsible for one thing and one thing only. Here are a few examples of classes that follow the SRP:

  • A class responsible for saving application data to a specific file format
  • A database access class dedicated to executing queries against a database table or set of tables
  • An API controller...

Considering other architectural principles

Before we close out the chapter, let me share three brief principles that have helped me in my own journey toward good software.

Learning the DRY principle

Don’t Repeat Yourself (DRY) is an important tenant in software development. The DRY principle is oriented around making sure you don’t repeat the same patterns in code throughout your application. Code takes a while to write, read, and maintain, and bugs inevitably do occur at a certain rate per line of code. As a result, you want to strive to solve problems once in a centralized place and then reuse that solution.

Let’s look at some sample code that violates the DRY principle. This code takes in a comma-separated value (CSV) string such as "CSA1234,CMH,ORD" and translates it into a FlightInfo object:

public FlightInfo ReadFlightFromCsv(string csvLine) {
  string[] parts = csvLine.Split(',');
  const string fallback...

Summary

In this chapter, we discussed code smells and anti-patterns. The right design principles can help keep your code focused and minimal and slow the rate at which it naturally accumulates complexity. This helps keep your code in good form and resist accumulating technical debt.

The most common maxim for quality programming is SOLID, following the Single Responsibility Principle (SRP), making code open for extension while being closed to modification, the Liskov Substitution Principle (LSP) advocating for low coupling with polymorphic code, the interface segregation principle focused on several smaller interfaces over one larger interface, and the Dependency Inversion Principle (DIP) which talks about reducing coupling by having classes take in the things they need from outside of the class.

Now that we’ve established how to write SOLID code, we’ll explore some advanced testing techniques that can help test code built using these principles.

Questions

  1. How does the SRP affect cohesion?
  2. Which areas of your code violate the SRP or DRY?
  3. What are the advantages of DI? How does it affect coupling?

Further reading

You can find more information about materials discussed in this chapter at these URLs:

lock icon The rest of the chapter is locked
You have been reading a chapter from
Refactoring with C#
Published in: Nov 2023 Publisher: Packt ISBN-13: 9781835089989
Register for a free Packt account to unlock a world of extra content!
A free Packt account unlocks extra newsletters, articles, discounted offers, and much more. Start advancing your knowledge today.
Unlock this book and the full library FREE for 7 days
Get unlimited access to 7000+ expert-authored eBooks and videos courses covering every tech area you can think of
Renews at €14.99/month. Cancel anytime}