Code smell là gì

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

*
Code Smells (Mã xấu, tuyệt "Code Thối" nếu như thích) là từ bỏ được dùng để làm chỉ phần code cơ mà ta cảm giác không thể ổn định chút nào. Đây thường là đoạn code phạm luật đầy đủ luật lệ trong lập trình sẵn. Giả sử bạn đang phát âm một bài viết cùng phát hiện một lỗi thiết yếu tả thì ngay lập tức nhanh chóng, các bạn sẽ bao gồm cảm giác ngờ ngợ, khó chịu. Khi coi code, ta cũng có thể có đa số phản bội ứng tương tự như. Lúc đó, ta đã ngửi thấy mùi hôi thối của đoạn mã xấu.

You watching: Code smell là gì

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

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

Đoạn pattern if ... return true, else return false mở ra khôn cùng không ít lần vào code của chúng ta. Trả về true hoặc false trường đoản cú câu if là một việc tương đối thừa thãi (coi ví dụ mặt 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 vấn đề code vượt với điều đó đã dẫn đến sự việc project của họ bị vạc tướng mạo cùng trở bắt buộc cực nhọc hiểu hơn. Mình vẫn chỉ dẫn hai bí quyết viết code đến pattern này, một quãng vừa dài vừa quá và một đoạn nđính gọn, tinh tế (). Đây là một hàm trong class Animal để chất vấn xem 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 tất cả ngửi thấy mùi thum thủm không? ĐIều khiếu nại type == "cat" vốn vẫn trả về dạng hình boolean rồi đề xuất 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 kia. Các bạn khi dùng pattern if ... return true, else return false chỉ việc nhớ là loại trừ code quá thì bọn họ sẽ có một đoạn code sạch đẹp và dễ đọc rộng những. Tiếp tục thôi làm sao.

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

phần lớn lúc chúng ta đã đề nghị kiểm tra coi biến hóa của họ bao gồm bằng với một trong các tương đối nhiều options khác nhau, có khá nhiều phương pháp để thao tác làm việc này, dẫu vậy một vài giải pháp lại "thối" rộng những đối với các bí quyết sót lại.

See more: Cách Nhận Code Chiến Dịch Huyền Thoại ? Cách Nhận Code Chiến Cơ Huyền Thoại

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 tồn tại tương đối lâu năm cùng cực nhọc gọi, demo giải 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"> = "Mmilimet 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 giải pháp map major với response, bọn họ đã có 1 hash những major với response tương ứng. Chúng ta cũng tạo ra 1 cực hiếm mang định nhằm trả về Khi môn học ta nhtràn vào không mãi mãi trong hash major_responses. Sau lúc chế tác mapper mang đến major/response chúng ta chỉ việc 1 dòng code là rất có thể trả về đc hiệu quả tương ứng. Hãy đừng quên đây chỉ cần một cách nhằm tối ưu code,không phải là bí quyết hợp lý với hiệu quả độc nhất.

3. Class gồm ở trong tính dẫu vậy không tồn tại method

Nlỗi họ đã biết, Class dùng để làm tổ chức triển khai lại những object bao gồm thông thường đặc thù cùng thể hiện. Nhưng đang ra sao yêu cầu chúng ta có 1 class không tồn tại method giỏi action làm sao ?

class Personattr_reader: :height, :hair_color, :dominant_hand, :iq, :racedef initialize(height, hair_color, dominant_hvà, iq, race)
height = height
hair_color = hair_color
dominant_h& = dominant_hand
iq = iq
race = raceendendNlỗi ta thấy, 1 Person có không ít ở trong tính, tuy nhiên vào ví dụ bên trên, 1 Person không còn bao gồm action như thế nào không còn. Vì vắt mà lại, 1 class ko phải là giải pháp tuyệt duy nhất nhằm biểu đạt mang đến object Person này, biện pháp tuyệt cùng phù hợp hơn là dùng struct. struct được dùng để làm tạo ra các class đơn giản và được khởi tạo nên một phương pháp đúng mực hơn. Chúng ta hoàn toàn có thể sinh sản 1 struct nhỏng sau:

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

Person = Struct.new(:height, :hair_color, :dominant_hand, :iq, :race)Và chúng ta chế tạo 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 y hệt như với cùng một class

nam.height # 170phái nam.hair_color # "black"nam.dominant_hvà # :rightphái nam.iq # 140phái nam.race # "asian"Từ ni bạn cũng có thể "khử mùi" code của ta bằng cách áp dụng struct Lúc bọn chúng tất cả một object hoàn toàn hoàn toàn có thể tự có mang nó chưa đến các thuộc tính nhưng không tồn tại action xuất xắc method nào. Note thêm là struct khá hữu dụng mang đến Việc xử trí các note-based data structure nhỏng menu, tree giỏi graph.

4. Đặt tên biến

Hãy khắc tên thay đổi của doanh nghiệp một những cân xứng, bọn họ sẽ nghe thấy vấn đề này rất không ít lần rồi. Trong lúc x, y, giỏi a , b , c rất nhân thể với đỡ mất công nghĩ về thương hiệu mà lại nhằm sau này đọc lại code của khách hàng thì chính xác là ác mộng, làm cho bài toán gia hạn xuất xắc 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ụ trên là thể hiện rõ nhât của vấn đề đặt tên trở nên cực nhọc phát âm. x là gì ? A, B, C là đồ vật gi rò rỉ, ai mà lại hiểu rằng. Cho nên hãy rõ ràng trong Việc khắc tên biến hóa, phương thức giỏi object, ... Vấn đề này giúp người cùng cơ quan của chúng ta có thể hiểu được đoạn code kia tương tự như dễ dàng đến họ quay về debug hơn.

See more: Federal Rules Of Civil Procedure 2015, Code Of Civil Procedure

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 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 - thơm tho - dễ nhìn đọc - dễ dàng nắm bắt ()

Túm lại

Qua bài viết này họ sẽ hoàn toàn có thể phát âm được một vài kiểu dáng "thối" của code Ruby với cách "khử mùi" cho cái đó. Chỉ đề nghị phân tích và hiểu được cơ bản của đoạn code nhằm chúng ta có thể sửa chúng với đổi thay code của bọn họ ví dụ hơn cùng 1 phần cũng nâng cao đc phong cách code của chúng ta.


Chuyên mục: giftcode