Blog

Home / Blog

Method chaining and Fluent interfaces in C#

Jason Li
Sr. Software Development Engineer
Skilled Angular and .NET developer, team leader for a healthcare insurance company.
September 12, 2020


You can now make your code understandable, simple, and readable by taking advantage of method chaining and fluent interfaces. You might notice that source code sometimes becomes so complex that it is difficult to maintain or understand while working in applications. The concepts of method chaining and fluent interfaces attempt to make your code simple as well as readable. Moreover, there are several; advantages to working with fluent interfaces and method chaining in C#.

A programmer may expose functionality using classes and objects as a C# developer. However, the code required to accomplish a task using these objects and classes tends to be complex most of the time. Sometimes, you might want to device a technique that makes your code more natural and readable in an attempt to reduce this complexity. Fluent Interface and Method Chaining can successfully reduce the complexity of the code.

Method chaining and Fluent interfaces explained

In the technique of Method chaining, the methods are called on a sequence to form a chain. Besides, each of these methods returns an instance of a class. Apart from that, these methods chain together so that they form a single statement. The object-oriented API of the fluent interface depends largely on method chaining. The main goal of a fluent interface is to create a domain-specific language (DSL), make the code readable, and reduce code complexity. The context is maintained using a chain in method chaining.

Fluent interfaces vs. method chaining

Even though there are several similarities between method chaining and fluent interfaces, there are some subtle differences between the two features. Method chaining is often used to change the aspects of a more complex object whereas, fluid interfaces typically act on the same set of data. Moreover, the methods should return an instance of the same type in case of a fluent interface. But the methods may return instances of any class in method chaining. Also, method chaining is sometimes used to implement fluent interfaces, but you should keep in mind that not all uses of method chaining will be fluent interfaces. While fluent interfaces can effectively modify a complex object, method chaining usually works on a simple set of data.

Extension Method vs Fluent Interface

Both the Fluent Interface and the Extension Method are sometimes impossible to debug and often difficult. Besides, the intermediate results in both are unattainable. However, the syntax is similar for both.

Fluent Interface

• The varying of return type for each method assures extensibility as well as flexibility

• Methods can be chained in a predetermined order and the looping can be restrained

• Chaining is used to establish paths and collect data; Statements are executed at the end

Extension Method

• The extension method usually returns an object of the same type.

• Looping is not prevented

• The returned type is constant

• Statements are executed one by one

• The application developers and coders can chain the same method and it is executed on each call

• The result of the execution of each statement is dependent on the previous operation

C#

The use of Fluent Interface Design Pattern in C#

The Fluent Interface Design Pattern is used in C# during the following instances:

• When you want to ensure that the code you write is readable by non-programmers. This will help them to understand whether the code is satisfied with their business logic or not

• During UNIT testing especially when the application developers are not full-fledged programmers

• If you want to stand out in the market as compared to the others.

• When you are a component seller and want to make your interface simpler

Fluent interfaces are used extensively in LINQ Queries. Some of the real-world usages of the fluent interface include pagination, Sorting, Searching, as well as grouping with a blend of LINQ. These are done in combination with the builder design pattern.

C# Method chaining is something that the programmers and users will most likely be consuming already. They might do this even without necessarily appreciating how it works under the hood. However, the context flows from one method to the next is the basic concept of method chaining. This is often represented by the term 'chaining'. This style of programming can make code simpler and easier to read. If are already working with something like LINQ, you will be more familiar with this idea. Method chaining can be useful when you want to apply a sequence of processing steps and when you are acting on a common set of data. But it is not best suited to all scenarios. You can cherry-pick which of the processes need to be applied in your calling code by exposing each process as a method. Understanding Fluent Interface and Method Chaining simplify your class consumption code by making your code more discoverable, simple, and readable.

Method Chaining is a common technique in which each method returns an object. Apart from this, all these methods are often chained together to form a single simple statement. A fluent interface is a self-referencing, specialized form of method chaining that maintains the context through the chain. These two concepts are very much related to each other; one is a concept and the other is an implementation of that concept. Oops is one of the most accepted ways of programming and designing in c#. Oops has two aspects: One aspect is where a consumer creates the object of the class as well as tries to use that class. The other aspect is where the developer goes and creates the class and exposes the properties of this class.

Method chaining and Fluent Interface are used during the instances of Unit testing when the developers are not full-fledged programmers. It is also used when you want your code to be readable by non-programmers so that the users can understand if the code is satisfying their domain logic. These two techniques are also used are creating a DSL language that is mapped with fluent interface statements. Method chaining and Fluent Interface are helpful if you want to stand out in the market as compared to your competitors by making your interfaces simpler, especially if you are a component seller.

Pipelining is a powerful technique since it allows data flow through the system in a declarative manner. Overall, an effective pipelining is present in C#. We can improve upon existing fluent interfaces by leveraging higher-order extension methods. Also, higher-order extension methods provide chaining capabilities throughout C#. The usage of higher-order static methods extends the chaining capabilities even further by converting some of the language's statements into expressions. Unlike F#, this approach does not get us to the capabilities of what "true" functional languages. But it certainly makes the working of the imperative world of C# a bit more bearable.

Why Do Programmers Need Extension Methods?

We often come across sibling classes that perform a simple operation from its parent classes and add a kind of customization for parent's methods while designing your classes in .NET projects. There are some instances when you need to extend int class in .NET by adding a factorial method to it using the recursion technique. One way of doing this is by inheriting int class and add your new method to it and use your new methods in your code. However, extension methods can provide a better solution to this problem.

One can use new methods as a part of int class in .NET by using extension methods. Extension methods help the programmers to add new methods to existing types without having to create derived types. The extension methods are considered as instance methods from the extended type. In software engineering or programming technology, a fluent interface is an implementation of an object-oriented API. It is aimed at providing a more readable code. To relay the instruction context of a subsequent call, a fluent interface is normally implemented by using method chaining. Generally, the context is often:

• Self-referential: The new context is equivalent to the last context

• Finished with the return of a void context

• Described using the return value of a called method

Debugging

As debuggers are sometimes not able to set breakpoints within the chain, single-line chained statements are sometimes more difficult to debug. Moreover, the process of stepping through a single-line statement in a debugger can be less convenient for the debuggers.

Error reporting

Another issue associated with single-line statements is that it may not be clear about which of the method calls caused an exception. In scenarios where multiple calls are present in the same method making, it not obvious which exact call caused a problem. Fluent APIs are used for much more useful tasks.

Conclusion

Fluent interfaces efficiently improve the readability of code. The coders should pay enough attention while creating classes using such interfaces. Especially if the classes are used in a non-fluent manner. The names of methods in a fluent interface can be poor in a non-fluent context and are often not particularly descriptive. It is your responsibility to check or analyze whether or not a fluent interface is suitable for all use cases.