Trên wiki: DRY là nguyên tắc bạn đừng viết lặp lại một đoạn code
Bạn: Ok, những phần code bị trùng mình sẽ chuyển thành abstraction
Giải pháp trông có vẻ hiển nhiên đúng, nhưng không, abstraction của bạn thường là sai.
Đây là lý do tại sao:
- Bạn thấy code bị duplicate
- Bạn đưa đoạn duplicate ra thành một abstract (method, class)
- Bạn thay thể toàn bộ phần duplicate bằng abstraction mới
- Bạn nghĩ code đã hoàn hảo
- Thời gian trôi đi
- PM đưa thêm các yêu cầu mới.
- Bạn bắt đầu hiện thực các yêu cầu mới
- Với yêu cầu mới này, bạn phải chỉnh sửa vài đoạn trong abstraction,
if...else
các kiểu, đổi parameter, abstraction của chúng ta có thể đưa ra những action khác nhau theo những điều kiện khác nhau - Giờ abstraction của trọng sẽ cho ra những kết quả khác nhau trên những case khác nhau
- Yêu cầu mới lại đến, thêm parameter tiếp, thêm câu điều kiện tiếp
- Và giờ đây đoạn code của bạn không còn dễ maintain, nói thẳng ra là một đống hầm bà lằng khó nuốt
- Chúc mừng, bạn đã bị over engineer và gây ra một abstract quá đỗi phức tạp
Vậy thì sao? Hãy thử WET (Write everything twice)
WET
Như cách chơi chữ đã thể hiện, nó là trường phái đối nghịch hoàn toàn với DRY, khi bắt đầu viết code, bạn sẽ không thể nào lường trước được mọi yêu cầu, mọi tính năng. Vì thế đừng vội vàng áp dụng abstraction
Bạn hãy nhớ
Cái giá phải trả cho duplicate vẫn rẻ hơn nhiều cho một abstract viết sai
Ví dụ bạn viết một ứng dụng, bạn dựng ra một component tên Button
để sử dụng nhiều nơi, nghe rất hợp lý. Một yêu cầu mới xuất hiện, ở trang landing page họ muốn có một nút bấm rất fancy và không giống với tất cả những nút bấm trước đây.
Ok, thay đổi cũng nhỏ thôi, chỉ cần thêm tí điều kiện if...else
, 90% phần code là của Button
và 10% code là của FancyButton
Sự thật đáng buồn là sẽ có rất nhiều những thay đổi như thế xuất hiện và khả năng rất cao là bạn không đủ kinh nghiệm để có hiện thực những abstraction đủ dễ hiểu, dễ maintain.
Lời khuyên? Copy copy code đó ra, đừng ngần ngại
Bạn thấy quan điểm của mình bậy quá bậy!, bạn có thể tham khảo thêm quan điểm của Dan Abramov
In this talk, my aim was to show why strict adherence to writing code that is free of duplication inevitably leads to software we can’t understand
Tạm dịch, tuân thủ nghiêm ngặc quy tắc DRY sẽ dẫn đến một phần mềm mà chúng ta không hiểu nổi nó.
Initializing...