logo

Đang load dữ liệu

logo devmaster

VIỆN CÔNG NGHỆ VÀ ĐÀO TẠO DEVMASTER

Đào tạo - Phần mềm - Cho thuê nhân sự

  • 0969.609.003
  • 0978.611.889
  • Trang chủ
  • Các khoá đào tạo
    • Chuyên đề WEB - PHP

      • Lập trình web với HTML5 - CSS3- JQuery - Bootstrap - Ajax - [36 giờ]
      • Lập trình web frontend - reactjs - [75 giờ]
      • Lập trình web với mã nguồn mở PHP&MYSQL - PHP FRAMEWORK [126 giờ]

      Chuyên đề Mobile

      • Lập trình Games/Apps trên nền tảng Android - [120 giờ]
      • Lập trình Games/Apps trên nền tảng IOS - [120 giờ]

      Chuyên đề JAVA

      • Ngôn ngữ lập trình hướng đối tượng với java - [40 giờ]
      • Lập trình ứng dụng với java - [100 giờ]
      • Lập trình web site với java framework (JPA, HIBERNATE, SPRING MVC, SPRINGBOOT) - [276 giờ]

      Chuyên đề NETWORK/SECURITY

      • Khoá học Quản trị hạ tầng mạng CCNA v6 - [72 giờ]
      • Khoá học quản trị hệ thống với Windows SERVER 2012- [72 giờ]
      • Chuyên gia bảo mật hệ thống CompTIA + - [110 giờ]

      Chuyên đề .NET

      • Nền tảng lập trình hướng đối tượng với C# - [40 giờ]
      • Lập trình ứng dụng WINDOWS FORM - [100 giờ]
      • Lập trình Web với ASP.NET MVC 5, WebAPI - [145 giờ]

      Chuyên đề khác

      • Ngôn ngũ lập trình C/C++ - [80 giờ]
  • Lập trình cho trẻ em
  • Dịch vụ
    • Đào tạo theo như cầu
    • Cung cấp thiết bị - Phần mềm
    • Tư vấn - Thiết kế mạng hạ tầng
    • Tư vấn - Triển khai dịch vụ mạng
    • Tư vấn - Tư vấn, triển khai giám sát hệ thống
    • Thực tập dự án
  • Lịch khai giảng
  • Tin tức
    • Tin tức và sự kiện
    • Tin hoạt động
    • Tin công nghệ
    • Hội thảo, workshop, Codecam
    • Thông tin việc làm
    • Cẩm nang chia sẻ kiến thức
  • Tiện ích
  • Liên hệ

Tin tức và sự kiện

Apr - 2019

11

Một số kỹ thuật Refactoring phổ biến

Tin tức và sự kiện

Trong quá trình code mình nhận thấy với những hàm được viết quá nhiều dòng, nhất là trong hàm đồng thời thực hiện nhiều chức năng thường gây ra nhiều vấn đề như:

  • Khó kiểm soát, khó tái sử dụng và dễ gây ra bug vì xử lý quá nhiều logic trong hàm
  • Mất nhiều thời gian để review làm ảnh hưởng đến tiến độ của dự án

Ngoài ra còn một số vấn đề nữa như bị comment, bị chê code ngu các kiểu. Và để hạn chế được phần nào những vấn đề trên mình xin giới thiệu tới các bạn 3 kỹ thuật phổ biến thường được sử dụng để tái cấu trúc hàm mà không làm thay đổi hành vi của nó. Hãy cùng theo dõi và vận dụng các bạn nhé. Let’s go!

Kỹ thuật 1: Extract Method

Hiểu nôm na kỹ thuật này là tách các đoạn mã trong một hàm cồng kềnh thành các hàm nhỏ hơn chỉ thực hiện một chức năng các bạn nhé.

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 { |item| puts item }
  puts "*** End of Sales Report ***"
end

Chúng ta có thể tách phần xử lý ngày hiện tại thành một hàm riêng như sau:

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

Bây giờ có vẻ đã dễ đọc hơn, nhưng chúng ta có thể tách thêm một số hàm nữa thử xem nhé:

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ó vẻ là dài hơn, nhưng mà các hàm nó tường minh nhìn dễ đọc hơn đúng không các bạn.

Kỹ thuật 2: Refactoring Conditionals

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.

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

Bạn có thấy quen với cách đặt điều kiện thế này không?

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

Dễ thấy phần thứ 2 của điều kiện if không phải là dễ đọc, vì vậy chúng ta nên tách nó thành một phương thức nhé:

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

Dễ dàng để đọc hơn rồi đúng không. Điều này làm cho mọi thứ dễ dàng hơn nhiều đối với những người đọc mã này trong tương lai.

 

Kỹ thuật 3: Replace Method with Method Object

Đôi khi bạn có một phương thức lớn vượt khỏi tầm kiểm soát. Trong trường hợp này có thể khó tái cấu trúc vì các phương thức lớn có xu hướng có nhiều biến cục bộ (local variables). Một giải pháp là sử dụng kỹ thuật tái cấu trúc Method Object.

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

