2024-06-09 11:28 — 5 phút đọc

[Software design principles] - Các đặc điểm của thiết kế phần mềm tốt.

#design-principles#how-to#software-architecture#event-driven#domain#microservices


Thiết kế phần mềm là một khía cạnh quan trọng trong phát triển phần mềm, đảm bảo rằng phần mềm không chỉ hoạt động tốt mà còn dễ bảo trì và mở rộng. Dưới đây là 2 nguyên tắc thiết kế phần mềm tốt: tái sử dụng mã nguồn, và khả năng mở rộng.

Software design principles

Tái sử dụng mã nguồn (Code Reusability)

Chi phí và thời gian là hai trong số các số liệu có giá trị nhất khi phát triển bất kỳ sản phẩm phần mềm nào. Ít thời gian phát triển hơn có nghĩa là tham gia thị trường sớm hơn so với các đối thủ cạnh tranh. Chi phí phát triển thấp hơn có nghĩa là còn nhiều tiền hơn để tiếp thị và tiếp cận rộng hơn với khách hàng tiềm năng.

Code reuse là một trong những cách hiệu quả nhất để giảm chi phí phát triển. Mục đích khá rõ ràng: thay vì phát triển một thứ cứ lặp đi lặp lại từ đầu tại sao chúng ta không sử dụng lại những thứ đã được phát triển trước đó trong một dự án mới?

Ý tưởng thì khá là khả thi trên giấy, nhưng hóa ra để cho mã hiện tại hoạt động trên một môi trường mới thì thường mất nhiều sự nỗ lực hơn. Khớp nối giữa các thành phần phụ thuộc chặt chẽ vào các lớp cụ thể hơn là các giao diện trừu tượng, các thành phần cụ thể được mã hóa cứng rắn vào mã nguồn của bạn, và việc tái sử dụng chúng trở nên khó khăn hơn.

Sử dụng các design patterns là một cách để tăng tính linh hoạt cho các thành phần (components) phần mềm và làm cho chúng có khả năng dễ dàng tái sử dụng hơn. Tuy nhiên điều này đôi khi đi kèm với chi phí phải làm của các thành phần sẽ phức tạp hơn.

Kết luận

  • Tiết Kiệm Thời Gian và Công Sức: Thay vì viết lại mã từ đầu, tái sử dụng mã nguồn cho phép các nhà phát triển tận dụng lại các đoạn mã đã được viết và kiểm thử.
  • Giảm Thiểu Lỗi: Mã nguồn đã được tái sử dụng thường đã trải qua quá trình kiểm thử và sửa lỗi, do đó giảm thiểu rủi ro phát sinh lỗi mới.
  • Tăng Tính Nhất Quán: Sử dụng lại mã nguồn giúp duy trì tính nhất quán trong toàn bộ hệ thống, từ đó dễ dàng hơn trong việc bảo trì và nâng cấp.
  • Thư Viện và Framework: Sử dụng các thư viện và framework là cách phổ biến để tái sử dụng mã nguồn. Các thư viện này cung cấp các chức năng chung mà nhiều ứng dụng có thể sử dụng.

Khả năng mở rộng (Scalability)

Change là một trong những điều không thể tránh khỏi trong phát triển phần mềm. Các yêu cầu của khách hàng thay đổi, các lỗi cần sửa, và các cải tiến cần thực hiện. Để đảm bảo rằng phần mềm của bạn có thể mở rộng mà không cần phải viết lại từ đầu, bạn cần phải thiết kế phần mềm của mình sao cho nó có khả năng mở rộng.

  • Bạn đã phát hành một phiên bản trò chơi điện tử trên windows và khách hàng muốn một phiên bản khác trên MAC OS.
  • Bạn đã tạo ra một GUI Framework với những button vuông, và bây giờ xu hướng đang là các nút tròn.
  • Bạn đã viết một hệ thống web quản lý cửa hàng cho một cửa hàng nhỏ tuyệt vời nhưng bây giờ họ muốn người tiêu dùng đặt hàng qua ứng dụng điện thoại.

Mỗi nhà phát triển có hàng đống yêu cầu thay đổi tương tự, có một số thì không.

Đầu tiên chúng ta cần hiểu rõ vấn đề để có thể giải quyết việc đó. Thông thường theo thời gian bạn viết ra version đầu tiên của một app bạn sẽ sẵn sàng viết lại nó từ đầu bởi vì bạn hiểu ra nhiều vấn đề và có cách giải quyết nó tốt hơn.

Khi có một yêu cầu thay đổi gì đó ngoài tầm kiểm soát thì xu hướng của bạn sẽ là viết lại từ đầu. Đây là lý do rất nhiều nhà phát triển xoay từ ý tưởng ban đầu thành một cái gì đó mới.

Lý do thứ 3 đó là khách hàng rất hài lòng với phiên bản đầu tiên của bạn và họ cảm thấy nó có thể thêm được những tính năng mà họ chưa bao giờ đề cập ở phiên bản trước đó. Đây không phải là những thay đổi phù phiếm: phiên bản đầu tiên tuyệt vời của bạn đã cho anh ta thấy rằng thậm chí nhiều hơn nữa là có thể.

Có một mặt tích cực: nếu ai đó yêu cầu bạn thay đổi điều gì đó trong ứng dụng của mình, điều đó có nghĩa là ai đó vẫn quan tâm đến nó.

Đó là lý do tại sao tất cả các nhà phát triển dày dạn kinh nghiệm đều cố gắng cung cấp những thay đổi có thể xảy ra trong tương lai khi thiết kế kiến trúc của ứng dụng.

Kết luận

  • Thiết Kế Mô-đun: Phần mềm nên được chia thành các mô-đun nhỏ, mỗi mô-đun thực hiện một chức năng cụ thể. Điều này giúp dễ dàng thêm hoặc thay thế các mô-đun mà không ảnh hưởng đến toàn bộ hệ thống.
  • Giao Diện Rõ Ràng: Giao diện giữa các thành phần của hệ thống nên rõ ràng và ổn định, giúp việc thêm các chức năng mới không gây ra xung đột.
  • Sử Dụng Các Mẫu Thiết Kế (Design Patterns): Các mẫu thiết kế như Factory, Singleton, và Observer giúp tạo ra các hệ thống dễ mở rộng và bảo trì.
  • Tuân Thủ Nguyên Tắc SOLID: SOLID là tập hợp các nguyên tắc thiết kế hướng đối tượng giúp phần mềm dễ dàng mở rộng và bảo trì.

aitu avatar

Hi! Tôi là Tuyên — Hiện tại tôi đang làm Software Architect, Senior developer tại một công ty nhỏ ở Hà Nội. Tôi cảm thấy thích thú, đam mê, yêu thích với việc viết lách và chia sẻ những kiến thức mà tôi biết. Hãy đọc nhiều hơn tại blogs và tới about để biết thêm về tôi nhé.