Khi thực hiện thiết kế cho một hệ thống mới, tốt hơn là bắt đầu với một ngôn ngữ được gõ tĩnh (như Haskell) hoặc ngôn ngữ được gõ động (như Ruby)?
Những lý lẽ tôi có thể nghĩ ra:
Với một ngôn ngữ tĩnh, bạn có thể nhanh chóng tạo ra một đặc tả và phạm vi cho những gì chương trình sẽ làm. Với ngôn ngữ động, bạn có thể nhanh chóng tạo bản demo hoạt động để trình bày cho khách hàng xem xét.
Với ngôn ngữ động, bạn thường tránh phải sắp xếp lại cấu trúc dữ liệu và mã cấu trúc lại khi bạn thay đổi thiết kế. Với một ngôn ngữ tĩnh, bạn có thể xác định các loại trước khi thực hiện, giữ cho mã duy trì rất nhỏ.
Với một ngôn ngữ tĩnh, bạn phải tìm hiểu trước chương trình của bạn sẽ làm gì. Với ngôn ngữ động, bạn có thể bắt đầu viết mã và để thiết kế phát triển một cách hữu cơ. Như Paul Graham nói trong Hacker và Họa sĩ :
Một ngôn ngữ lập trình là để nghĩ về các chương trình, không phải để diễn đạt các chương trình mà bạn đã nghĩ đến.
Với một ngôn ngữ tĩnh, trình biên dịch có thể giúp xác định nhiều loại lỗi. Với ngôn ngữ động, bạn có thể bắt đầu thử nghiệm và tìm lỗi sớm hơn.
Gõ tĩnh và động đều có những ưu điểm và nhược điểm khi có liên quan đến tạo mẫu. Tuy nhiên, cả hai dường như đối với tôi như những cách tiếp cận hợp lệ như nhau. Dựa trên kinh nghiệm của bạn, cái nào cuối cùng tốt hơn?
Ghi chú
Tạo mẫu trong ngôn ngữ tự nhiên
Một loại ngôn ngữ thứ ba để xem xét: ngôn ngữ tự nhiên. Thay vì tạo mẫu trong mã, người ta có thể tạo nguyên mẫu bằng văn bản. Sau đó, khách hàng có thể đọc tài liệu của bạn và phê bình thiết kế của bạn, nhưng không thể chơi đồ chơi xung quanh với bản demo hoạt động. Nếu được viết tốt, tài liệu có thể thực hiện bằng bất kỳ ngôn ngữ nào. Hãy cẩn thận:
Các tài liệu có thể tẻ nhạt để đọc qua, và khó tiêu hóa mà không thể nhìn thấy nó. Tôi suy đoán rằng một khách hàng thà thử nghiệm một cái gì đó hoạt động hơn là đọc một bức tường văn bản (và hình ảnh).
Tạo mẫu một ứng dụng bằng tiếng Anh thay vì định nghĩa kiểu dài hơn và ít cụ thể hơn.
Các loại Haskell là mô tả
Lưu ý rằng các loại đặc biệt mô tả trong Haskell, nhiều hơn so với nhiều ngôn ngữ tĩnh như C ++ và Java. Ví dụ: giả sử tôi có một hàm có chữ ký loại này trong Haskell:
foo :: forall a. [a] -> a
Một hàm, đối với bất kỳ loại nào a
, sẽ lấy danh sách các mục thuộc loại a
và trả về giá trị của loại a
.
Ngay cả khi không biết tên của hàm, tôi biết một sự thật rằng:
Nó không thực hiện đầu vào / đầu ra hoặc sửa đổi bất kỳ giá trị nào (tốt, trừ khi nó sử dụng không an toànPerformIO không chính xác), bởi vì Haskell hoàn toàn là chức năng.
Nó không thể xử lý các mục như, như, số nguyên, bởi vì nó phải hỗ trợ bất kỳ loại nào .
Nó có để sử dụng danh sách đầu vào (đó, hoặc ném một ngoại lệ hoặc đi vào một vòng lặp vô hạn). Nếu không, nó sẽ nhận được một giá trị của loại
a
từ đâu?
Do đó, điều duy nhất mà chức năng này có thể làm (trừ thất bại) là trích xuất một mục ra khỏi danh sách đầu vào và trả lại. Mặc dù tôi vẫn không biết nó sẽ sử dụng vật phẩm nào, nhưng hãy [a] -> a
nói cho tôi biết về mọi thứ khác.