Một số kỹ thuật Refactoring phổ biến

Tram Ho

Trong quá trình code mình nhận thấy với những hàm được viết quá nhiều dòng, nhất là trong hàm đồng thời thực hiện nhiều chức năng thường gây ra nhiều vấn đề như:

  • Khó kiểm soát, khó tái sử dụng và dễ gây ra bug vì xử lý quá nhiều logic trong hàm
  • Mất nhiều thời gian để review làm ảnh hưởng đến tiến độ của dự án

Ngoài ra còn một số vấn đề nữa như bị comment, bị chê code ngu các kiểu. Và để hạn chế được phần nào những vấn đề trên mình xin giới thiệu tới các bạn 3 kỹ thuật phổ biến thường được sử dụng để tái cấu trúc hàm mà không làm thay đổi hành vi của nó. Hãy cùng theo dõi và vận dụng các bạn nhé. Let’s go!

Kỹ thuật 1: Extract Method

Hiểu nôm na kỹ thuật này là tách các đoạn mã trong một hàm cồng kềnh thành các hàm nhỏ hơn chỉ thực hiện một chức năng các bạn nhé.

Hãy xem một ví dụ:

Chúng ta có thể tách phần xử lý ngày hiện tại thành một hàm riêng như sau:

Bây giờ có vẻ đã dễ đọc hơn, nhưng chúng ta có thể tách thêm một số hàm nữa thử xem nhé:

Có vẻ là dài hơn, nhưng mà các hàm nó tường minh nhìn dễ đọc hơn đúng không các bạn.

Kỹ thuật 2: Refactoring Conditionals

Bạn cũng có thể cấu trúc lại các điều kiện phức tạp thành các phương thức để làm cho chúng dễ đọc hơn.

Hãy xem một ví dụ:

Bạn có thấy quen với cách đặt điều kiện thế này không?

Dễ thấy phần thứ 2 của điều kiện if không phải là dễ đọc, vì vậy chúng ta nên tách nó thành một phương thức nhé:

Dễ dàng để đọc hơn rồi đúng không. Điều này làm cho mọi thứ dễ dàng hơn nhiều đối với những người đọc mã này trong tương lai.

.u455d396b7d9a0f1d0fbf4fe7e7a418ee { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u455d396b7d9a0f1d0fbf4fe7e7a418ee:active, .u455d396b7d9a0f1d0fbf4fe7e7a418ee:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u455d396b7d9a0f1d0fbf4fe7e7a418ee { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u455d396b7d9a0f1d0fbf4fe7e7a418ee .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u455d396b7d9a0f1d0fbf4fe7e7a418ee .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u455d396b7d9a0f1d0fbf4fe7e7a418ee:hover .postTitle { text-decoration: underline!important; }

  Code refactoring

.ua3add7c82f0f721c8c275589cf633027 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .ua3add7c82f0f721c8c275589cf633027:active, .ua3add7c82f0f721c8c275589cf633027:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .ua3add7c82f0f721c8c275589cf633027 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .ua3add7c82f0f721c8c275589cf633027 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .ua3add7c82f0f721c8c275589cf633027 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .ua3add7c82f0f721c8c275589cf633027:hover .postTitle { text-decoration: underline!important; }

  Sơ lược về phương pháp Agile

Kỹ thuật 3: Replace Method with Method Object

Đôi khi bạn có một phương thức lớn vượt khỏi tầm kiểm soát. Trong trường hợp này có thể khó tái cấu trúc vì các phương thức lớn có xu hướng có nhiều biến cục bộ (local variables). Một giải pháp là sử dụng kỹ thuật tái cấu trúc Method Object.

Hãy xem một ví dụ:

Để thực hiện tái cấu trúc, chúng ta có thể tạo một lớp mới và chuyển các biến cục bộ (local variables) thành các biến đối tượng (instance variables). Điều này giúp chúng ta tái cấu trúc thêm mã này mà không phải lo lắng về việc truyền dữ liệu.

Đây là lớp MailSender sau khi được tái cấu trúc:

Và đây là lớp mới mà chúng ta định nghĩa:

Nhìn clear hẵn đúng không các bạn.

Phần kết luận

Trên đây chỉ là 3 trong số rất nhiều kỹ thuật để tái cấu trúc mã. Sử dụng các kỹ thuật này sẽ giúp bạn tuân thủ nguyên tắc Single Responibility Principle và giữ cho các lớp và phương thức của bạn luôn trong tầm kiểm soát.

Nếu bạn thích bài viết này, hãy chia sẻ nó với bạn bè của bạn để họ cũng có thể thưởng thức nó nhé!

Nguồn bài viết: Introduction to Refactoring

viblo

.u9515bddeddf9faba24e18925b3ecd0a6 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u9515bddeddf9faba24e18925b3ecd0a6:active, .u9515bddeddf9faba24e18925b3ecd0a6:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u9515bddeddf9faba24e18925b3ecd0a6 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u9515bddeddf9faba24e18925b3ecd0a6 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u9515bddeddf9faba24e18925b3ecd0a6 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u9515bddeddf9faba24e18925b3ecd0a6:hover .postTitle { text-decoration: underline!important; }

  Đây là những kỹ thuật Machine Learning cơ bản giúp máy tính tư duy như con người

.u1ecb3f3b6888f2d84fc82a77ee60a0b5 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5:active, .u1ecb3f3b6888f2d84fc82a77ee60a0b5:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5:hover .postTitle { text-decoration: underline!important; }

  Kỹ Thuật Phân Tích Giải Thuật

Chia sẻ bài viết ngay

Nguồn bài viết : viblo .u9515bddeddf9faba24e18925b3ecd0a6 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u9515bddeddf9faba24e18925b3ecd0a6:active, .u9515bddeddf9faba24e18925b3ecd0a6:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u9515bddeddf9faba24e18925b3ecd0a6 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u9515bddeddf9faba24e18925b3ecd0a6 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u9515bddeddf9faba24e18925b3ecd0a6 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u9515bddeddf9faba24e18925b3ecd0a6:hover .postTitle { text-decoration: underline!important; } Đây là những kỹ thuật Machine Learning cơ bản giúp máy tính tư duy như con người .u1ecb3f3b6888f2d84fc82a77ee60a0b5 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#eaeaea; border:0!important; border-left:4px solid #34495E!important; text-decoration:none; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5:active, .u1ecb3f3b6888f2d84fc82a77ee60a0b5:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5 .ctaText { font-weight:bold; color:inherit; text-decoration:none; font-size: 16px; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5 .postTitle { color:#000000; text-decoration: underline!important; font-size: 16px; } .u1ecb3f3b6888f2d84fc82a77ee60a0b5:hover .postTitle { text-decoration: underline!important; } Kỹ Thuật Phân Tích Giải Thuật