Understanding the C# Interface Segregation Principle (ISP) with Examples

In this article, we will learn about the C# Interface Segregation Principle (ISP), which states that a class should not forced to implement Interface methods they don’t use.

It promotes the creation of focused, smaller, and modular interfaces to prevent clients from implementing methods they don’t need. 

We will learn its significance and how it can be applied using C# code examples.

csharp interface segregation principle

What is the C# Interface Segregation Principle?

The Interface Segregation Principle is one of the five SOLID principles of object-oriented design introduced by Robert C. Martin

  1. Single Responsibility Principle (SRP)
  2. Open-closed Principle (OCP)
  3. Liskov substitution Principle (LSP)
  4. Interface Segregation Principle (ISP)
  5. Dependency Inversion Principle (DIP)

The Interface Segregation Principle states that a class should not be forced to implement an interface that contains methods it doesn’t use.

In simpler terms, it suggests that an interface should have only those methods that are relevant to the implementing class. 

This principle prevents the creation of ‘fat’ interfaces that contain methods unnecessary for certain classes, which can lead to code complexity and tight coupling.

Interface Segregation Principle (ISP) with C# Examples

Let’s dive into practical examples to learn the concept of the Interface Segregation Principle more effectively. We’ll start with a simple scenario and then progress to a more complex one.

Scenario 1: Document Processing System

Suppose we’re building a document processing system that deals with various types of documents, such as PDFs and Word documents. We have an IDocument interface as follows:

public interface IDocument
{
    void Open();
    void Edit();
    void Save();
    void Print();
}

Here, the IDocument interface includes methods for opening, editing, saving, and printing documents. Now, let’s implement this interface in classes for different document types:

public class PDFDocument : IDocument
{
    public void Open() { /* PDF open logic */ }
    public void Edit()
    {    
        throw new NotImplementedException("Editing is not applicable for PDF");
    }
    public void Save() { /* PDF save logic */ }
    public void Print() { /* PDF print logic */ }
}

public class WordDocument : IDocument
{
    public void Open() { /* Word open logic */ }
    public void Edit() { /* Word edit logic */ }
    public void Save() { /* Word save logic */ }
    public void Print() { /* Word print logic */ }
}

In this scenario, the WordDocument class adheres to all the methods defined in the IDocument interface. However, the PDFDocument class doesn’t need the Edit method, making it a victim of the Interface Segregation Principle violation.

Code After Applying the Interface Segregation Principle (ISP)

To resolve the Interface Segregation Principle (ISP) violation, we can refactor the interface into smaller, more focused interfaces. Let’s create separate interfaces such as IEditableDocument for editing and IPrintableDocument for printing:

public interface IDocument
{
    void Open();
    void Save();
}
public interface IEditableDocument
{
    void Edit();
}

public interface IPrintableDocument
{
    void Print();
}


public class PDFDocument : IDocument, IPrintableDocument
{
   public void Open()
    {
        Console.WriteLine("Opening PDF document"); /* PDF open logic */
    }


    public void Save()
    {
        Console.WriteLine("Saving PDF document"); /* PDF save logic */ 
    }

    public void Print()
    {
        Console.WriteLine("Printing PDF document"); /* PDF print logic */
    }
}

public class WordDocument : IDocument, IEditableDocument, IPrintableDocument
{
    
   public void Open()
    {
        Console.WriteLine("Opening Word document");  /* Word open logic */ 
    }

    public void Edit()
    {
        Console.WriteLine("Editing Word document"); /* Word edit logic */
    }

    public void Save()
    {
        Console.WriteLine("Saving Word document"); /* Word save logic */
    }

    public void Print()
    {
        Console.WriteLine("Printing Word document"); /* Word print logic */ 
    }
}

Applying the Interface Segregation Principle (ISP) has helped us design interfaces that suit each class’s exact requirements. This makes our code cleaner and easier to manage. Unnecessary methods that could confuse things are now avoided.

As a result, our document system becomes more flexible and simpler to understand and can be enhanced without adding extra complications.

Benefits of using the Segregation Principle (ISP)

The Interface Segregation Principle (ISP) is a software design principle that states that no client or class should be forced to depend on methods it does not use. 

When we declare methods in an interface that the client doesn’t need, it pollutes the interface and leads to a bulky or fat interface. 

By following this principle, we can create interfaces that are more focused and easier to understand, resulting in a codebase that is more resilient to changes and easier to maintain.

Some of the benefits of using ISP are: – 

  • Focused Responsibilities: Each interface has a single responsibility, leading to cleaner and more cohesive code.
  • Clearer Code: Clients (Classes) are not forced to depend on methods they do not use. For example, Each type of document (like PDFs and Word documents) only deals with the methods it actually needs. This keeps things simple and avoids unnecessary confusion.
  • Easy to Understand: Interfaces are more focused and easier to understand. When you look at a document class(like PDFs and Word), you instantly see which actions it can perform. This clarity helps both new programmers and your future self understand and work with the code.
  • Smooth Expansion: Adding a new type of document is easy. You just implement the needed methods. You don’t have to worry about irrelevant methods causing trouble.
  • Flexibility: By following ISP, the new classes can be easily added without being forced to implement methods they have no use for. It promotes code extensibility and scalability.
  • Elimination of Unnecessary Exceptions: The NotImplementedException issue is eliminated, and our code is free from misleading and unnecessary exceptions.

FAQs: C# Interface Segregation Principle (ISP)

Q1: What is the Interface Segregation Principle (ISP) in C#?

The Interface Segregation Principle (ISP) is a software design guideline that suggests creating specific interfaces with only the methods relevant to the implementing classes. It aims to prevent classes from being forced to implement unnecessary methods in a Interface.

The interface Segregation Principle reduces complexity and avoids bloated interfaces that can lead to confusion and coupling between classes.

Q2: What problem does ISP solve?

The Interface Segregation Principle (ISP) solves the problem of ‘fat’ interfaces where a class must implement methods it doesn’t need. This leads to unnecessary dependencies and can make code harder to understand and modify. ISP prevents this by encouraging smaller and focused interfaces.

Q3: Can you provide an example of ISP violation in C#?

Indeed, consider a scenario where a class responsible for document printing is forced to implement methods for document editing. This is an Interface Segregation Principle violation since the class doesn’t require the editing functionality but is still tied to it through the interface.

Q4: Does ISP mean I should create an interface for every method in C#?

No, ISP doesn’t mean creating an interface for every method. It suggests creating interfaces with a clear focus on specific responsibilities. It’s about finding a balance between having too many interfaces and ensuring classes have just the methods they need.

Q5: How do I apply Interface Segregation Principle (ISP) in C#?

To apply the Interface Segregation Principle in C#, follow these steps:
1. Identify Responsibilities: Understand the specific responsibilities of each class.
2. Create Focused Interfaces: Design interfaces with methods that match each class’s responsibilities.
3. Implement Interfaces: Have classes implement only the interfaces they need.

Q6: Does Interface Segregation Principle apply only to C# or other programming languages?

ISP is a principle that applies to object-oriented programming in general, so it’s not limited to C#. It’s relevant to any programming language that uses interfaces or similar abstraction mechanisms to define class contracts.

References: MSDN-SOLID Principles in C#

Articles you might also like:

Shekh Ali
4 1 vote
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments