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.
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
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 { }
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.
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 } }
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
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; }
Mã Mùi 122 - Ám Ảnh Nguyên Thủy
Mã Mùi 01 - Người Mẫu Thiếu Máu
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.
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.
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
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ụ.
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
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
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