Duck typing? Tôi bơi như vịt, nên tôi là con vịt!

Duck typing? Tôi bơi như vịt, nên tôi là con vịt!

·

3 min read

Là dân học lập trình, bạn đã từng nghe nói đến khái niệm Duck typing chưa?

If it looks like a duck, swims like a duck, and quack likes a duck, then it probably is a duck.

Mình mạn phép tạm dịch như sau.

Nếu nó trông giống một con vịt, bơi như một con vịt, kêu như một con vịt, thì nó là một con vịt.

Ơ thế câu trên chả thấy liên quan gì tới lập trình cả, hẳn là bạn nghĩ thế. Đừng vội, hãy cứ xem tiếp bài viết đã nhé.

Dynamic typing và duck typing

Các ngôn ngữ lập trình hiện nay được chia làm 2 loại chính:

  • Static typing: Kiểu dữ liệu cần xác định khi biên dịch. Và thường không được thay đổi kiểu dữ liệu.
  • Dynamic typing: Kiểu dữ liệu chỉ xác định khi chạy chương trình.

Duck typing là khái niệm trong dynamic typing language.

Nếu bình thường, để gọi một phương thức từ object, cần xác định rõ object đó là class nào. Ví dụ có object animal, thì phải xác định object đó phải thuộc class Duck thì mới gọi được method quack().

Còn với duck typing, chúng ta không cần quan tâm đến con vật đó là class nào. Chỉ cần animal đó chứa phương thức quack() là luôn gọi được.

Như ví dụ bên trên, nếu con dog mà cũng kêu như con vịt thì nó cũng xem là con vịt (trong ngữ cảnh quack).

Ví dụ code nhé

Ngôn ngữ có duck typing ví dụ như JavaScript, Python,... Ở đây mình chọn JavaScript nhé.

// Vịt thì biết kêu
const duck = {
    quack() {
        console.log('I am a duck, quack quack');
    }
}

// Ví dụ chó cũng kêu được như vịt
const dog = {
    quack() {
        console.log('I am a dog, quack quack');
    }
}

// Cả hai đều kêu được, nên chúng đều được xem là con vịt
duck.quack();
dog.quack();

Còn với ngôn ngữ static typing như Java,... thì không có khái niệm duck typing.

// Phải thuộc class Duck, là vịt thì mới kêu được
class Duck {
    public void quack() {
        System.out.println("I am a duck, quack quack");
    }
}

// Chỉ có vịt (class Duck) mới kêu được, còn chó (class khác) thì không
Duck duck = new Duck();
duck.quack();
Dog dog = new Dog();
// dog.quack();

// Tuy nhiên, nếu class Dog cũng có method quack() thì vẫn gọi được
// Nhưng trường hợp này không giống duck typing

Thay vào đó, để đạt được hiệu quả như duck typing, Java sử dụng tính đa hình (trong OOP).


Bài viết đến đây là hết rùi. Qua bài viết, bạn có thể rút ra được kết luận "mấy ông dev lâu năm đều là trúa hề cả". Đùa đấy, mình chỉ hi vọng các bạn biết thêm một khái niệm hay trong lập trình, từ đó thêm yêu ngành hơn ❤

Cảm ơn và hẹn gặp lại các bạn trong những post tiếp theo.