Nó có mùi vì có thể có nhiều trường hợp có thể được chỉnh sửa hoặc cải thiện.
Hầu hết những mùi này chỉ là dấu hiệu của điều gì đó có thể không ổn. Chúng không được yêu cầu cố định mỗi ngày… (Tuy nhiên, bạn nên xem xét nó.)
Tiếp tục đi...
Khi so sánh với boolean, chúng tôi thực hiện phép đúc và nhận được kết quả bất ngờ.
TL; DR: Đừng so sánh với sự thật. Hoặc bạn đúng, hoặc sai hoặc bạn không nên so sánh
Nhiều ngôn ngữ truyền giá trị tới các miền giao nhau boolean.
#!/bin/bash if [ false ]; then echo "True" else echo "False" fi # this evaluates to true since # "false" is a non-empty string if [ false ] = true; then echo "True" else echo "False" fi # this also evaluates to true
#!/bin/bash if false ; then echo "True" else echo "False" fi # this evaluates to false
Linters có thể kiểm tra các so sánh và cảnh báo rõ ràng.
Một thực tế phổ biến trong ngành là sử dụng nhiều boolean không phải boolean. Chúng ta nên rất nghiêm ngặt khi sử dụng boolean.
Code Smell 69 - Big Bang (JavaScript Ridiculous Castings)
Ảnh của Michael Held trên Unsplash
Nếu nó không hoạt động, nó không có tác dụng nhanh như thế nào.
- Mich Ravera
IF và Elses lồng nhau rất khó đọc và kiểm tra
TL; DR: Tránh các IF lồng nhau. Thậm chí tốt hơn: Tránh TẤT CẢ CÁC NẾU
Trong mã thủ tục, rất thường thấy các if lồng nhau phức tạp. Giải pháp này liên quan nhiều đến kịch bản hơn là lập trình hướng đối tượng.
if (actualIndex < totalItems) { if (product[actualIndex].Name.Contains("arrow")) { do { if (product[actualIndex].price == null) { // handle no price } else { if (!(product[actualIndex].priceIsCurrent())) { // add price } else { if (!hasDiscount) { // handle discount } else { // etc } } } actualIndex++; } while (actualIndex < totalCounf && totalPrice < wallet.money); } else actualIndex++; } return actualIndex; }
foreach (products as currentProduct) addPriceIfDefined(currentProduct) addPriceIfDefined() { //Several extracts }
Vì nhiều linters có thể phân tích cú pháp cây, chúng tôi có thể kiểm tra thời gian biên dịch cho các cấp độ lồng nhau.
Theo lời khuyên của chú bob , chúng ta nên để mã sạch hơn chúng ta đã tìm thấy.
Tái cấu trúc vấn đề này rất dễ dàng.
Code Smell 78 - Địa ngục gọi lại
Code Smell 03 - Các hàm quá dài
Code Smell 36 - Câu lệnh switch / case / elseif / else / if
Mục đích của kỹ thuật phần mềm là kiểm soát độ phức tạp, không phải để tạo ra nó.
- Pamela Zave
Gọi các phương thức truy cập của riêng chúng tôi có vẻ là một ý tưởng đóng gói tốt. Nhưng nó không phải như vậy.
TL; DR: Không sử dụng setters và getters, ngay cả khi sử dụng cho mục đích cá nhân
Sử dụng đóng gói kép là một quy trình tiêu chuẩn trong những năm 90.
Chúng tôi muốn ẩn chi tiết triển khai ngay cả khi sử dụng riêng tư.
Điều này đang che giấu một mùi khác khi có quá nhiều chức năng dựa vào cấu trúc dữ liệu và việc triển khai ngẫu nhiên.
Ví dụ, chúng ta có thể thay đổi biểu diễn bên trong của một đối tượng và dựa vào giao thức bên ngoài của nó.
Chi phí / lợi ích không đáng là bao.
contract MessageContract { string message = "Let's trade"; function getMessage() public constant returns(string) { return message; } function setMessage(string newMessage) public { message = newMessage; } function sendMessage() public constant { this.send(this.getMessage()); // We can access property but make a self call instead } }
contract MessageContract { string message = "Let's trade"; function sendMessage() public constant { this.send(message); } }
Chúng ta có thể suy ra getters và setters và kiểm tra xem chúng có được gọi từ cùng một đối tượng hay không.
Đóng gói kép là một ý tưởng hợp thời để bảo vệ việc thực hiện ngẫu nhiên, nhưng nó lộ ra nhiều thứ hơn là được bảo vệ.
Code Smell 37 - Thuộc tính được bảo vệ
Ảnh của Ray Hennessy trên Unsplash
Đóng gói khái niệm thay đổi.
- Erich Gamma
Khẳng định chống lại boolean làm cho việc theo dõi lỗi khó khăn hơn.
TL; DR: Không khẳng định đúng trừ khi bạn đang kiểm tra boolean
Khi xác nhận boolean, công cụ kiểm tra của chúng tôi không thể giúp chúng tôi nhiều.
Họ chỉ cho chúng tôi biết một cái gì đó không thành công.
Theo dõi lỗi trở nên khó khăn hơn.
<? final class RangeUnitTest extends TestCase { function testValidOffset() { $range = new Range(1, 1); $offset = $range->offset(); $this->assertTrue(10 == $offset); // No functional essential description :( // Accidental description provided by tests is very bad } } // When failing Unit framework will show us // // 1 Test, 1 failed // Failing asserting true matches expected false :( // () <-- no business description :( // // <Click to see difference> - Two booleans // (and a diff comparator will show us two booleans)
<? final class RangeUnitTest extends TestCase { function testValidOffset() { $range = new Range(1, 1); $offset = $range->offset(); $this->assertEquals(10, $offset, 'All pages must have 10 as offset'); // Expected value should always be first argument // We add a functional essential description // to complement accidental description provided by tests } } // When failing Unit framework will show us // // 1 Test, 1 failed // Failing asserting 0 matches expected 10 // All pages must have 10 as offset <-- business description // // <Click to see difference> // (and a diff comparator will help us and it will be a great help // for complex objects like objects or jsons)
Một số linters cảnh báo chúng tôi nếu chúng tôi đang kiểm tra boolean sau khi thiết lập điều kiện này.
Chúng tôi cần thay đổi nó thành một kiểm tra cụ thể hơn.
Cố gắng viết lại các xác nhận boolean của bạn và bạn sẽ sửa lỗi nhanh hơn nhiều.
Code Smell 101 - So sánh với Boolean
Ảnh của Joël de Vriend trên Unsplash
Cuối cùng tôi đã học được 'tương thích trở lên' nghĩa là gì. Nó có nghĩa là chúng ta phải giữ tất cả những sai lầm cũ của chúng ta.
- Dennie van Tassel
Sử dụng tên chuyên nghiệp và có ý nghĩa
TL; DR: Không thân mật hoặc xúc phạm
Nghề nghiệp của chúng tôi có một mặt sáng tạo.
Đôi khi chúng ta cảm thấy buồn chán và cố gắng trở nên hài hước.
function erradicateAndMurderAllCustomers(); // unprofessional and offensive
function deleteAllCustomers(); // more declarative and professional
Chúng tôi có thể có một danh sách các từ bị cấm.
Chúng tôi cũng có thể kiểm tra chúng trong các bài đánh giá mã.
Tên là theo ngữ cảnh, vì vậy sẽ là một nhiệm vụ khó khăn đối với một người viết thư tự động.
Các quy ước đặt tên phải chung chung và không được bao gồm các biệt ngữ văn hóa.
Hãy chuyên nghiệp trong cách bạn đặt tên cho mọi thứ trong mã của mình.
Đừng cố gắng trở thành một diễn viên hài bằng cách đặt cho một biến thể một cái tên ngớ ngẩn.
Bạn nên viết mã sản xuất để các nhà phát triển phần mềm tương lai (kể cả bạn) có thể dễ dàng hiểu được.
Ảnh của Stewart Munro trên Unsplash
Tâm lý 'người dùng là những kẻ ngốc và bị nhầm lẫn bởi chức năng' của Gnome là một căn bệnh. Nếu bạn nghĩ rằng người dùng của mình là những kẻ ngốc, thì chỉ những kẻ ngốc mới sử dụng nó.
- Linus Torvalds
Trích dẫn tuyệt vời về kỹ thuật phần mềm
Và đó là tất cả cho bây giờ…
Bài sau sẽ giải thích thêm về 5 mùi mã nhé!