Ngôn ngữ dựa trên khối so với ngôn ngữ dựa trên văn bản

Ngôn ngữ dựa trên khối khác với ngôn ngữ dựa trên văn bản ở một số khía cạnh, chủ yếu là do các ngôn ngữ này được thiết kế cho người dùng mới. Dưới đây là danh sách những điều cần cân nhắc khi thiết kế ngôn ngữ dựa trên khối của riêng bạn.

Sử dụng danh sách dựa trên một giá trị

Khối chọn chữ cái tại một chỉ mục nhất định trong chuỗi và sử dụng 1 để biểu thị chữ cái đầu tiên.

Các lập trình viên mới sẽ phản ứng không tốt khi gặp danh sách dựa trên số 0 lần đầu tiên. Do đó, Blockly tuân theo Lua và Lambda Moo bằng cách tạo danh sách và lập chỉ mục chuỗi dựa trên một.

Để sử dụng Blockly nâng cao hơn, danh sách dựa trên số 0 được hỗ trợ để giúp việc chuyển đổi sang văn bản dễ dàng hơn. Đối với đối tượng nhỏ tuổi hoặc mới làm quen, bạn vẫn nên sử dụng tính năng lập chỉ mục dựa trên một từ khoá.

Đề xuất: Số 1 là số đầu tiên.

Hỗ trợ các quy tắc đặt tên tự do

Các khối có tên biến không phân biệt chữ hoa chữ thường location_x (x viết thường) và
location_X (X viết hoa).

Các lập trình viên mới bắt đầu không mong đợi location_Xlocation_x là các biến khác nhau. Do đó, Blockly tuân theo BASIC và HTML bằng cách làm cho các biến và hàm không phân biệt chữ hoa chữ thường. Scratch sử dụng một phương pháp tinh tế hơn (như minh hoạ ở bên phải) và phân biệt chữ hoa chữ thường đối với tên biến nhưng không phân biệt chữ hoa chữ thường đối với việc kiểm tra tính bằng nhau.

Ngoài ra, Blockly không yêu cầu các biến và hàm phải tuân theo giao thức [_A-Za-z][_A-Za-z0-9]* thông thường. Nếu bạn muốn đặt tên biến là List of zip codes hoặc רשימת מיקודים thì hoàn toàn không có vấn đề gì.

Đề xuất: Bỏ qua chữ hoa chữ thường, cho phép mọi tên.

Đặt tất cả biến thành toàn cục

Các lập trình viên mới cũng gặp khó khăn trong việc hiểu phạm vi. Do đó, Blockly tuân theo Scratch bằng cách đặt tất cả biến thành biến toàn cục. Điểm yếu duy nhất của biến toàn cục là việc đệ quy sẽ khó khăn hơn (người dùng phải đẩy và bật các biến vào danh sách), nhưng đó là một kỹ thuật lập trình nằm ngoài phạm vi của người dùng mục tiêu của Blockly.

Đề xuất: Phạm vi nằm ngoài phạm vi, hãy để lại sau.

Cân nhắc cách xử lý các giá trị trả về không bắt buộc

Nhiều hàm trong lập trình dựa trên văn bản thực hiện một hành động, sau đó trả về một giá trị. Bạn có thể sử dụng hoặc không sử dụng giá trị trả về này. Ví dụ: hàm pop() của ngăn xếp. Bạn có thể gọi Pop để lấy và xoá phần tử cuối cùng, hoặc chỉ gọi để xoá phần tử cuối cùng mà bỏ qua giá trị trả về.

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

Các ngôn ngữ dựa trên khối thường không giỏi bỏ qua giá trị trả về. Khối giá trị phải được kết nối với một thành phần chấp nhận giá trị đó. Có một số chiến lược để giải quyết vấn đề này.

a) Tránh vấn đề. Hầu hết các ngôn ngữ dựa trên khối đều thiết kế ngôn ngữ để tránh những trường hợp này. Ví dụ: Scratch không có khối nào có cả tác dụng phụ và giá trị trả về.

b) Cung cấp hai khối. Nếu không gian trong hộp công cụ không phải là vấn đề, một giải pháp đơn giản là cung cấp hai loại khối này, một khối có và một khối không có giá trị trả về. Nhược điểm là điều này có thể dẫn đến một hộp công cụ gây nhầm lẫn với nhiều khối gần giống nhau.

Một khối giá trị xoá và trả về mục cuối cùng trong danh sách và một khối câu lệnh chỉ xoá mục cuối cùng trong danh sách.

c) Biến đổi một khối. Sử dụng trình đơn thả xuống, hộp đánh dấu hoặc thành phần điều khiển khác cho phép người dùng chọn có trả về giá trị hay không. Sau đó, khối này sẽ thay đổi hình dạng tuỳ thuộc vào các tuỳ chọn của khối. Bạn có thể xem ví dụ về điều này trong khối truy cập danh sách của Blockly.

Khối thay đổi hình dạng từ khối giá trị thành khối câu lệnh khi xoá mục cuối cùng trong danh sách, tuỳ thuộc vào việc khối đó có trả về mục đó hay không.

d) Sử dụng giá trị. Phiên bản đầu tiên của App Inventor đã tạo một khối ống đặc biệt để xử lý mọi giá trị được kết nối. Người dùng không hiểu khái niệm này và phiên bản thứ hai của App Inventor đã xoá khối ống và đề xuất người dùng chỉ cần gán giá trị cho một biến dùng một lần.

Các khối cho thấy hai cách khác nhau để bỏ qua đầu ra của một khối. Lệnh đầu tiên sử dụng một khối ống để "ăn" giá trị và lệnh thứ hai đặt giá trị của một biến có tên là "rác".

Đề xuất: Mỗi chiến lược đều có ưu và khuyết điểm, hãy chọn chiến lược phù hợp với người dùng.

Tạo mã dễ đọc

Người dùng Blockly nâng cao sẽ có thể xem mã được tạo (JavaScript, Python, PHP, Lua, Dart, v.v.) và nhận ra ngay lập tức chương trình mà họ đã viết. Điều này có nghĩa là bạn cần phải nỗ lực nhiều hơn để giữ cho mã do máy tạo này có thể đọc được. Dấu ngoặc đơn thừa, biến số dạng số, khoảng trắng bị nén và các mẫu mã chi tiết đều cản trở việc tạo mã thanh lịch. Mã được tạo phải bao gồm các nhận xét và phải tuân thủ hướng dẫn về quy tắc lập trình của Google.

Đề xuất: Hãy tự hào về mã đã tạo. Hiển thị cho người dùng.

Chấp nhận sự khác biệt giữa các ngôn ngữ

Một hiệu ứng phụ của việc mong muốn có mã sạch là hành vi của Blockly chủ yếu được xác định theo cách hoạt động của ngôn ngữ biên dịch chéo. Ngôn ngữ đầu ra phổ biến nhất là JavaScript, nhưng nếu Blockly biên dịch chéo sang một ngôn ngữ khác, bạn không nên cố gắng duy trì hành vi chính xác trên cả hai ngôn ngữ. Ví dụ: trong JavaScript, một chuỗi trống là sai, trong khi trong Lua là đúng. Việc xác định một mẫu hành vi duy nhất để mã của Blockly thực thi bất kể ngôn ngữ đích sẽ dẫn đến mã không thể duy trì, có vẻ như mã đó xuất phát từ trình biên dịch GWT.

Đề xuất: Blockly không phải là một ngôn ngữ, hãy cho phép ngôn ngữ hiện có ảnh hưởng đến hành vi.