Code Smell Là Gì

     

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

*
Code Smells (Mã xấu, hay "Code Thối" giả dụ thích) là từ được dùng làm chỉ phần code mà lại ta cảm thấy không hề ổn chút nào. Đây hay là đoạn code phạm luật những phép tắc trong lập trình. Trả sử ai đang đọc một nội dung bài viết và bắt gặp một lỗi chủ yếu tả thì ngay lập tức lập tức, bạn sẽ có cảm xúc ngờ ngợ, nặng nề chịu. Lúc chứng kiến tận mắt code, ta cũng đều có những phản nghịch ứng tương tự. Cơ hội đó, ta đã ngửi thấy mùi khó chịu thối của đoạn mã xấu.

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

Code Smells hoàn toàn có thể là tại sao dẫn cho nhưng sự việc hay bug sâu hơn, nặng nề tìm hơn, với với việc loại trừ chúng thì ta hoàn toàn có thể biết code của bọn họ sạch sẽ và sắc sảo hơn. Code Smells thường gặp mặt nhất là class lâu năm loằng ngoằng, method quá to, code ko sử dụng đến tuyệt lặp code. Những vấn đề này có thể sẽ không sinh ra lỗi ngay chớp nhoáng nhưng chúng rất có thể khiến chúng ta khó maintain cũng như có thể gây ra cả lỗi về sau. Dưới đây mình xin đề xuất một vài đoạn code thối, bao hàm nhưng đoạn code quá thãi, điều kiện quá dài, class tất cả thuộc tính nhưng không có phương thức cùng tên biến không phù 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 rất rất nhiều lần vào code của chúng ta. Trả về true hoặc false từ bỏ câu if là 1 việc hơi thừa thãi (xem ví dụ mặt dưới). Phương pháp viết code như thế này là ví dụ điển hình nổi bật cho việc code quá và điều này sẽ dẫn đến sự việc project của họ bị vạc tướng với trở phải khó phát âm hơn. Mình sẽ đưa ra hai cách viết code đến pattern này, một quãng vừa nhiều năm vừa thừa cùng một đoạn ngắn gọn, tinh tế và sắc sảo (). Đây là một trong hàm vào class Animal để soát sổ xem nó liệu có phải là con mèo tuyệt không.

class Animalattr_reader :typedef initialize(type)
type = typeenddef is_a_cat?if type == "cat"return trueelsereturn falseendendendCác các bạn có ngửi thấy hương thơm thum thủm không? ĐIều kiện type == "cat" vốn vẫn trả về hình trạng boolean rồi nên bọn họ không rất cần 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 hơn rồi đó. Chúng ta khi sử dụng pattern if ... Return true, else return false chỉ việc nhớ rằng đào thải code thừa thì bọn họ sẽ bao gồm một đoạn code sạch đẹp và đọc dễ dàng hơn nhiều. Tiếp tục thôi nào.

2. Câu điều kiện quá dàiiiiiiiiiiiiii

Nhiều lúc chúng ta sẽ phải kiểm tra xem vươn lên là của họ có bởi với một trong rất nhiều options không giống nhau, có khá nhiều cách để làm câu hỏi này, nhưng một trong những cách lại "thối" hơn các so với những cách còn lại.

Xem thêm: Tin Học 10 Bài 21: Mạng Thông Tin Toàn Cầu Internet, Lý Thuyết Hay, Ngắn Gọn

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 đấy khá dài và cạnh tranh đọc, thử biện pháp này xem:

puts "What is your major?"major = gets.chomp# Set default responsemajor_responses = Hash.new("That"s a cool major!")# địa chỉ 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 map major với response, chúng ta đã có 1 hash những major cùng với response tương ứng. Chúng ta cũng tạo thành 1 quý hiếm mặc định để trả về khi môn học tập ta nhập vào không tồn tại trong hash major_responses. Sau khi tạo mapper đến major/response họ chỉ bắt buộc 1 cái code là rất có thể trả về đc hiệu quả tương ứng. Nhớ là đây chỉ là 1 cách để tối ưu code,không phải là cách phù hợp và kết quả nhất.

3. Class có thuộc tính nhưng không có method

Như bọn họ đã biết, Class dùng để làm tổ chức lại những object có chung đặc thù và biểu hiện. Nhưng lại sẽ ra sao nên bọn họ có 1 class không có method hay action nào ?

class Personattr_reader: :height, :hair_color, :dominant_hand, :iq, :racedef initialize(height, hair_color, dominant_hand, iq, race)
height = height
hair_color = hair_color
dominant_hand = dominant_hand
iq = iq
race = raceendendNhư ta thấy, 1 Person có rất nhiều thuộc tính, cơ mà trong ví dụ trên, 1 Person không còn có action nào hết. Vì vậy mà, 1 class ko cần là cách hay tuyệt nhất để biểu đạt cho object Person này, phương pháp hay và tương xứng hơn là cần sử dụng struct. Struct được dùng để tạo ra các class đơn giản và được khởi sinh sản một cách đúng chuẩn hơn. Chúng ta có thể tạo 1 struct như sau:

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

Person = Struct.new(:height, :hair_color, :dominant_hand, :iq, :race)Và họ tạo 1 object Person như sau:

nam = Person.new(170, "black", :right, 140, "asian")Và trực thuộc tính của nam có thể được truy tìm cập hệt như với 1 class

nam.height # 170nam.hair_color # "black"nam.dominant_hand # :rightnam.iq # 140nam.race # "asian"Từ nay bạn cũng có thể "khử mùi" code của ta bằng cách sử dụng struct khi chúng có một object trả toàn rất có thể tự tư tưởng nó chỉ với những thuộc tính mà không tồn tại action tốt method nào. Chú ý thêm là struct khá có lợi cho câu hỏi xử lý những note-based data structure như list, tree tốt graph.

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

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

Xem thêm: Vật Nào Sau Đây Cấu Tạo Từ Tế Bào : A, Vật Nào Sau Đây Có Cấu Tạo Từ Tế Bào

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

5. đụng hàng 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)endBạn rất 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 bài viết này họ đã hoàn toàn có thể hiểu đc một số vẻ bên ngoài "thối" của code Ruby và phương pháp "khử mùi" cho chúng. Chỉ việc phân tích và hiểu được cơ bản của đoạn code để chúng ta có thể sửa chúng và biến đổi code của họ rõ ràng rộng và 1 phần cũng nâng cấp đc phong thái code của chúng ta.