code smell la gi

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

Code Smells (Mã xấu xa, hoặc "Code Thối" nếu như thích) là kể từ được dùng để làm chỉ phần code nhưng mà tớ cảm nhận thấy ko hề ổn định một chút nào. Đây thông thường là đoạn code vi phạm những quy tắc nhập thiết kế. Giả sử các bạn đang được hiểu một nội dung bài viết và phát hiện một lỗi chủ yếu mô tả thì ngay lập tức ngay lập tức, các bạn sẽ đem cảm hứng ngờ ngợ, không dễ chịu. Khi coi code, tớ cũng đều có những phản xạ tương tự động. Lúc cơ, tớ tiếp tục ngửi thấy mùi hương hôi thối của đoạn mã xấu xa.

Code Smells hoàn toàn có thể là vẹn toàn nhân kéo theo tuy nhiên yếu tố hoặc bug sâu sắc rộng lớn, khó khăn lần rộng lớn, và với việc vô hiệu hóa bọn chúng thì tớ hoàn toàn có thể biết code của tất cả chúng ta thật sạch sẽ và tinh xảo rộng lớn. Code Smells thông thường gặp gỡ nhất là class nhiều năm ngùng ngoằng, method quá to tát, code ko sử dụng cho tới hoặc lặp code. Những yếu tố này hoàn toàn có thể sẽ không còn sinh rời khỏi lỗi ngay lập tức ngay lập tức tuy nhiên bọn chúng hoàn toàn có thể khiến cho tất cả chúng ta khó khăn maintain tương tự hoàn toàn có thể tạo ra cả lỗi về sau. Sau phía trên bản thân van lơn thể hiện một vài ba đoạn code thối, bao hàm tuy nhiên đoạn code thừa mứa, ĐK quá nhiều năm, class đem tính chất tuy nhiên không tồn tại công thức và thương hiệu phát triển thành ko hợp lý và phải chăng.

Bạn đang xem: code smell la gi

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

Đoạn pattern if ... return true, else return false xuất hiện nay đặc biệt thật nhiều phen nhập code của tất cả chúng ta. Trả về true hoặc false kể từ câu if là 1 việc khá thừa mứa (xem ví dụ mặt mày dưới). Cách viết lách code như vậy này là ví dụ điển hình nổi bật cho tới việc code quá và điều này tiếp tục kéo theo việc project của tất cả chúng ta bị trị tướng mạo và trở thành khó khăn hiểu rộng lớn. Mình tiếp tục thể hiện nhị cơ hội viết lách code cho tới pattern này, một quãng vừa phải nhiều năm vừa phải quá và một quãng ngắn ngủi gọn gàng, tinh xảo (😄). Đây là 1 hàm nhập class Animal nhằm đánh giá coi nó liệu có phải là con cái mèo hay là không.

class Animal
	attr_reader :type
	
	def initialize(type)
		@type = type
	end

	def is_a_cat?
		if type == "cat"
			return true
		else
			return false
		end
	end
end

Các các bạn đem ngửi thấy mùi hương thum thủm không? ĐIều khiếu nại type == "cat" vốn liếng tiếp tục trả về loại boolean rồi nên tất cả chúng ta không cần thiết phải thêm thắt nó nhập câu ĐK if :

class Animal
	attr_reader :type
	
	def initialize(type)
		@type = type
	end

	def is_a_cat?(animal)
		type == "cat"
	end
end

Yeah, thơm nức rộng lớn rồi cơ. Các các bạn khi sử dụng pattern if ... return true, else return false chỉ việc lưu giữ rằng vô hiệu hóa code quá thì tất cả chúng ta sẽ sở hữu một quãng code sạch sẽ và đẹp mắt và đọc dễ rất là nhiều. Tiếp tục thôi này.

2. Câu ĐK quá dàiiiiiiiiiiiiii

Nhiều khi tất cả chúng ta sẽ rất cần kiểm tra coi phát triển thành của tất cả chúng ta đem vày với 1 trong những thật nhiều options không giống nhau, có nhiều phương pháp để thao tác làm việc này, tuy nhiên một vài cơ hội lại "thối" rất là nhiều đối với những cơ hội còn sót lại.

puts "What is your major?"
major = gets.chomp

case major
when "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!"
else
	puts "That's a cool major!"
end

Cách này vẫn còn đó khá nhiều năm và khó khăn hiểu, demo sử dụng phương pháp này xem:

puts "What is your major?"
major = gets.chomp

# Set mặc định response
major_responses = Hash.new("That's a cool major!")

# Add other responses
major_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_responses[major]

Bằng cơ hội map major với response, tất cả chúng ta tiếp tục có một hash những major với response ứng. Chúng tớ cũng đưa đến 1 độ quý hiếm khoác quyết định nhằm trả về khi môn học tập tớ nhập nhập ko tồn bên trên nhập hash major_responses. Sau khi tạo ra mapper cho tới major/response tất cả chúng ta chỉ việc 1 dòng sản phẩm code là hoàn toàn có thể trả về được thành phẩm ứng. Hãy hãy nhớ là phía trên đơn thuần một cách nhằm tối ưu code,không phải là cơ hội hợp lý và phải chăng và hiệu suất cao nhất.

