Linq Series 6- Tìm hiểu về Fluent Interface và Method Chaining
- Linq Series 8- Deferred Execution trong Linq querry
- Linq Series 7- Sử dụng IEnumerable và Method Chaining trong Linq
- Linq Series 5- Phương thức mở rộng trong C# và ứng dụng trong Linq
- Linq Series 4- Một ví dụ cụ thể về ứng dụng lambda expression trong Linq
- Linq Series 3- Toán tử truy vấn chuẩn trong Linq
Table of Contents
Tìm hiểu về Fluent Interface và Method Chaining
Xin chào các bạn, trong bài trước chúng ta đã biết vềcách xây dựng phương thức mở rộng – cho phép bạn đưa vào các phương thức bổ sung mà không cần sửa đổi, dẫn xuất hoặc biên dịch lại class, struct hoặc interface ban đầu. Hôm nay chúng ta tiếp tục tìm hiểu về 2 khái niệm là Fluent Interface và Method Chaining là hai khái niệm thường được sử dụng trong lập trình hướng đối tượng để tăng tính tổ chức, đơn giản hóa cú pháp và làm cho mã (code) dễ đọc hơn.
Khái niệm về Fluent Interface
Fluent interfaces là một kiểu thiết kế API trong lập trình hướng đối tượng (OOP), cho phép người lập trình viết mã dễ đọc, dễ hiểu và dễ bảo trì. Fluent interface cho phép người dùng liên tiếp gọi các phương thức của đối tượng như là các thành phần của câu lệnh, tạo ra một chuỗi gần giống như các câu văn tự nhiên.
Dưới đây là ví dụ về fluent interface trong Java:
public class User {
private String name;
private int age;
private String email;
public User setName(String name) {
this.name = name;
return this;
}
public User setAge(int age) {
this.age = age;
return this;
}
public User setEmail(String email) {
this.email = email;
return this;
}
public void save() {
// lưu thông tin người dùng vào cơ sở dữ liệu
}
}
Sử dụng fluent interface, ta có thể sử dụng API của lớp User như sau:
User user = new User();
user.setName("John").setAge(30).setEmail("john@gmail.com").save();
Trong đó, ta có thể gọi tiếp các phương thức setName()
, setAge()
, setEmail()
để thiết lập các thông tin của người dùng, kết hợp với phương thức save()
để lưu thông tin người dùng vào cơ sở dữ liệu. Nói tóm lại, fluent interface là một cách tiếp cận thiết kế API thân thiện và dễ hiểu cho người sử dụng. Nó giúp người lập trình có thể viết code gần như là thoại với người dùng, giúp họ dễ dàng sử dụng API của bạn hơn.
Khái niệm về Method Chaining
Method chaining là một kỹ thuật lập trình trong đó ta gọi liên tiếp các phương thức (method) của một đối tượng, trong đó kết quả của một phương thức được chuyển đến phương thức tiếp theo như một tham số đầu vào.
Khi sử dụng method chaining, ta không cần phải cấp phát nhiều biến trung gian để lưu kết quả của từng phương thức. Thay vào đó, ta chỉ cần gọi các phương thức liên tiếp nhau trên một đối tượng, và đối tượng đó sẽ được cập nhật và truyền sang cho phương thức tiếp theo.
Ví dụ:
public class Car
{
public string Model { get; set; }
public int Year { get; set; }
public int Price { get; set; }
public Car SetModel(string model)
{
this.Model = model;
return this;
}
public Car SetYear(int year)
{
this.Year = year;
return this;
}
public Car SetPrice(int price)
{
this.Price = price;
return this;
}
}
// Sử dụng method chaining
Car car = new Car()
.SetModel("Toyota Camry")
.SetYear(2021)
.SetPrice(400000);
// Không sử dụng method chaining
Car car = new Car();
car.SetModel("Toyota Camry");
car.SetYear(2021);
car.SetPrice(400000);
Trong ví dụ trên, ta có một lớp Car
với 3 thuộc tính Model
, Year
và Price
. Lớp này cũng có ba phương thức SetModel
, SetYear
, và SetPrice
để thiết lập các thuộc tính của đối tượng Car
.
Khi sử dụng method chaining, ta có thể gọi các phương thức SetModel
, SetYear
, và SetPrice
trên một đối tượng Car
mới được tạo đồng thời, mà không cần lưu trữ đối tượng vào một biến trung gian. Khi phương thức cuối cùng được gọi, đối tượng sẽ được trả về, và bạn có thể lưu nó vào một biến nếu cần thiết.
Trên đây là một ví dụ cơ bản về method chaining trong C#. Kỹ thuật này rất hữu ích khi bạn muốn gọi nhiều phương thức khác nhau liên tiếp trên một đối tượng mà không muốn lưu trữ đối tượng vào một biến trung gian.
So sánh giữa Method Chaining và Fluent Interface
Method Chaining và Fluent Interface là hai khái niệm thường được sử dụng trong lập trình hướng đối tượng để tăng tính tổ chức, đơn giản hóa cú pháp và làm cho mã (code) dễ đọc hơn. Method Chaining là phương pháp gọi nhiều phương thức liên tiếp trên một đối tượng trong cùng một lệnh. Ví dụ:
person.setName("John").setAge(30).setGender("Male");
Ở ví dụ trên, ta có các phương thức đặt tên, tuổi, và giới tính của đối tượng “person”. Bằng cách sử dụng Method Chaining, ta có thể gọi liên tiếp các phương thức này mà không cần phải tạo ra nhiều lệnh khác nhau. Fluent Interface là một kiểu thiết kế được sử dụng để xây dựng các API thân thiện với người dùng (user-friendly). Nó cho phép người dùng thực hiện các tác vụ với cú pháp tự nhiên giống như đang nói chuyện với một người khác. Ví dụ:
person.setName("John")
.setAge(30)
.setGender("Male")
.save();
Ở đây, phương thức save()
sau khi đặt các thuộc tính của đối tượng “person” được sử dụng để lưu các giá trị mà ta đã cung cấp. Với Fluent Interface, mỗi phương thức trả về đối tượng, cho phép ta gọi liên tiếp các phương thức trên đối tượng trở thành một chuỗi các phương thức.
Method Chaining thường hoạt động trên cùng một tập hợp dữ liệu đơn giản, trong khi Fluent Interface thường được sử dụng như một cách để sửa đổi các khía cạnh khác nhau của một đối tượng phức tạp hơn.
Sự khác biệt giữa hai phương pháp là Fluent Interface luôn được sử dụng để xây dựng các API, trong khi Method Chaining có thể được sử dụng để gọi các phương thức liên tiếp cho một đối tượng. Tuy nhiên, về cơ bản, cả hai kỹ thuật đều cho phép chúng ta gọi liên tiếp các phương thức để thực hiện nhiều tác vụ cùng một lúc.
Ứng dụng của Method Chaining và Fluent Interface
1. Ứng dụng của Fluent Interface
Một ví dụ điển hình về điều này sẽ là configuration builder trong lớp Startup của .NETCore Web application. Trong ví dụ sau, chúng ta có thể thấy rằng mọi thứ rõ ràng liên quan đến quá trình khởi động ứng dụng, nhưng chúng ta không thể nói rằng ‘base path’ and ‘appsettings’ là cùng một bộ dữ liệu. Hãy xem xét đoạn mã sau: –
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
...
2. Ứng dụng của Method Chaining
Nếu bạn đã từng làm việc với thứ gì đó như LINQ, bạn sẽ quen với ý tưởng này.
Ví dụ:
var list = myCollection
.Where(...)
.OrderBy(...)
.Take(5);
Tài liệu tham khảo
Học viên Phạm Tuấn Vũ
Bình luận (0
)