Code thối là cái gì vậy ?

*
Code Smells (Mã xấu, giỏi "Code Thối" nếu thích) là từ được dùng để làm chỉ phần code cơ mà ta cảm giác không thể ổn 1 chút nào. Đây hay là đoạn code vi phạm luật hầu như nguyên tắc trong lập trình sẵn. Giả sử nhiều người đang phát âm một nội dung bài viết cùng bắt gặp một lỗi bao gồm tả thì tức thì lập tức, bạn sẽ bao gồm cảm hứng ngờ ngợ, khó chịu. khi xem code, ta cũng đều có những bội phản ứng giống như. Lúc đó, ta đang ngửi thấy mùi hôi tăn năn của đoạn mã xấu.

Bạn đang xem: Code smell là gì

Code Smells có thể là ngulặng nhân dẫn mang lại nhưng vấn đề xuất xắc bug sâu hơn, khó tìm rộng, với với bài toán loại trừ chúng thì ta có thể biết code của họ thật sạch sẽ với tinh tế hơn. Code Smells thường chạm mặt tuyệt nhất là class lâu năm loằng ngoằng, method vượt khổng lồ, code ko cần sử dụng cho xuất xắc lặp code. Những vụ việc này có thể sẽ không còn xuất hiện lỗi tức thì mau lẹ nhưng lại chúng rất có thể khiến chúng ta cạnh tranh maintain tương tự như hoàn toàn có thể tạo ra cả lỗi trong tương lai. Sau trên đây mình xin giới thiệu một vài ba đoạn code thối, bao gồm nhưng lại đoạn code quá thãi, ĐK quá dài, class có thuộc tính tuy vậy không có cách tiến hành và tên biến chuyển ko phù hợp.

1. Code thừa: if ... return true, else return false

Đoạn pattern if ... return true, else return false lộ diện siêu không ít lần vào code của chúng ta. Trả về true hoặc false từ câu if là một trong Việc tương đối vượt thãi (xem ví dụ bên dưới). Cách viết code như vậy này là ví dụ điển hình nổi bật mang đến bài toán code quá với điều đó vẫn dẫn đến sự việc project của bọn họ bị phạt tướng với trsinh sống yêu cầu khó khăn phát âm rộng. Mình đang chỉ dẫn hai giải pháp viết code mang đến pattern này, một quãng vừa lâu năm vừa thừa và một đoạn nlắp gọn gàng, tinh tế và sắc sảo (). Đây là một hàm trong class Animal để đánh giá coi nó liệu có phải là nhỏ mèo hay không.

class Animalattr_reader :typedef initialize(type)
type = typeenddef is_a_cat?if type == "cat"return trueelsereturn falseendendendCác chúng ta bao gồm ngửi thấy mùi hương thum thủm không? ĐIều kiện type == "cat" vốn vẫn trả về dạng hình boolean rồi bắt buộc chúng ta không cần phải thêm nó vào câu ĐK if :

class Animalattr_reader :typedef initialize(type)
type = typeenddef is_a_cat?(animal)type == "cat"endendYeah, thơm hơn rồi kia. Các bạn khi dùng pattern if ... return true, else return false chỉ cần đừng quên loại trừ code quá thì họ sẽ sở hữu được một quãng code sạch đẹp với dễ đọc rộng các. Tiếp tục thôi làm sao.

2. Câu điều kiện thừa dàiiiiiiiiiiiiii

phần lớn thời gian bọn họ sẽ buộc phải check xem biến đổi của chúng ta gồm bởi cùng với một trong những rất nhiều options không giống nhau, có không ít cách để làm việc này, nhưng lại một số cách lại "thối" hơn các so với những giải pháp còn lại.

Xem thêm: Explaindio Video Creator Platinum 4, Explaindio Platinum Mac V4

puts "What is your major?"major = gets.chompcase majorwhen "Biology"puts "Mmm the study of life itself!"when "Computer Science"puts "I"m a computer!"when "English"puts "No way! What"s your favorite book?"when "Math"puts "Sweet! I"m great with numbers!"elseputs "That"s a cool major!"endCách này vẫn còn đó hơi dài và cực nhọc hiểu, test phương pháp này xem:

puts "What is your major?"major = gets.chomp# Set default responsemajor_responses = Hash.new("That"s a cool major!")# Add other responsesmajor_responses<"Biology"> = "Mmm the study of life itself!"major_responses<"Computer Science"> = "I"m a computer!"major_responses<"English"> = "No way! What"s your favorite book?"major_responses<"Math"> = "Sweet! I"m great with numbers!"puts major_responsesBằng cách bản đồ major cùng với response, bọn họ đang có 1 hash những major cùng với response tương xứng. Chúng ta cũng tạo nên 1 quý giá mặc định để trả về khi môn học tập ta nhtràn lên ko trường thọ vào hash major_responses. Sau khi chế tác mapper đến major/response chúng ta chỉ việc 1 loại code là có thể trả về được hiệu quả tương xứng. Hãy đừng quên trên đây chỉ là 1 cách nhằm về tối ưu code,ko phải là cách phải chăng và công dụng duy nhất.

