- Cách lập trình từ trái sang phải là cách mà chương trình luôn giữ trạng thái hợp lệ ngay khi nhập mã, nhờ đó sự hỗ trợ của công cụ như tự động hoàn thành trong trình soạn thảo được tối đa hóa
- List comprehension của Python cản trở tính năng tự động hoàn thành do dùng biến chưa được khai báo và thiếu suy luận kiểu
- Rust và JavaScript cho phép cấu thành chương trình một cách tự nhiên từ trái sang phải, nên việc dùng biến và khám phá phương thức trực quan hơn
- Phong cách hàm của C và Python làm giảm hiệu quả trải nghiệm lập trình do tên hàm hoặc cấu trúc khó được khám phá
- Với logic có độ phức tạp cao, mã được triển khai từ trái sang phải dễ đọc hơn, đồng thời tốt hơn về bảo trì và khả năng mở rộng
Lập trình từ trái sang phải
Mã phải hợp lệ ngay tại thời điểm được nhập
Giới hạn của list comprehension trong Python
- Cú pháp list comprehension của Python
words_on_lines = [line.split() for line in text.splitlines()] gây ra vấn đề vì phải truy cập một biến chưa được khai báo (line), khiến trình soạn thảo không thể cung cấp tự động hoàn thành hay suy luận kiểu một cách đúng đắn
- Trong quá trình nhập mã từng phần
- nếu nhập
words_on_lines = [line.sp thì trình soạn thảo không biết kiểu của line, nên không thể gợi ý phương thức
- cũng khó phát hiện các lỗi tiềm ẩn như gõ sai tên biến (
lime chẳng hạn)
- Muốn nhận được gợi ý đúng thì phải viết mã chưa hoàn chỉnh, và quá trình đó gây cảm giác không trực quan và bất tiện
Cấu thành từ trái sang phải trong Rust
- Ví dụ Rust (
let words_on_lines = text.lines().map(|line| line.split_whitespace());) cho thấy
- cùng với khai báo hàm ẩn danh, biến (
line) được xem là đã khai báo ngay tại thời điểm xuất hiện đầu tiên, nên có thể tự động hoàn thành và gợi ý phương thức ngay lập tức
- thực tế, phương thức
split_whitespace cũng được tìm thấy dễ dàng nhờ gợi ý tự động
- Cách này giúp chương trình luôn giữ trạng thái hợp lệ dù chỉ là từng phần, nên IDE hoặc trình soạn thảo có thể hỗ trợ việc viết mã theo thời gian thực
Progressive Disclosure và tính khả dụng của API
- Progressive Disclosure là nguyên lý thiết kế cho phép người dùng chỉ phải đối mặt với mức độ phức tạp đúng theo nhu cầu, và điều này cũng có thể áp dụng vào lập trình
- Ví dụ: UX của trình xử lý văn bản chỉ hiện các tùy chọn liên quan khi thêm ảnh
- Ngôn ngữ C thiếu kiểu hỗ trợ này
- mọi hàm liên quan tới
FILE *file không thể được khám phá qua file., nên phải ghi nhớ các mẫu tên hàm như fread, fclose, v.v., và rất khó phát hiện chức năng
- ngược lại, trong một ngôn ngữ lý tưởng, các gợi ý phương thức thông qua
file. sẽ giúp khám phá dần dần các chức năng liên quan một cách dễ dàng
Khác biệt trong khả năng khám phá hàm và phương thức
- So sánh ví dụ
map(len, text.split()) của Python với text.split(" ").map(word => word.length) của JavaScript
- trong Python, khó đoán chính xác tên hàm như
len, length, size, nên phải thử nhiều lần mới biết cái nào thực sự hoạt động
- trong JavaScript, chỉ cần nhập
.l sau word. là trình soạn thảo đã có thể gợi ý length và các phương thức khác, nên khả năng khám phá cao hơn
- ngay cả các hàm bậc cao như
map cũng thể hiện rõ tức thì giá trị trả về và kiểu dữ liệu
Logic càng phức tạp càng thấy rõ lợi thế của cách viết có cấu trúc
- Với logic có độ phức tạp cao (đoạn mã Python dài lồng nhiều
filter, lambda)
- người đọc phải liên tục kiểm tra lại điểm bắt đầu và kết thúc của mã, và gặp suy giảm tính dễ đọc cùng khó khăn trong việc hiểu điều kiện hay ghép cặp dấu ngoặc
- Ở phiên bản JavaScript của cùng logic đó, có thể đọc và hiểu tuần tự mã từ trên xuống dưới, từ trái sang phải
Nguyên tắc cốt lõi
Mã phải hợp lệ ở mọi thời điểm được nhập
- Chỉ riêng
text cũng vẫn là trạng thái hợp lệ của chương trình
- Viết đến
text.split(" ") vẫn hợp lệ, và khi tiếp tục nhập .map(word => word.length) thì toàn bộ vẫn luôn là trạng thái trung gian hợp lệ
- Mẫu viết mã như vậy làm tăng khả năng hỗ trợ theo thời gian thực của trình soạn thảo, và trong môi trường REPL còn có thể kiểm tra kết quả ngay lập tức
Kết luận
- Thiết kế ngôn ngữ và API nên hỗ trợ việc nhập mã một cách tự nhiên từ trái sang phải, đồng thời tạo ra một chương trình hợp lệ ở mỗi bước trung gian
- Thiết kế API tốt là yếu tố cốt lõi để cải thiện trải nghiệm viết mã này
Chưa có bình luận nào.