Duck Typing là gì?

Duck typing là gì

  • Duck typing là 1 tính năng đặc trưng của 1 số ngôn ngữ động (dynamic language) như Ruby, Python, ...

  • Tên gọi bắt nguồn từ duck test với tư tưởng:
    "If it walks like a duck and quacks like a duck, it must be a duck".
    Nôm na là nếu ta thấy 1 con chó lại biết bơi như con vịt thì hẳn đấy là con vịt

  • Nó làm cho việc hướng đối tượng trở nên uyển chuyển và linh hoạt hơn bằng cách xem object có cài gì và có thể làm gì để quyết định hành vi của nó, hơn là tường minh rõ loại đối tượng nào với việc kế thừa từ 1 class hoặc implement từ 1 interface.

  • Hãy cùng xét đến ví dụ để hiểu rõ hơn:

def test(foo)
  puts foo.sound
end

class Animal
  def sound
    'foo'
  end
end
 
class Duck
  def sound
   'quack'
  end
end
 
class Cat
  def sound
    'meow'
  end
end

class Dog < Animal
  def sound
    'barf'
  end
end

class Fish 
  def swim
    'swim'
  end 
end

test(Duck.new) # quack
test(Cat.new)  # meow
test(Dog.new)  # barf
Test(Fish.new) # NoMethodError: undefined method `sound' for #<Fish:0x007fbed3070438>
  • Có thể thấy với hàm test dù với Duck, Cat, Dog là 3 đối tượng hoàn toàn khác nhau nhưng vẫn hoạt động bình thường. Ngược lại với Fish, do không biết sound nên đã xảy ra lỗi.

Lưu ý

  • Duck typing khiến dynamic language trở nên linh hoạt trong việc đa hình và trừu tượng hoá để phù hợp tính chất lập trình hướng đối tượng
  • Do các function với các tham số không định kiểu tường minh có thể dẫn đến những đoạn code trở nên khó hiểu, đặc biết là đối với dự án nhiều người tham gia.