3. Class gồm nằm trong tính cơ mà không tồn tại method

Nlỗi chúng ta vẫn biết, Class dùng để làm tổ chức triển khai lại những object bao gồm bình thường đặc thù và thể hiện. Nhưng đã thế nào đề xuất bọn họ có một class không có method tốt action làm sao ?

class Personattr_reader: :height, :hair_color, :dominant_hvà, :iq, :racedef initialize(height, hair_color, dominant_h&, iq, race)
height = height
hair_color = hair_color
dominant_h& = dominant_hand
iq = iq
race = raceendendNhư ta thấy, 1 Person có khá nhiều nằm trong tính, cơ mà trong ví dụ trên, 1 Person không còn bao gồm action như thế nào không còn. Vì vậy mà lại, 1 class ko cần là cách tốt duy nhất để diễn tả cho object Person này, cách hay cùng tương xứng rộng là cần sử dụng struct. struct được dùng để làm tạo thành các class dễ dàng cùng được khởi tạo nên một cách đúng mực rộng. Chúng ta có thể chế tác 1 struct như sau:

Struct.new("Person", :height, :hair_color, :dominant_hand, :iq, :race)Hoặc,

Person = Struct.new(:height, :hair_color, :dominant_h&, :iq, :race)Và chúng ta chế tạo 1 object Person nlỗi sau:

phái mạnh = Person.new(170, "black", :right, 140, "asian")Và ở trong tính của nam có thể được truy vấn giống như với cùng 1 class

nam giới.height # 170phái nam.hair_color # "black"nam giới.dominant_h& # :rightnam giới.iq # 140nam giới.race # "asian"Từ nay bạn có thể "khử mùi" code của ta bằng phương pháp sử dụng struct lúc chúng tất cả một object trọn vẹn rất có thể trường đoản cú định nghĩa nó chưa đến những thuộc tính nhưng không tồn tại action giỏi method như thế nào. lưu ý thêm là struct khá hữu ích cho Việc cách xử lý những note-based data structure như menu, tree hay graph.

4. Đặt thương hiệu biến

Hãy đánh tên thay đổi của chúng ta một những phù hợp, họ vẫn nghe thấy vụ việc này cực kỳ không hề ít lần rồi. Trong Lúc x, y, giỏi a , b , c vô cùng nhân thể và đỡ mất công nghĩ thương hiệu tuy vậy để sau đây phát âm lại code của công ty thì chính xác là ác mộng, khiến cho việc gia hạn tốt maintain project khó khăn hơn những.

A = :catB = :dogC = :birdclass Thingattr_reader :xdef initialize(x)
x = xenddef lightbulbif x == A || x == B || x == Cputs "Animal !!"elseputs "Nah !!"endendendVÍ dụ bên trên là biểu thị rõ nhât của việc đánh tên đổi thay cực nhọc gọi. x là gì ? A, B, C là vật gì nhỉ, ai nhưng mà biết được. Cho nên hãy ví dụ vào Việc khắc tên trở thành, cách tiến hành giỏi object, ... Điều này giúp đồng nghiệp của chúng ta có thể gọi được đoạn code đó cũng tương tự dễ cho bọn họ quay về debug rộng.

class Thingattr_reader :typedef initialize(type)
type = typeenddef is_an_animal?if type == :cat || type == :dog || type == :birdputs "Animal !!"elseputs "Nah !!"endendend

5. Trùng lặp code

def post_to_site(data) url = build_url(data) response = RestClient.post(url)enddef get_from_site(data) url = build_url(data) response = RestClient.get(url)enddef delete_from_site(data) url = build_url(data) response = RestClient.delete(url)endQuý khách hàng rất có thể sửa lại đoạn code này bằng một câu lệnh meta-programming đối chọi giản:

def response_from_site(data, method = :get) url = build_url(data) response = RestClient.public_send(method, url)endĐó, thật sạch - tươi mát - dễ nhìn đọc - dễ dàng nắm bắt ()

Túm lại

Qua bài viết này chúng ta đã rất có thể gọi được một trong những phong cách "thối" của code Ruby với phương pháp "khử mùi" cho cái đó. Chỉ đề xuất so sánh và hiểu được cơ phiên bản của đoạn code nhằm chúng ta cũng có thể sửa bọn chúng với biến chuyển code của họ ví dụ rộng và 1 phần cũng cải thiện được phong thái code của bọn họ.