paint-brush
Cách tìm những phần hôi thối trong mật mã của bạn [Phần XXIX]từ tác giả@mcsee
225 lượt đọc

Cách tìm những phần hôi thối trong mật mã của bạn [Phần XXIX]

từ tác giả Maximiliano Contieri8m2023/01/10
Read on Terminal Reader

dài quá đọc không nổi

Mùi mã chỉ là gợi ý về điều gì đó có thể sai. Hầu hết các mùi này không bắt buộc phải cố định. (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ã có mùi trước đó (Phần i - XXVIII)[tại đây.] (https://hackernoon.com/the-one-and-only-software-design-principle -1x983ylp)
featured image - Cách tìm những phần hôi thối trong mật mã của bạn [Phần XXIX]
Maximiliano Contieri HackerNoon profile picture

Mùi mã là một cổ điển.

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ó.)

Mã Trước Mùi

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...


Mã Mùi 141 - IEngine, AVehicle, ImplCar

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

Các vấn đề

Các giải pháp

  1. Loại bỏ tiền tố và hậu tố
  2. Đặt tên cho các đối tượng của bạn sau những gì họ làm

Định nghĩa bài vă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 .

Mã mẫu

Sai

 public interface IEngine { void Start(); } public class ACar { } public class ImplCar { } public class CarImpl { }

Đúng

 public interface Engine { void Start(); } public class Vehicle { } public class Car { }

phát hiện

  • [x] Tự động

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ử.

ngoại lệ

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ữ.

Thẻ

  • đặt tên

Phần kết luận

Sử dụng tên thật cho các mô hình của bạn.

quan hệ

Mã Mùi 130 - AddressImpl

Thêm thông tin

Tín dụng

Ả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


Mã mùi 142 - Truy vấn trong hàm tạo

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.

Các vấn đề

Các giải pháp

  1. Tách logic kinh doanh thiết yếu khỏi sự kiên trì ngẫu nhiên.
  2. Trên các lớp kiên trì, hãy chạy các truy vấn trong các hàm không phải hàm tạo/hàm hủy.

Định nghĩa bài văn

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ệ

Mã mẫu

Sai

 public class Person { int childrenCount; public Person(int id) { childrenCount = database.sqlCall("SELECT COUNT(CHILDREN) FROM PERSON WHERE ID = " . id); } }

Đúng

 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 } }

phát hiện

  • [x] Bán tự động

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.

Thẻ

  • khớp nối

Phần kết luận

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ẽ.

Thêm thông tin

Tín dụng

<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ã Mùi 143 - Dữ Cục

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

Các vấn đề

  • Sự gắn kết kém
  • Mã trùng lặp
  • Độ phức tạp xác thực
  • khả năng đọc
  • khả năng bảo trì

Các giải pháp

  1. Trích xuất lớp
  2. Tìm đồ vật nhỏ

Định nghĩa bài văn

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 .

Mã mẫu

Sai

 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; }

Đúng

 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

  • [x] Bán tự động

Phát hiện dựa trên mô hình gắn kết có sẵn oa vài linters.

thẻ

  • Sự gắn kết

Phần kết luận

Nhóm hành vi ở đúng nơi và ẩn dữ liệu nguyên thủy.

quan hệ

Mã Mùi 122 - Ám Ảnh Nguyên Thủy

Mã Mùi 01 - Người Mẫu Thiếu Máu

Mã Mùi 27 - Mảng kết hợp

Thêm thông tin

Tín dụng

Ả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


Mã Mùi 144 - Đồ vật có thể nhiễm nấ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.

Các vấn đề

Các giải pháp

  1. Xác định các yếu tố có thể thay thế trên miền của bạn
  2. Mô hình hóa chúng như hoán đổi cho nhau

Định nghĩa bài văn

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ế.


Mã mẫu

Sai

 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'));

Đúng

 public class Person { } shoppingQueueSystem.queue(new Person()); // The identity is irrelevant for queue simulation

phát hiện

  • [x] Hướng dẫn sử dụng

Đâ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.

thẻ

  • quá thiết kế

Phần kết luận

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.

Tín dụng

Ả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


Mã Mùi 145 - Hack Đoản Mạch

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 vấn đề

  • khả năng đọc
  • Phản ứng phụ

Các giải pháp

  1. Chuyển đổi ngắn mạch thành IF

Định nghĩa bài văn

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.

Mã mẫu

Sai

 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

Đúng

 if (userIsValid()) { logUserIn(); } if(typeof functionDefinedOrNot == 'function') { functionDefinedOrNot(); } // Checking for a type is another code smell

phát hiện

  • [x] Bán tự động

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

thẻ

  • Tối ưu hóa sớm

Phần kết luận

Đừ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.

quan hệ

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ã Mùi 149 - Tùy Ý Xích

Tín dụng

Ả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.