require 'socket'
 
class MailSender
  def initialize
    @sent_messages = []
  end
  
  def send_message(msg, recipient = "sample@email.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
    
    @send_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à chuyển các biến cục bộ (local variables) thành các biến đối tượng (instance variables). Điều này giúp chúng ta tái cấu trúc thêm mã này mà không phải lo lắng về việc truyền dữ liệu.

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

class MailSender
  def initialize
    @sent_messages = []
  end
  
  def deliver_message(message)
    send(message)
    @send_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 ta định nghĩa:

class Message
  attr_reader :msg, :recipient
  
  def initialize
    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)

Nhìn clear hẵn đúng không các bạn.

Phần kết luận

Trên đây chỉ là 3 trong số rất nhiều kỹ thuật để tái cấu trúc mã. Sử dụng các kỹ thuật này sẽ giúp bạn tuân thủ nguyên tắc Single Responibility Principle và giữ cho các lớp và phương thức của bạn luôn trong tầm 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ó nhé!

Nguồn bài viết: Introduction to Refactoring

Nguồn: Sưu tầm từ internet via viblo

Các bài viết cùng chủ đề

KHÓA HỌC LẬP TRÌNH #FULLSTACK TẠI #DEVMASTER – LỘ TRÌNH TOÀN DIỆN TỪ CƠ BẢN ĐẾN CHUYÊN NGHIỆP
KHÓA HỌC LẬP TRÌNH #FULLSTACK TẠI #DEVMASTER – LỘ ...
🔟 Buổi hướng dẫn đồ án
🔟 Buổi hướng dẫn đồ án
KHÉP LẠI MỘT HÀNH TRÌNH
KHÉP LẠI MỘT HÀNH TRÌNH
Tưng bừng ưu đãi khóa học lập trình fullstack với công nghệ JavaSpringBoot
Tưng bừng ưu đãi khóa học lập trình fullstack với ...
Devmaster- Thông báo khai giảng khóa học lập trình cung chuyên gia tháng 8-2023
Devmaster- Thông báo khai giảng khóa học lập trình...
Khóa học lập trình ReactJs khai giảng tháng 7 - 2023 tại devmaster
Khóa học lập trình ReactJs khai giảng tháng 7 - 20...

Các khóa đào tạo chuyên đề

Thiết kế và lập trình Website PHP, Laravel chuyên nghiệp - FullStack
Thiết kế và lập trình Website PHP, Laravel chuyên nghiệp - FullStack
Lập trình ứng dụng trên nền tảng android Lập trình ứng dụng trên nền tảng android
Lập trình Ứng dụng với Công nghệ ASP.NET Core MVC, WebAPI, ReactJS - FullStack

Lập trình Ứng dụng với Công nghệ ASP.NET Core MVC, WebAPI, ReactJS - FullStack
Lập trình ứng dụng với WINDOWS FORM Lập trình ứng dụng với WINDOWS FORM
Lập trình ứng dụng với JAVA (FORM) Lập trình ứng dụng với JAVA (FORM)
Thiết kế và lập trình Ứng dụng với công nghệ Java (Java Framework springBoot, hibernate,...) - FullStack
Thiết kế và lập trình Ứng dụng với công nghệ Java (Java Framework springBoot, hibernate,...) - FullStack
Thiết kế và lập trình website với công nghệ HTML5, CSS3, Javascript, Bootstrapt 4, Jquery Thiết kế và lập trình website với công nghệ HTML5, CSS3, Javascript, Bootstrapt 4, Jquery
Lập trình frontend với reacjs (Full) Lập trình frontend với reacjs (Full)
Viện Công Nghệ Và Đào Tạo Devmaster

DEVMASTER ACADEMY

Địa chỉ: Tầng 6 - Tòa nhà VIỆN CÔNG NGHỆ
Số 25, Vũ Ngọc Phan - Láng Hạ - Đống Đa - Hà Nội

Hotline: 0969 609 003 | 0978 611 889

devmaster.contact@gmail.com

hna.tvchung@gmail.com

CÁC KHÓA HỌC CHUYÊN ĐỀ

  • Thiết kế và lập trình Website PHP, Laravel chuyên nghiệp - FullStack
  • Lập trình ứng dụng trên nền tảng android
  • Lập trình Ứng dụng với Công nghệ ASP.NET Core MVC, WebAPI, ReactJS - FullStack
  • Lập trình ứng dụng với WINDOWS FORM
  • Lập trình ứng dụng với JAVA (FORM)
  • Thiết kế và lập trình Ứng dụng với công nghệ Java (Java Framework springBoot, hibernate,...) - FullStack
  • Thiết kế và lập trình website với công nghệ HTML5, CSS3, Javascript, Bootstrapt 4, Jquery
  • Lập trình frontend với reacjs (Full)
Viện Công Nghệ Và Đào Tạo Devmaster

VIỆN CÔNG NGHỆ VÀ ĐÀO TẠO DEVMASTER - Học thực tế * Làm thực tế * Cam kết việc làm
Copyright by Ⓒ DEVMASTER 2015