-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội
Chia ra để trị
Nếu chức vô địch thuộc về Template Method pattern thì ngôi á quân chắc chắn sẽ phải thuộc về Composite, một design pattern giúp chúng ta chia source code thành các tầng khác nhau và giúp chúng ta đảm bảo nguyên tắc mỗi lớp chỉ làm một nhiệm vụ riêng biệt (Single Responsibility), và việc thay đổi code của một tầng sẽ không làm ảnh hưởng đến các tầng khác từ đó chúng ta cũng đảm toàn được nguyên tắc đóng với thay đổi, mở với mở rộng (Open/Close)
Vấn đề thực tế
Có bao giờ bạn viết một lớp nào đó 300 dòng chưa? kiểu thế này
public class BookController {
private EntityManager entityManager;
public BookResponse addBook(BookRequest request) {
BookEntity bookEntity = new BookEntity();
bookEntity.setName(request.getBookName());
bookEntity.setAuthor(request.getAuthor());
bookEntity.setCategory(request.getCategory());
bookEntity.setCreatedDate(new Date());
// bookEntity set các field khác
BookEntity savedBookEntity = entityManager.persist(bookEntity);
BookResponse bookResponse = new BookResponse();
bookResponse.setBookId(savedBookEntity.getId());
bookResponse.setBookName(savedBookEntity.getName());
bookResponse.setAuthor(savedBookEntity.getAuthor());
bookResponse.setCategory(savedBookEntity.getCategory());
// bookResponse set các field khác
return bookResponse;
}
}
Và một ngày nào đó chúng ta cần thêm 2 trường price (giá sách) và releaseDate (ngày phát hành) thì sao? bạn có thể thấy code của chúng ta sẽ càng ngày càng dài ra, và việc sửa đổi một lớp dài ngoằng như vậy sẽ chứa đựng rất nhiều rủi ro. Vậy chúng ta nên làm thế nào? Đó là khi chúng ta cần đến composite design pattern.
Mục tiêu ra đời
Composite pattern ra đời nhằm mục tiêu:
- Tách các lớp lớn với nhiều dòng code ra thành các lớp nhỏ với ít dòng code hơn, thuật tiện cho việc đọc hiểu và maintain sau này
- Đảm bảo mỗi lớp sẽ chỉ thực hiện các các nhiệm vụ riêng việc, tăng khả common (tái sử dụng) code
- Hạn chế việc thay đổi lớp sử dụng và tăng khả năng mở rộng source code về sau này
- Tăng khả năng đa thừa kế, đưa ra nhiều sự lựa chọn hơn là chỉ sử dụng extends
Trong phạm vi của bài viết này, chúng ta hãy nói về việc tách lớp trước nhé.
Giải quyết vấn đề
Quay trở lại bài toán ở trên, chúng ta sẽ cần tách 3 lớp
Sơ đồ lớp
- Lớp RequestToEntityConverter: chịu trách nhiệm chuyển Request thành Entity để lưu được xuống cơ sở dữ liệu, chúng ta không thể lưu đối tượng Request xuống cơ sở dữ liệu vì nó thiếu trường
Id
vàcreatedDate
- EntityToResponseConverter: Chịu trách nhiệm chuyển Entity thành Response, chúng ta không nên trả về đối tượng Entity cho client vì sẽ có những trường chứa dữ liệu nhạy cảm hoặc những trường mà client ko cần dùng, ví dụ như password hoặc createdDate
- BookController: chỉ còn phải chịu trách nhiệm xử lý nghiệp vụ và không còn phải thực hiện các thao tác chuyển đổi nữa
Source code
Khi đã có sơ đồ lớp rồi thì tiến hành cài đặt thôi nhỉ.
class RequestToEntityConverter {
public BookEntity bookRequestToEntity(BookRequest request) {
BookEntity bookEntity = new BookEntity();
bookEntity.setName(request.getBookName());
bookEntity.setAuthor(request.getAuthor());
bookEntity.setCategory(request.getCategory());
bookEntity.setCreatedDate(new Date());
return bookEntity;
}
}
class EntityToResponseConverter {
public BookResponse bookEntityToResponse(BookEntity entity) {
BookResponse bookResponse = new BookResponse();
bookResponse.setBookId(entity.getId());
bookResponse.setBookName(entity.getName());
bookResponse.setAuthor(entity.getAuthor());
bookResponse.setCategory(entity.getCategory());
return bookResponse;
}
}
public class BookController {
private EntityManager entityManager;
private RequestToEntityConverter requestToEntityConverter;
private EntityToResponseConverter entityToResponseConverter;
public BookResponse addBook(BookRequest request) {
BookEntity bookEntity = requestToEntityConverter.bookRequestToEntity(request);
BookEntity savedBookEntity = entityManager.persist(bookEntity);
BookResponse bookResponse = entityToResponseConverter.bookEntityToResponse(savedBookEntity);
return bookResponse;
}
}
Bạn có thể thấy lớp BookController của chúng ta, lớp quan trọng nhất sẽ ngắn gọn hơn rất nhiều, và sau này khi có thêm mới trường cho Book chẳng hạn thì chúng ta cũng không cần sửa đổi gì lớp BookController.
Tổng kết
Trong thực tế đối với các dự án lớn, việc quản lý source code là tương đối khó khăn, việc phải maintain hàng trăm nghìn, hàng triệu dòng code sẽ khiến chúng ta chìm trong mớ hỗn độn, nếu không chia nhỏ được source code, không thể #unitest thì sẽ đến một ngày nào đó chúng ta sẽ phải đập dự án đi và xây lại từ đầu Việc phân chia source code và tách nhỏ file thế nào nó phụ thuộc rất nhiều vào sự nhạy cảm của lập trình viên, muốn có được sự nhạy cảm này không có cách nào khác ngoài luôn luôn thử nghiệm nhiều cách làm khác nhau, từ đó tích lũy được kinh nghiệm và đưa ra được quyết định hợp lý, nhưng cũng đừng lạm dụng Composite pattern này nhé.
Tham khảo
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội