Viblo Code
+2

[Có thể bạn chưa biết?] Một vài cách viết ngắn gọn trong Ruby on Rails (phần 2)

Tiếp nối phần 1, mình sẽ tiếp tục mang đến những cách viết ngắn gọn trong Ruby on Rails cho các bạn trong post này. Lên đường nàoooo!

Nối String với "# {}" thay vì "+"

"Hello, " + user.name + "!"

Nhìn đẹp hơn rồi nhỉ ^^

"Hello, #{user.name}!"

String với nhiều dòng

Cái này khá hay ho và đẹp mắt, thay vì dùng \n để xuống dòng

text = "Hello, world!\nGood-bye, world!"

Chúng ta có thể viết như thế này nè

text = <<-TEXT
Hello, world!
Good-bye, world!
TEXT

Cố định hằng số với String

Dù hằng số được khai báo là một chuỗi ký tự, một mảng hay một hash, thì cũng cần cố định giá trị của nó (đúng như ý nghĩa của hằng số là bất biến), không nên thay đôi hằng số

CONTACT_PHONE_NUMBER = "03-1234-5678"
CONTACT_PHONE_NUMBER << "@#$%^"
puts CONTACT_PHONE_NUMBER # => [email protected]#$%^

Cố định với freeze

CONTACT_PHONE_NUMBER = "03-1234-5678".freeze
CONTACT_PHONE_NUMBER << "@#$%^" # => RuntimeError: can't modify frozen String

Với mảng

ADMIN_NAMES = ["Tom", "Alice"]
ADMIN_NAMES << "Taro"
ADMIN_NAMES[0].downcase!
puts ADMIN_NAMES # => ["tom", "Alice"]
ADMIN_NAMES = ["Tom", "Alice"].freeze.each(&:freeze)
ADMIN_NAMES << "Taro" # => RuntimeError: can't modify frozen Array
ADMIN_NAMES[0].downcase! # => RuntimeError: can't modify frozen String

Với Số nguyên

Thực ra, vì số nguyên (FixNum) không thể thay đổi, nó không quan trọng nếu bạn không đóng băng nó =)))

# Không có lỗi và cũng không có ý nghĩa (yaoming)
ITEM_LIMIT = 500.freeze

Khi khởi tạo array hay hash, có thể (nên) giữ dấu "," ở phần tử cuối cùng

countries = [
  :japan,
  :italy,
  :uk
]

capitals = {
  japan: 'Tokyo',
  italy: 'Rome',
  uk: 'London'
}
countries = [
  :japan,
  :italy,
  :uk,
]

capitals = {
  japan: 'Tokyo',
  italy: 'Rome',
  uk: 'London',
}

Tại sao mình khuyên các bạn nên giữ dấu "," vào phần tử cuối cùng khi code, vì sẽ có trường hợp các phần tử được thêm vào trong tương lai, khi đó chúng ta không cần phải sửa đổi dòng trước đó, có thể tiết kiệm cho bạn 1 chút thời gian. Ngoài ra, nếu bạn thêm dấu phẩy vào tất cả các phần tử, bạn cũng có thể sửa đổi thứ tự của các phần tử bằng cách cắt và dán đơn giản mà không phải lo lắng gì cả.

Khi tạo mảng, hãy sử dụng %w(),%i() thay vì []

Cách viết này khá ngắn gọn và nhìn code đẹp + pro hơn xíu xíu đó 😄

actions = ['index', 'new', 'create']
actions = %w(index new create) # => ['index', 'new', 'create']
actions = %i(index new create) # => [:index, :new, :create]

Khi xử lý mảng theo thứ tự, hãy sử dụng "&: method" thay vì "object.method"

names = users.map{|user| user.name }
names = users.map(&:name)

Ngoài map mình lấy ví dụ ở trên, thì các phương thức như each, select ... cũng có cách viết tương tự.

Phân biệt giữa nil và array

Cách này khá thú vị, nếu Array () (Kernel # Array) được sử dụng, có thể loại bỏ việc check là array hay không để xử lý

if users
  users.each{|user| send_direct_mail(user)}
end 

Cách này Awesome hơn rất nhiều phải không? ^^

Array(users).each{|user| send_direct_mail(user)}

Trước khi biết method Array() mình cũng đã từng viết 1 kiểu như thế này, khá dài dòng và xấu

users = users || []
users.each{|user| send_direct_mail(user)}

Khi khai báo một số lớn, hãy đặt "_" để dễ đọc hơn

ITEM_LIMIT = 1000000000
ITEM_LIMIT = 1_000_000_000

Thay vì định nghĩa 1 method đơn giản hay sử dụng attr_reader

class Person
  def initialize
    @name = "No name"
  end

  def name
    @name
  end
end
class Person
  attr_reader :name

  def initialize
    @name = "No name"
  end

  # いらない
  # def name
  #   @name
  # end
end

Sử dụng * (splat) thay vì + để ghép các mảng

numbers = [1, 2, 3]
numbers_with_zero_and_100 = [0] + numbers + [100] # => [0, 1, 2, 3, 100]
numbers = [1, 2, 3]
numbers_with_zero_and_100 = [0, *numbers, 100] # => [0, 1, 2, 3, 100]

Nếu không sử dụng * thì sẽ hiểu numbers như 1 phần tử

[0, numbers, 100] # => [0, [1, 2, 3], 100]

Sử dụng symbol thay vì string cho các key trong hash

# Sử dụng string cho key
currencies = { 'japan' => 'yen', 'america' => 'dollar', 'italy' => 'euro' } 
currencies['japan'] # => 'yen'
# Sử dụng symbol cho key
currencies = { japan: 'yen', america: 'dollar', italy: 'euro' } 
currencies[:japan] # => 'yen'

Việc sử dụng symbol có những ưu điểm sau:

  • Có thể được viết bằng một chữ ngắn gọn như {key: value}.
  • Nhanh hơn khi dùng key bằng string
  • Hiệu quả sử dụng bộ nhớ tốt hơn string

Để tìm hiểu sâu về vấn đề này các bạn có thể tham khảo ở đây Why use symbols as hash keys in Ruby? - Stack Overflow. Khá là thú vị.

Ôi mỏi tay quá, post này mình tạm dừng ở đây nhaaaa (seeyou)


All Rights Reserved