CODE SMELL LÀ GÌ

  -  

Code tân hận là đồ vật gi vậy ?

*
Code Smells (Mã xấu, tuyệt "Code Thối" nếu thích) là từ được dùng để làm chỉ phần code mà ta Cảm Xúc không còn ổn định 1 chút nào. Đây thường xuyên là đoạn code vi phạm đều quy tắc vào xây dựng. Giả sử ai đang gọi một nội dung bài viết và bắt gặp một lỗi bao gồm tả thì tức thì chớp nhoáng, các bạn sẽ gồm cảm xúc ngờ ngợ, giận dữ. khi coi code, ta cũng đều có phần lớn bội nghịch ứng giống như. Lúc đó, ta sẽ ngửi thấy mùi khó chịu tăn năn của đoạn mã xấu.

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

Code Smells hoàn toàn có thể là nguyên nhân dẫn cho nhưng vụ việc tốt bug sâu hơn, nặng nề search rộng, với với Việc loại trừ chúng thì ta hoàn toàn có thể biết code của chúng ta thật sạch với tinh tế rộng. Code Smells hay gặp mặt độc nhất vô nhị là class nhiều năm loằng ngoằng, method quá to, code ko dùng mang lại tốt lặp code. Những vụ việc này hoàn toàn có thể sẽ không còn có mặt lỗi ngay mau chóng dẫu vậy chúng rất có thể khiến cho họ khó maintain cũng như rất có thể gây nên cả lỗi trong tương lai. Sau phía trên mình xin giới thiệu một vài đoạn code tăn năn, bao hàm tuy vậy đoạn code quá thãi, ĐK quá dài, class tất cả trực thuộc tính tuy vậy không tồn tại thủ tục với tên trở thành không hợp lý.

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

Đoạn pattern if ... return true, else return false xuất hiện thêm hết sức tương đối nhiều lần trong code của họ. Trả về true hoặc false trường đoản cú câu if là 1 trong những bài toán khá vượt thãi (xem ví dụ mặt dưới). Cách viết code như vậy này là ví dụ nổi bật mang lại vấn đề code vượt với điều này đã dẫn đến việc project của họ bị phân phát tướng với trsống đề xuất nặng nề gọi hơn. Mình đang đưa ra hai biện pháp viết code đến pattern này, một đoạn vừa lâu năm vừa quá cùng một quãng nlắp gọn gàng, tinh tế và sắc sảo (). Đây là 1 trong những hàm trong class Animal nhằm kiểm tra coi nó có phải là bé 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 thum thủm không? ĐIều khiếu nại type == "cat" vốn đang trả về thứ hạng boolean rồi bắt buộc chúng ta không cần thiết phải thêm nó vào câu điều kiện if :

class Animalattr_reader :typedef initialize(type)
type = typeenddef is_a_cat?(animal)type == "cat"endendYeah, thơm rộng rồi đó. Các chúng ta khi sử dụng pattern if ... return true, else return false chỉ cần nhớ là vứt bỏ code vượt thì họ sẽ có được một quãng code sạch đẹp và đọc dễ hơn những. Tiếp tục thôi nào.

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

Nhiều lúc bọn họ đang phải kiểm tra coi trở nên của bọn họ bao gồm bởi cùng với 1 trong các không hề ít options khác biệt, có tương đối nhiều phương pháp để làm việc này, tuy thế một trong những giải pháp lại "thối" hơn các đối với các biện pháp sót lại.

Xem thêm: Từ Điển Anh Việt " Transcribe Là Gì Bình Luận Về Transcribe Có Nghĩa Là Gì

puts "What is your major?"major = gets.chompcase majorwhen "Biology"puts "Mmilimet 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 tồn tại tương đối dài cùng khó phát âm, demo bí quyết 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 biện pháp maps major cùng với response, chúng ta đã có một hash những major cùng với response tương ứng. Chúng ta cũng tạo ra 1 giá trị mặc định để trả về lúc môn học ta nhtràn vào ko vĩnh cửu vào hash major_responses. Sau khi sản xuất mapper đến major/response chúng ta chỉ việc 1 cái code là hoàn toàn có thể trả về được kết quả khớp ứng. Hãy hãy nhờ rằng đây chỉ là một cách nhằm buổi tối ưu code,không phải là bí quyết hợp lí cùng kết quả tuyệt nhất.

3. Class tất cả nằm trong tính nhưng không có method

Như chúng ta vẫn biết, Class dùng để làm tổ chức triển khai lại những object có phổ biến đặc thù và bộc lộ. Nhưng đang như thế nào phải bọn họ có một class không tồn tại method hay action như thế nào ?

class Personattr_reader: :height, :hair_color, :dominant_hvà, :iq, :racedef initialize(height, hair_color, dominant_hvà, iq, race)
height = height
hair_color = hair_color
dominant_hvà = dominant_hand
iq = iq
race = raceendendNlỗi ta thấy, 1 Person có nhiều ở trong tính, dẫu vậy trong ví dụ trên, 1 Person không thể gồm action như thế nào không còn. Vì vậy cơ mà, 1 class ko bắt buộc là biện pháp hay độc nhất nhằm mô tả đến object Person này, bí quyết giỏi với cân xứng hơn là dùng struct. struct được dùng để tạo thành các class đơn giản dễ dàng với được khởi tạo ra một phương pháp đúng mực hơn. 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_hvà, :iq, :race)Và bọn họ tạo thành 1 object Person nhỏng sau:

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

phái nam.height # 170phái nam.hair_color # "black"phái mạnh.dominant_hvà # :rightnam.iq # 140nam.race # "asian"Từ nay bạn cũng có thể "khử mùi" code của ta bằng phương pháp áp dụng struct Lúc chúng bao gồm một object hoàn toàn hoàn toàn có thể từ bỏ khái niệm nó chỉ với các thuộc tính mà không tồn tại action tuyệt method nào. Note thêm là struct hơi bổ ích đến bài toán cách xử trí những note-based data structure nlỗi menu, tree tốt graph.

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

Hãy viết tên đổi mới của bạn một các phù hợp, họ sẽ nghe thấy vấn đề này vô cùng không hề ít lần rồi. Trong khi x, y, tuyệt a , b , c vô cùng tiện thể và đỡ mất công suy nghĩ tên tuy nhiên nhằm sau đây đọc lại code của chúng ta thì chính xác là ác mộng, để cho Việc duy trì tuyệt maintain project khó khăn hơn nhiều.

A = :catB = :dogC = :birdclass Thingattr_reader :xdef initialize(x)
x = xenddef lightbulbif x == A || x == B || x == Cputs "Animal !!"elseputs "Nah !!"endendendVÍ dụ trên là biểu thị rõ nhât của bài toán đặt tên biến chuyển cạnh tranh phát âm. x là gì ? A, B, C là cái gì nhỉ, ai mà biết được. Cho cho nên hãy rõ ràng vào bài toán đặt tên biến chuyển, cách thức hay object, ... Như vậy góp người cùng cơ quan của chúng ta có thể hiểu được đoạn code đó cũng tương tự dễ dàng mang lại chúng ta quay về debug rộng.

Xem thêm: 18 Free And Cheap Things To Do In Singapore Tours & Vacation Packages 2022/2023

class Thingattr_reader :typedef initialize(type)
type = typeenddef is_an_animal?if type == :mèo || 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 có thể sửa lại đoạn code này bởi 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Đó, sạch sẽ - thơm mát - dễ nhìn đọc - dễ dàng nắm bắt ()

Túm lại

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