Computer >> Máy Tính >  >> Lập trình >> Ruby

Kỹ thuật tái cấu trúc Ruby:Giới thiệu

Nếu bạn không quen thuộc với thuật ngữ này, tái cấu trúc là hành động cải thiện chất lượng của mã mà không thay đổi chức năng của nó. Điều này sẽ giúp mã của bạn làm việc dễ dàng hơn rất nhiều.

Trong bài đăng này, bạn sẽ học một số kỹ thuật tái cấu trúc Ruby phổ biến

Hãy bắt đầu!

Phương pháp trích xuất

Một trong những cách tái cấu trúc phổ biến nhất là phương pháp được gọi là 'phương pháp trích xuất'. Trong quá trình tái cấu trúc này, bạn di chuyển một số mã từ một phương thức cũ sang một phương thức mới. Điều này sẽ cho phép bạn có các phương thức nhỏ hơn với tên mô tả.

Hãy xem một ví dụ:

@sold_items = %w( onions garlic potatoes )

def print_report
  puts "*** Sales Report for #{Time.new.strftime("%d/%m/%Y")} ***"
  @sold_items.each { |i| puts i }
  puts "*** End of Sales Report ***"
end

Chúng ta có thể bắt đầu bằng cách trích xuất phần xấu nhất của phương pháp này, phần tạo ngày hiện tại.

def print_report
  puts "*** Sales Report for #{current_date} ***"
  @sold_items.each { |i| puts i }
  puts "*** End of Sales Report ***"
end

def current_date
  Time.new.strftime("%d/%m/%Y")
end

Điều này đã đọc tốt hơn, nhưng chúng ta có thể đi xa hơn một chút. Hãy trích xuất một vài phương pháp khác để kết thúc với mã này:

def print_report
  print_header
  print_items
  print_footer
end

def print_header
  puts "*** Sales Report for #{current_date} ***"
end

def current_date
  Time.new.strftime("%d/%m/%Y")
end

def print_items
  @sold_items.each { |i| puts i }
end

def print_footer
  puts "*** End of Sales Report ***"
end

Có, mã này hiện dài hơn, nhưng mã này có dễ đọc hơn không? Đừng sợ các phương pháp nhỏ, chúng tốt cho mã của bạn.

Điều kiện cấu trúc lại

Bạn cũng có thể cấu trúc lại các điều kiện phức tạp thành các phương thức để làm cho chúng dễ đọc hơn.

Ví dụ :

def check_temperature
  if temperature > 30 && (Time.now.hour >= 9 && Time.now.hour <= 17)
    air_conditioner.enable!
  end
end

Phần thứ hai của if này câu lệnh không thể đọc được, vì vậy hãy giải nén nó thành một phương thức:

def check_temperature
  if temperature > 30 && working_hours
    air_conditioner.enable!
  end
end

def working_hours
  Time.now.hour >= 9 && Time.now.hour <= 17
end

Những gì chúng tôi đã làm ở đây là đặt tên mô tả cho tình trạng của chúng tôi, điều này giúp mọi thứ trở nên dễ dàng hơn rất nhiều cho những người đọc mã này trong tương lai (bao gồm cả bạn!).

Thay thế Phương thức bằng Đối tượng Phương thức

Đôi khi bạn có một phương pháp lớn nằm ngoài tầm kiểm soát. Trong trường hợp này, có thể khó cấu trúc lại vì các phương thức lớn có xu hướng có nhiều biến cục bộ. Một giải pháp là sử dụng tái cấu trúc 'Đối tượng Phương thức'.

"Các phương thức lớn là nơi các lớp ẩn đi." - Chú Bob

Hãy xem một ví dụ:

require 'socket'

class MailSender
  def initialize
    @sent_messages = []
  end

  def send_message(msg, recipient = "rubyguides.com")
    raise ArgumentError, "message too small" if msg.size < 5

    formatted_msg = "[New Message] #{msg}"

    TCPSocket.open(recipient, 80) do |socket|
      socket.write(formatted_msg)
    end

    @sent_messages << [msg, recipient]

    puts "Message sent."
  end
end

sender = MailSender.new
sender.send_message("testing")

Để thực hiện tái cấu trúc, chúng ta có thể tạo một lớp mới và thăng cấp các biến cục bộ thành các biến cá thể. Điều này sẽ cho phép chúng tôi cấu trúc lại mã này mà không phải lo lắng về việc chuyển dữ liệu xung quanh.

Chào! Bạn muốn cải thiện kỹ năng Ruby của mình một cách đáng kể? Hãy xem Khóa học Ruby đẹp của tôi 🙂

Đây là MailSender lớp sau khi tái cấu trúc:

class MailSender
  def initialize
    @sent_messages = []
  end

  def deliver_message(message)
    send(message)
    @sent_messages << message
    puts "Message sent."
  end

  def send(msg)
    TCPSocket.open(msg.recipient, 80) { |socket| socket.write(msg.formatted_msg) }
  end
end

Và đây là lớp mới mà chúng tôi đã giới thiệu:

class Message
  attr_reader :msg, :recipient

  def initialize(msg, recipient = "rubyguides.com")
    raise ArgumentError, "message too small" if msg.size < 5

    @msg       = msg
    @recipient = recipient
  end

  def formatted_msg
    "[New Message] #{msg}"
  end
end

sender = MailSender.new
msg    = Message.new("testing")

sender.deliver_message(msg)

Kết luận

Sử dụng các kỹ thuật tái cấu trúc này sẽ giúp bạn tuân thủ Nguyên tắc trách nhiệm duy nhất và giữ cho các lớp và phương pháp của bạn được kiểm soát.

Nếu bạn thích bài viết này, hãy chia sẻ nó với bạn bè của bạn để họ cũng có thể thưởng thức nó 🙂