Nó có mùi vì có thể có nhiều trường hợp nó 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à gợi ý về điều gì đó có thể không ổn. Do đó, bản thân chúng không bắt buộc phải sửa… (Tuy nhiên, bạn nên xem xét nó.)
Bạn có thể tìm thấy tất cả các mùi mã trước đó (Phần i - XXVIII) tại đây.
Tiếp tục đi...
Bạn đã bao giờ nhìn thấy một IEngine ngoài tự nhiên chưa?
TL; DR: Không thêm tiền tố hoặc hậu tố cho các lớp học của bạn
Một số ngôn ngữ có các quy ước văn hóa liên quan đến kiểu dữ liệu, Lớp trừu tượng hoặc Giao diện. Những tên này tải các mô hình của chúng tôi bằng các bản dịch nhận thức khó theo dõi.
Chúng ta phải HÔN .
public interface IEngine { void Start(); } public class ACar { } public class ImplCar { } public class CarImpl { }
public interface Engine { void Start(); } public class Vehicle { } public class Car { }
Nếu chúng ta có Từ điển đồng nghĩa, chúng ta có thể chỉ ra những cái tên khó xử.
Trong C#, thông thường người ta đặt "I" trong tên của một giao diện bởi vì nếu không có nó, bạn không thể biết đó là một giao diện hay một lớp.
Đây là một mùi ngôn ngữ.
Sử dụng tên thật cho các mô hình của bạn.
Ảnh của Tim Mossholder trên Bapt
Một số người, khi đối mặt với một vấn đề, nghĩ rằng "Tôi biết, tôi sẽ sử dụng các biểu thức thông thường." Bây giờ họ có hai vấn đề.
Jamie Zawinski
Báo giá tuyệt vời về kỹ thuật phần mềm
Truy cập cơ sở dữ liệu trong các đối tượng miền là mùi mã. Làm điều đó trong một nhà xây dựng là một mùi kép.
TL; DR: Các nhà xây dựng nên xây dựng (và có thể khởi tạo) các đối tượng.
Trên mã kế thừa, cơ sở dữ liệu không được phân tách chính xác khỏi các đối tượng kinh doanh.
Các nhà xây dựng không bao giờ nên có tác dụng phụ.
Theo nguyên tắc trách nhiệm duy nhất, họ chỉ nên xây dựng các đối tượng hợp lệ
public class Person { int childrenCount; public Person(int id) { childrenCount = database.sqlCall("SELECT COUNT(CHILDREN) FROM PERSON WHERE ID = " . id); } }
public class Person { int childrenCount; // Create a class constructor for the Main class public Person(int id, int childrenCount) { childrenCount = childrenCount; // We can assign the number in the constructor // Accidental Database is decoupled // We can test the object } }
Những kẻ lừa đảo của chúng tôi có thể tìm thấy các mẫu SQL trên các hàm tạo và cảnh báo chúng tôi.
Tách biệt các mối quan tâm là chìa khóa và khớp nối là kẻ thù chính của chúng ta khi thiết kế phần mềm mạnh mẽ.
<span>Ảnh của Callum Hill trên Bapt </span>
Niềm tin của tôi vẫn là, nếu bạn hiểu đúng cấu trúc dữ liệu và các giá trị bất biến của chúng, hầu hết mã sẽ tự viết.
Peter Deustch
Báo giá tuyệt vời về kỹ thuật phần mềm
Một số đối tượng luôn ở cùng nhau. Tại sao chúng ta không tách chúng ra?
TL; DR: Làm cho các đối tượng nguyên thủy gắn kết di chuyển cùng nhau
Mùi này là bạn của nỗi ám ảnh nguyên thủy.
Nếu hai hoặc nhiều đối tượng nguyên thủy được dán lại với nhau, với logic nghiệp vụ được lặp lại và các quy tắc giữa chúng, chúng ta cần tìm khái niệm hiện có về sự phân đôi .
public class DinnerTable { public DinnerTable(Person guest, DateTime from, DateTime to) { Guest = guest; From = from; To = to; } private Person Guest; private DateTime From; private DateTime To; }
public class TimeInterval { public TimeInterval(DateTime from, DateTime to) { // We should validate From < To From = from; To = to; } } public DinnerTable(Person guest, DateTime from, DateTime to) { Guest = guest; Interval = new TimeInterval(from, to); } // Even Better... public DinnerTable(Person guest, Interval reservationTime) { Guest = guest; Interval = reservationTime; }
Phát hiện dựa trên mô hình gắn kết có sẵn oa vài linters.
Nhóm hành vi ở đúng nơi và ẩn dữ liệu nguyên thủy.
Mã Mùi 122 - Ám Ảnh Nguyên Thủy
Mã Mùi 01 - Người Mẫu Thiếu Máu
Ảnh của Dynamic Wang trên Bapt
Trọng tâm của phần mềm là khả năng giải quyết các vấn đề liên quan đến tên miền cho người dùng. Tất cả các tính năng khác, mặc dù chúng có thể quan trọng, đều hỗ trợ mục đích cơ bản này.
Eric Evans
Báo giá tuyệt vời về kỹ thuật phần mềm
Chúng tôi đã nghe rất nhiều về NFT. Bây giờ, chúng tôi nắm vững khái niệm Fungible.
TL; DR: Tôn trọng MAPPER . Làm cho có thể thay thế những gì có thể thay thế trong thế giới thực và ngược lại.
Theo Wikipedia :
Tính có thể thay thế được là đặc tính của hàng hóa hoặc hàng hóa mà các đơn vị riêng lẻ về cơ bản có thể thay thế cho nhau và mỗi bộ phận của chúng không thể phân biệt được với bộ phận khác.
Trong phần mềm, chúng ta có thể thay thế các đối tượng có thể thay thế bằng các đối tượng khác.
Khi ánh xạ các đối tượng của chúng ta với các đối tượng thực, đôi khi chúng ta quên mất mô hình từng phần và xây dựng trên thiết kế.
public class Person implements Serializable { private final String firstName; private final String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } } shoppingQueueSystem.queue(new Person('John', 'Doe'));
public class Person { } shoppingQueueSystem.queue(new Person()); // The identity is irrelevant for queue simulation
Đây là một mùi ngữ nghĩa.
Chúng ta cần hiểu mô hình để kiểm tra xem nó có đúng hay không.
Làm cho có thể thay thế những gì có thể thay thế và ngược lại.
Nghe có vẻ dễ dàng nhưng đòi hỏi kỹ năng thiết kế và tránh sự phức tạp ngẫu nhiên.
Ảnh của Andrey Metelev trên Bapt
Mọi người nghĩ rằng khoa học máy tính là nghệ thuật của những thiên tài nhưng thực tế thì ngược lại, chỉ là nhiều người làm những việc xây dựng lên nhau, giống như một bức tường đá nhỏ.
Donald Knuth
Không sử dụng đánh giá boolean làm lối tắt dễ đọc.
TL; DR: Không sử dụng so sánh Boolean cho các chức năng tác dụng phụ.
Các lập trình viên thông minh thích viết mã khó hiểu và khó hiểu ngay cả khi không có bằng chứng chắc chắn cho sự cải tiến này.
Tối ưu hóa sớm luôn ảnh hưởng đến khả năng đọc.
userIsValid() && logUserIn(); // this expression is short circuit // Does not value second statement // Unless the first one is true functionDefinedOrNot && functionDefinedOrNot(); // in some languages undefined works as a false // If functionDefinedOrNot is not defined does // not raise an error and neither runs
if (userIsValid()) { logUserIn(); } if(typeof functionDefinedOrNot == 'function') { functionDefinedOrNot(); } // Checking for a type is another code smell
Chúng ta có thể kiểm tra xem các chức năng có bị hỏng hay không và thay đổi ngắn mạch thành IF.
Một số linter thực tế cảnh báo chúng ta về vấn đề này
Đừng cố tỏ ra thông minh.
Chúng ta không còn ở độ tuổi 50 nữa.
Hãy là một nhà phát triển nhóm.
Mã mùi 140 - Đánh giá ngắn mạch
Mã Mùi 06 - Lập Trình Viên Quá Khéo Léo
Ảnh của Michael Dziedzic trên Bapt
Máy tính là một cỗ máy ngu ngốc với khả năng làm những điều cực kỳ thông minh, trong khi các lập trình viên máy tính là những người thông minh với khả năng làm những điều cực kỳ ngu ngốc. Nói tóm lại, họ là một cặp đôi hoàn hảo.
Bill Bryson
Bài tiếp theo: 5 mùi code nữa.