Kiểu tĩnh hay kiểu động: đánh đổi thật nằm ở đâu
Ảnh: Zapier

Kiểu tĩnh hay kiểu động: đánh đổi thật nằm ở đâu

Thay vì hỏi kiểu tĩnh hay động cái nào tốt hơn, hãy hỏi lỗi bị bắt ở giai đoạn nào và giá mỗi giai đoạn. Đặt lại thế, phần lớn cuộc tranh cãi tan biến.

Cuộc tranh luận kiểu tĩnh và kiểu động đã kéo dài mấy chục năm và thường sa vào chỗ vô bổ — mỗi bên khen ngôn ngữ mình quen. Câu hỏi hữu ích hơn không phải "cái nào tốt hơn" mà là: lỗi bị bắt ở giai đoạn nào, và giá phải trả cho mỗi giai đoạn là bao nhiêu? Đặt lại như vậy, phần lớn cuộc tranh cãi tan biến.

Lỗi càng bị bắt sớm càng rẻ

Cùng một lỗi, giá sửa tăng vọt theo giai đoạn nó bị phát hiện:

  • Lúc gõ mã — gần như miễn phí, trình soạn thảo gạch đỏ ngay khi tay còn trên phím.
  • Lúc biên dịch — vài giây chờ, vẫn rất rẻ.
  • Lúc chạy test — vài phút, và cần có test bao đúng chỗ đó.
  • Trên máy người dùng — tốn tiền, tốn uy tín, và đôi khi tốn cả dữ liệu của người ta.

Kiểu tĩnh đẩy cả một lớp lỗi — gọi sai tên, truyền nhầm loại dữ liệu, quên xử lý một trường hợp — lên hai bậc đầu tiên. Đó là toàn bộ giá trị của nó, không hơn không kém. Nó không làm mã đúng; nó làm một loại sai trở nên bất khả trước khi mã kịp chạy.

Cái giá của kiểu tĩnh

Bạn phải mô tả hình dạng dữ liệu trước khi dùng nó. Với một đoạn mã viết một lần rồi vứt — một script phân tích nhanh, một thử nghiệm — việc này là phí công thuần tuý, thêm nghi thức mà không được lợi. Nhưng với một hệ thống nhiều người cùng sửa qua nhiều năm, chính những mô tả kiểu đó là tài liệu duy nhất không bao giờ lỗi thời, vì trình biên dịch bắt buộc nó phải khớp với mã. Bình luận nói dối được; kiểu thì không.

Ranh giới đang mờ đi

Cuộc tranh luận cũ giả định hai phe tách bạch, nhưng thực tế đã hội tụ. Các ngôn ngữ động lớn đều đã thêm lớp chú thích kiểu tuỳ chọn, cho phép bật sự nghiêm ngặt ở nơi cần và giữ sự linh hoạt ở nơi khác. Ngược lại, các ngôn ngữ tĩnh ngày càng giỏi suy luận kiểu, nên bạn hưởng được sự an toàn mà ít phải viết ra. Hai bên gặp nhau ở giữa, và lựa chọn hôm nay ít mang tính tôn giáo hơn trước nhiều.

Chọn theo tình huống

  • Script, phân tích dữ liệu, thử nghiệm nhanh — kiểu động thắng về tốc độ viết, vì mã sống ngắn nên chi phí bảo trì không kịp phát sinh.
  • Thư viện dùng chung, hệ thống chạy lâu, đội đông người — kiểu tĩnh trả lại công gấp nhiều lần, vì mỗi lỗi chặn được ở lúc dịch là một lỗi không phải truy vào lúc 3 giờ sáng.
  • Mã ở ranh giới với thế giới bên ngoài — dữ liệu từ mạng, từ người dùng — thì dù ngôn ngữ nào cũng phải kiểm tra lúc chạy, vì kiểu tĩnh không bảo vệ được bạn khỏi dữ liệu bẩn đến từ bên ngoài chương trình.

Một điều cuối cần nhớ để khỏi ảo tưởng: kiểu dữ liệu không bắt được lỗi logic. Nó đảm bảo bạn không cộng một chuỗi vào một ngày tháng — hữu ích thật — nhưng một phép tính sai hoàn toàn với các kiểu khớp nhau vẫn lọt qua trơn tru. Đừng nhầm "khớp kiểu" với "đúng".

Chia sẻ

Thảo luận