3. Class đem tính chất tuy nhiên không tồn tại method

Như tất cả chúng ta tiếp tục biết, Class dùng để làm tổ chức triển khai lại những object đem công cộng đặc điểm và biểu thị. Nhưng tiếp tục rời khỏi sao nên tất cả chúng ta có một class không tồn tại method hoặc action này ?

class Person
	attr_reader: :height, :hair_color, :dominant_hand, :iq, :race
	def initialize(height, hair_color, dominant_hand, iq, race)
		@height = height
		@hair_color = hair_color
		@dominant_hand = dominant_hand
		@iq = iq
		@race = race
	end
end

Như tớ thấy, 1 Person có không ít tính chất, tuy nhiên trong ví dụ bên trên, 1 Person ko hề đem action này không còn. Vì thế nhưng mà, 1 class ko cần là cơ hội hoặc nhất nhằm thể hiện nay cho tới object Person này, cơ hội hoặc và thích hợp rộng lớn là sử dụng struct. struct được dùng để làm đưa đến những class đơn giản và giản dị và được khởi tạo ra một cơ hội đúng chuẩn rộng lớn. Chúng tớ hoàn toàn có thể tạo ra 1 struct như sau:

Xem thêm: Tỷ số trực tuyến - Cập nhật liên tục, theo dõi mọi lúc mọi nơi

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

Hoặc,

Person = Struct.new(:height, :hair_color, :dominant_hand, :iq, :race)

Và tất cả chúng ta tạo ra 1 object Person như sau:

nam = Person.new(170, "black", :right, 140, "asian")

Và tính chất của nam hoàn toàn có thể được truy vấn tương tự với cùng một class

nam.height  # 170
nam.hair_color # "black"
nam.dominant_hand # :right
nam.iq # 140
nam.race # "asian"

Từ ni tất cả chúng ta hoàn toàn có thể "khử mùi" code của tớ bằng phương pháp dùng struct khi bọn chúng mang trong mình một object trọn vẹn hoàn toàn có thể tự động khái niệm nó chỉ với những tính chất nhưng mà không tồn tại action hoặc method này. Note thêm thắt là struct khá hữu dụng cho tới việc xử lý những note-based data structure như list, tree hoặc graph.

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

Hãy mệnh danh phát triển thành của công ty một những thích hợp, tất cả chúng ta tiếp tục nghe thấy yếu tố này đặc biệt thật nhiều phen rồi. Trong khi x, y, hoặc a , b , c đặc biệt tiện và hứng tổn thất công nghĩ về thương hiệu tuy nhiên nhằm về sau hiểu lại code của công ty thì thực sự ác mơ, làm cho việc gia hạn hoặc maintain project trở ngại rất là nhiều.

A = :cat
B = :dog
C = :bird

class Thing
	attr_reader :x
	
	def initialize(x)
		@x = x
	end

	def lightbulb
		if x == A || x == B || x == C
			puts "Animal !!"
		else
			puts "Nah !!"
		end
	end
end

VÍ dụ bên trên là biểu thị rõ ràng nhât của việc mệnh danh phát triển thành khó khăn hiểu. x là gì ? A, B, C là vật gì nhỉ, ai nhưng mà hiểu rằng. Cho cho nên hãy rõ rệt trong những việc mệnh danh phát triển thành, công thức hoặc object, ... Vấn đề này canh ty người cùng cơ quan của chúng ta cũng có thể nắm rõ đoạn code này cũng như dễ dàng cho tới tất cả chúng ta trở lại debug rộng lớn.

class Thing
		attr_reader :type
	
		def initialize(type)
			@type = type
		end

	def is_an_animal?
		if type == :cat || type == :dog || type == :bird
			puts "Animal !!"
		else
			puts "Nah !!"
		end
	end
end

5. Trùng lặp code

def post_to_site(data)
  url = build_url(data)
  response = RestClient.post(url)
end

def get_from_site(data)
  url = build_url(data)
  response = RestClient.get(url)
end

def delete_from_site(data)
  url = build_url(data)
  response = RestClient.delete(url)
end

Bạn hoàn toàn có thể sửa lại đoạn code này vày một câu mệnh lệnh meta-programming đơn giản:

Xem thêm: hệ thống kẻ phản diện

def  response_from_site(data, method = :get)
  url = build_url(data)
  response = RestClient.public_send(method, url)
end

Đó, thật sạch sẽ - thơm nức tho - đọc dễ - dễ dàng nắm bắt (😄)

Túm lại

Qua nội dung bài viết này tất cả chúng ta tiếp tục hoàn toàn có thể nắm rõ một vài loại "thối" của code Ruby và cơ hội "khử mùi" cho tới bọn chúng. Chỉ cần thiết phân tách và nắm rõ cơ bạn dạng của đoạn code nhằm tất cả chúng ta hoàn toàn có thể sửa bọn chúng và phát triển thành code của tất cả chúng ta rõ rệt rộng lớn và 1 phần cũng nâng cao được phong thái code của tất cả chúng ta.

nguồn: https://www.codementor.io/ruby-on-rails/tutorial/check-my-code-tips-to-keep-ruby-codes-smell-free