Code smell - Code gì thấy gớm vậy ba

     Mình thấy có khá nhiều developer kể cả mình từ các bạn intern, fresher... cũng mắc phải những lỗi code smell mà đáng lẽ ra chúng ta nên tránh. Đừng có nói: "Tao làm cái này chạy được rồi sau này thằng khác dô maintain thì nó tự đọc code đi, chứ ai rảnh đâu mà làm cho nó đẹp, dễ đọc". Xong cuối cùng bản thân mình lại là người đi hốt đống code thúi đó.

 Vậy cho nên dưới đây sẽ là một vài lỗi code smell mà mình thấy và hay gặp phải, cũng như cách giải quyết chúng.



    1. Đặt tên biến không rõ ràng, hay dùng magic number trong code:

            -  Có vài trường hợp đặt tên biến rất bị confuse, kiểu không biết biến đó dùng để làm gì, làm cho trở nên khó hiểu hơn rất nhiều. Thường thì nên đặt tên biến là danh từ là tốt nhất.

             Ví dụ: không nên: getStartTime, valueA, valueB,  nên: startTime, endTime, totalProduct

            - Và đặc biệt mình thấy có một cái mà khá nhiều người hay mắc phải đó là magic number, nhìn thì vô hại đó nhưng mà hại người khác vô đọc cái đoạn code đó thôi.


        - Cái số 7 này là gì anh 7 hay chị 7, hay 7 ngày 7 đêm, cho nên đừng bao giờ sử dụng magic number, người sau vô đọc không biết nó là gì đâu, có khi người sau mà mình đó :)) 

        - Cách giải quyết cho magic number là nên tạo ra một hằng số với tên rõ ràng là oke, việc này sẽ cải thiện cho việc đọc code dễ dàng hơn.

    2. Tên hàm không thể hiện được rằng hàm đó đang làm gì.

        - Cũng tương tự như biến, tên hàm nên thể hiện rằng công việc mà nó đảm nhận, tên hàm phải là động từ, việc đặt tên hàm rõ ràng giúp cho dễ dàng xác định hàm thực hiện hành động gì, dễ đọc hơn. Đừng đặt tên một cái hàm mà người khác không biết để làm gì.

    3. Hàm thực hiện quá nhiều hành động

        - Mình có thằng bạn viết cái hàm xuyên qua cái màn hình 24 inch, lines thì lấy thước đo mới được chứ đếm không nổi. Việc hàm thực hiện quá nhiều hành động sẽ dẫn tới code rất khó đọc, khó maintain, khó nâng cấp tính năng, debug rối nùi. Hãy tách nhỏ các hàm thành những hàm nhỏ hoặc có thể là các class nhỏ, mỗi class là một đối tượng và mỗi hàm chỉ thực hiện duy nhất một hành động. Tuy nhiên để cải thiện vấn để này cần áp dụng OOP và các design patterm đúng cách.
        - Dưới đây là một ví dụ: Mình có một hàm order thức ăn, nhưng để thực hiện được hàm này mình cần làm rất nhiều step như nhận đơn, chuẩn bị đơn để làm món, nấu món ăn... Bạn thử hình dung xem nếu bạn viết tất cả các step này trong hàm orderFood thì code bạn sẽ dài loằng ngoằng đúng không ?
        - Chưa kể đến việc bạn rất khó debug, thử hình dung một ngày bạn cần sửa logic nấu món ăn đi, bạn nhìn mấy trăm dòng code chi chít, nhìn nản luôn khỏi sửa. Hơn nữa việc hàm xử lý quá nhiều hành động dẫn tới code bạn không thể reuse, ông khác vào copy đoạn đó và paste đi chỗ khác càng ngày càng duplicate lên.

 
        Ở đây hàm order sẽ gọi đến các class khác như Waiter, Cook, mỗi class sẽ có những hàm liên quan đến đối tượng đó, nhìn hàm orderFood lúc này gọn và dễ nhìn đi rất nhiều. Mình dễ dàng thay đổi các step trong hàm và có thể reuse nếu muốn.

    4. If else / foreach lồng nhau quá nhiều

       
  - Cái này mình cũng hay mắc phải và nhìn nó hãi hùng lắm =))), việc bạn cứ if else lồng vô rất khó nhìn và code cực kì rối. Để giải quyết cái vấn đề này mình thường áp dụng các cách sau đây.
          


        + Inverted If:  Mình sẽ đảo ngược logic của đoạn if lồng nhau để giảm việc if lồng nhau.


        + Split Loop: đừng nên xử lý vòng lặp lồng nhau quá nhiều, hãy tách các vòng lặp ra, trừ trường hợp bất khả kháng.
   - Từ như này:

    - Thành như này.


- Tóm lại: Đây là một vài lỗi mình hay mắc phải cũng như cách khắc phục chúng. Nếu code bạn thúi giống code mình, thì nên thử những cách trên. Tạm biệt ~~




Nhận xét