- vừa được xem lúc

Design Pattern: hành trình của Builder Pattern - từ 60 dòng code Java đến 1 dòng code Kotlin

0 0 1

Người đăng: Henry Techie

Theo Viblo Asia

Trong giới võ lâm, Builder Pattern được biết đến như một trong những design pattern phổ biến thuộc nhóm Creational Pattern, giúp tạo ra đối tượng phức tạp theo cách linh hoạt và dễ đọc hơn. Có thể nhiều bạn đã gặp nó ngay trong các dòng code xung quanh mình nhưng không để ý. Với các ngôn ngữ lập trình trước đây, cách triển khai Builder Pattern có thể hơi dài dòng phức tạp, nhưng mình để ý thấy những ngôn ngữ ra mắt sau này đã cải tiến nó để việc triển khai trở nên dễ như ăn kẹo. Vậy nên hôm nay, chúng ta sẽ cùng khám phá hành trình của Builder Pattern từ 60 dòng code Java đến chỉ còn 1 dòng trong Kotlin.

Builder Pattern là cái chi chi?

Trong thực tế phát triển phần mềm, có rất nhiều class cần khởi tạo với nhiều thuộc tính khác nhau. Ví dụ một class House có thể có các thuộc tính như wall, door, window, roof, garage...

Thông thường, để khởi tạo một instance cho class này, chúng ta sẽ code như sau:

House myHouse = new House(4, 2, 4, 1, 1);

Đọc đoạn code trên, đôi khi bạn sẽ tự hỏi 42 ở đây có ý nghĩa là gì? Nếu chúng ta khởi tạo bằng constructor thông thường hoặc sử dụng setter cho từng thuộc tính, sẽ dễ gặp phải một số vấn đề như:

  • Khó đọc và dễ nhầm lẫn: việc gọi constructor với nhiều tham số mà không biết rõ ý nghĩa từng tham số sẽ gây khó hiểu.
  • Dễ gây ra lỗi: Khi thứ tự các tham số sai, compiler có thể không bắt được nếu các tham số cùng kiểu.
  • Thiếu sự linh hoạt: Nếu một số thuộc tính là tuỳ chọn, bạn sẽ cần nhiều constructor overload hoặc setter, gây rối code.
  • Tăng nguy cơ tạo object ở trạng thái không hợp lệ: Nếu chưa gọi đủ setter cần thiết, object có thể không đầy đủ dữ liệu.

Chính vì vậy, Builder Pattern sinh ra để giúp giải quyết các vấn đề này bằng cách đưa code khởi tạo các thuộc tính ra khỏi class và chuyển nó đến một class khác gọi là Builder. Bạn có thể quan sát minh hoạ sau đây:

Builder

Việc tách code sang HouseBuilder cho phép chúng ta tạo đối tượng theo kiểu linh hoạt, rõ ràng từng bước hơn. Đồng thời, nó cũng cho phép tuỳ chọn set thuộc tính nào và bỏ qua thuộc tính nào.

Chúng ta sẽ đi đến với cách triển khai trong Java ngay ở phần tiếp theo.

Java: Builder Pattern đầy đủ

Bỏ qua việc nhà cửa trong phần trước, mình sẽ đến với một ví dụ kinh điển khác là class User.

public class User { private final String name; private final int age; private final String address; private final boolean isVerified; private final boolean isDeleted; private User(Builder builder) { this.name = builder.name; this.age = builder.age; this.address = builder.address; this.isVerified = builder.isVerified; this.isDeleted = builder.isDeleted; } public static class Builder { private String name; private int age; private String address; private boolean isVerified; private boolean isDeleted; public Builder setName(String name) { this.name = name; return this; } public Builder setAge(int age) { this.age = age; return this; } public Builder setAddress(String address) { this.address = address; return this; } public Builder setVerified(boolean verified) { this.isVerified = verified; return this; } public Builder setDeleted(boolean deleted) { this.isDeleted = deleted; return this; } public User build() { return new User(this); } }
} User user = new User.Builder() .setName("Henry Techie") .setAge(30) .setAddress("Hanoi") .setVerified(true) .setDeleted(false) .build();

Như các bạn có thể thấy, chúng ta mất đến 60 dòng code để setup xong Builder Design Pattern trong Java. Với những class có nhiều thuộc tính hơn, lượng boilerplate code còn nhiều hơn nữa.

Đơn giản hoá trong Kotlin

Với Kotlin nói riêng và các ngôn ngữ mới nói chung (Python, Swift, Dart...), mọi việc đã được đơn giản hoá nhờ Named Arguments.

Kotlin hỗ trợ mặc định named argumentsdefault values, giúp bạn không cần implement Builder Pattern một cách thủ công:

data class User( val name: String, val age: Int, val address: String = "", val isVerified: Boolean = false, val isDeleted: Boolean = false
) val user = User( name = "Henry Techie", age = 30, address = 'Hanoi'
) val user = User( name = "Henry Techie", age = 30, isVerified = true
)

Tada... Không cần builder class, không cần 60 dòng setter. Chỉ cần 1 dòng code là có object với các tham số linh hoạt. Bạn hoàn toàn có thể khai báo hoặc bỏ qua các thuộc tính address, isVerifiedisDeleted.

Lời kết

Từ Builder Pattern đầy đủ trong Java tới data classnamed arguments trong Kotlin, chúng ta đã chứng kiến sự tinh giản hoá tuyệt vời. Chính vì vậy mà ban đầu mình đã nói Builder Pattern xuất hiện ngay trong từng hơi thở của chúng ta khi viết code, chỉ là bạn chưa để ý mà thôi.

Chúc các bạn ngày cuối tuần vui vẻ!

🔔 Blog: henrytechie.com

☕️ Facebook: Henry Techie

☁️ TikTok: @henrytechie

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 313

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 288

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 57

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 199

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 78

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 149