Vấn đề

Khi một class phải làm việc của ít nhất hai class.

problem

Giải Pháp

Thay vào đó, tạo ra một lớp mới và di chuyển các trường và phương thức có liên quan từ lớp cũ sang lớp mới.

solution

Tại sao phải tái cấu trúc?

Các class bao giờ cũng bắt đầu một cách rõ ràng và dễ hiểu. Chúng xử lý một chức năng riêng từ lúc được khởi tạo mà không liên quan gì đến phần việc của các class khác. Nhưng khi chương trình phát triển, từng phương thức (method) được thêm vào và sau đó là một trường (thuộc tính\field) … và cuối cùng, sẽ có một số class phải thực hiện nhiều chức năng hơn bao giờ hết.

Ưu điểm

  • Cách tái cấu trúc (refactoring) này sẽ giúp duy trì Nguyên tắc Trách nhiệm Duy nhất (Single Responsibility Principle) . Dòng mã (code) của class sẽ rõ ràng và dễ hiểu hơn.
  • Các lớp chỉ có một chức năng (single-responsibility classes) đáng tin cậy hơn và dễ dàng thay đổi. Ví dụ, khi bạn có một class chịu trách nhiệm về mười chức năng nhỏ. Khi bạn thay đổi class này để nâng cấp một chức năng nào đó, bạn sẽ có nguy cơ phá vỡ 9 chức năng còn lại.

Nhược điểm

  • Nếu bạn lạm dụng nó bằng kỹ thuật tái cấu trúc (refactoring technique), bạn sẽ phải sử dụng Inline Class.

Phương pháp Refactor

Trước khi bắt đầu, hãy xác định chính xác cách bạn muốn chia nhỏ các chức năng của class.

    1. Tạo một class mới để chứa các chức năng liên quan.
    2. Tạo mối quan hệ giữa class cũ và class mới. Tốt nhất, mối quan hệ này là một chiều, bởi vì điều này cho phép việc thay đổi class số 2 mà không ảnh hưởng gì tới class số 1. Tuy nhiên, nếu bạn nghĩ rằng một mối quan hệ hai chiều là cần thiết, thì nó sẽ được thiết lập.
    3. Sử dụng Move Field và Move Method cho từng trường (field) và phương thức (method) mà bạn đã xác định sẽ chuyển sang class mới. Đối với phương thức, bắt đầu với những phương thức riêng biệt để giảm nguy cơ gây ra các lỗi lớn. Cố gắng di chuyển lần lượt tại một thời điểm và kiểm tra lại kết quả sau mỗi lần di chuyển, để tránh một chuỗi (pileup) các lỗi cố định tại thời điểm cuối.
      Sau khi bạn di chuyển xong, hãy xem lại kết quả của từng class. Một class cũ có chức năng thay đổi có thể được đổi tên để rõ ràng hơn. Kiểm tra lại xem bạn có thể thoát khỏi mối quan hệ class hai chiều không, nếu có.
    4. Cho thấy khả năng truy cập vào class mới từ bên ngoài. Bạn có thể ẩn class với người khác hoàn toàn bằng cách thêm private, quản lý nó thông qua các trường từ class cũ. Ngoài ra, bạn có thể public nó bằng cách cho phép khách hàng (client) trực tiếp thay đổi các giá trị. Quyết định của bạn phụ thuộc vào mức độ an toàn của class cũ trong khi những thay đổi trực tiếp được thực hiện với các giá trị (values) trong class mới.