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

Fine-grain refactoring deep dive (5) - Implement constants.

0 0 17

Người đăng: logbasex

Theo Viblo Asia

1. Issue

Thông thường trong quá trình phát triển phần mềm, một trong những việc gần như luôn phải có đó chính là implement constants để có thể dùng được ở nhiều nơi khác nhau khắp hệ thống đơn cử như đoạn code sau:

public interface FieldConst { String ID = "_id"; String NAME = "name";
}

Việc implement constants thì sẽ có nhiều cách làm, ở đây chúng ta sẽ không cố gắng để tìm BEST PRATICE mà chỉ tìm GOOD PRACTICE mà thôi. Và trước khi đến với GOOD PRACTICE thì chúng ta phải hiểu tại sao đoạn code trên tại là BAD PRACTICE. Ở dòng đầu tiên định nghĩa một interface dành cho việc khai báo constants, việc này có lợi thế là khi khai báo thì code trở nên gọn gàng khi không phải viết public static final ở trước data type bởi vì interface không thể khởi tạo instance được. Nghe có vẻ khá ổn, tuy nhiên hãy cùng xem lại định nghĩa thế nào là một interface và nó dùng để giải quyết vấn đề gì:

An interface in the Java programming language is an abstract type that is used to specify a behavior that classes must implement. [1]https://en.wikipedia.org/wiki/Interface_(Java)

Interface trong ngôn ngữ lập trình Java là một kiểu trừu tượng dùng để chỉ định một(?) hành vi mà các class phải thực hiện.

Bạn có thể thấy, đoạn code trên là sự lạm dụng interface cho một mục đích sai lệch hoàn toàn với ý nghĩa ban đầu của nó. Mặc dù vẫn hoạt động ổn, nhưng cách thiết kế như vậy là không tốt, nên tránh.

2. Solution

Ngoài sử dụng interface chúng ta có hai hướng tiếp cận chính:

  1. Standalone enum
  2. Standalone class

Vì enum sinh ra để giải quyết bài toán necessary of a fixed set of constants nên có thể nói là lựa chọn hàng đầu để implement constants (bạn có thể xem thêm về cách thiết kế enum ở bài trước) tuy nhiên khi truy cập thuộc tính của enum lại hơi rườm rà thông qua getter/setter nên mình sẽ giới thiệu với các bạn cách tiếp cận thứ hai thông qua standalone class. Trước khi đi vào thiết kế thì chúng ta cùng điểm qua các requirement cần phải đạt trước đã:

  1. Class must be read-only.
  2. Class must be accessible anywhere.
  3. Class must not allow extend.

Và cuối cùng chúng ta có một final class với private constructor như sau:

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class FieldConst { public static final String ID = "_id"; public static final String NAME = "name";
}

Cảm ơn mọi người đã đọc bài. Happy coding! 😍😆

References:

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 279

- 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 258

- 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 37

- 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 180

- 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 55

- 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 124