Định dạng, thụt lề và khoảng cách
MQL5 nằm trong số các ngôn ngữ dạng tự do, chẳng hạn như C và nhiều ngôn ngữ khác. Điều này có nghĩa là việc đặt các ký hiệu dịch vụ, chẳng hạn như dấu ngoặc hoặc toán tử và từ khóa có thể là ngẫu nhiên, miễn là tuân theo các quy tắc cú pháp. Cú pháp chỉ giới hạn trình tự chung của các ký hiệu và từ đó, trong khi kích thước thụt lề ở mỗi đầu chuỗi hoặc số khoảng trắng giữa các phần tử của câu lệnh không có ý nghĩa gì đối với trình biên dịch. Ở bất kỳ vị trí nào trong văn bản, cần chèn khoảng trắng để phân tách các phần tử ngôn ngữ với nhau, chẳng hạn như từ khóa kiểu biến và mã định danh biến, thì có thể sử dụng nhiều khoảng trắng hơn. Hơn nữa, thay vì khoảng trắng, được phép sử dụng các ký hiệu khác biểu thị khoảng trắng trống, chẳng hạn như bảng và ngắt dòng.
Nếu có ký hiệu phân tách (chúng ta sẽ tìm hiểu thêm về chúng trong Phần 2) giữa một số phần tử của câu lệnh, chẳng hạn như dấu phẩy ,
giữa các tham số hàm, thì không cần sử dụng bất kỳ khoảng trắng nào cả.
Việc thay đổi định dạng mã nguồn không làm thay đổi mã thực thi.
Về cơ bản, có nhiều ngôn ngữ không phải dạng tự do. Trong một số ngôn ngữ, việc tạo khối mã, được thực hiện bằng cách sử dụng phép so khớp dấu ngoặc nhọn trong MQL5, dựa trên các thụt lề bằng nhau từ cạnh trái.
Nhờ định dạng tự do, MQL5 cho phép các lập trình viên sử dụng nhiều kỹ thuật khác nhau để tạo mã nguồn nhằm cải thiện khả năng đọc, khả năng hiển thị và điều hướng nội bộ dễ dàng hơn.
Hãy cùng xem xét một số ví dụ về cách ghi lại văn bản nguồn của hàm Greeting
từ tập lệnh của chúng ta mà không làm thay đổi mục đích của nó.
Sau đây là phiên bản được "đóng gói" nhất mà không có bất kỳ khoảng cách hoặc ngắt dòng thừa nào (ngắt dòng được biểu thị ở đây bằng ký hiệu \
chỉ được thêm vào để tuân thủ các hạn chế về việc xuất bản mã nguồn trong cuốn sách này).
string Greeting(int hour){string messages[3]={"Good morning",\
"Good afternoon","Good evening"};return messages[hour%24/8];}
2
Đây là phiên bản có chèn thêm khoảng trắng và ngắt dòng quá mức.
string
Greeting ( int hour )
{
string messages [ 3 ]
= {
"Good morning" ,
"Good afternoon" ,
"Good evening"
} ;
return messages [ hour % 24 / 8 ] ;
}
2
3
4
5
6
7
8
9
10
11
12
MetaEditor có một trình tạo kiểu mã tích hợp cho phép tự động định dạng mã nguồn của tệp hiện tại theo một trong các kiểu được hỗ trợ. Một kiểu cụ thể có thể được chọn trong hộp thoại Tools -> Settings -> Styler
. Một kiểu được áp dụng bằng lệnh Tools -> Styler
.
Bạn nên nhớ rằng sự tự do về khoảng cách của bạn bị hạn chế. Cụ thể, bạn không được chèn khoảng trắng vào các mã định danh, từ khóa hoặc số. Nếu không, trình biên dịch sẽ không thể nhận dạng chúng. Ví dụ, nếu chúng ta chỉ chèn một khoảng trắng giữa các chữ số 2 và 4 trong số 24, trình biên dịch sẽ trả về một loạt lỗi khi cố gắng biên dịch tập lệnh.
Sau đây là một chuỗi ký tự được sửa đổi một cách cố ý không chính xác:
return messages[hour % 2 4 / 8];
Sau đây là nhật ký lỗi:
'GoodTime2.mq5' GoodTime2.mq5 1 1
'4' - some operator expected GoodTime2.mq5 19 28
'[' - unbalanced left parenthesis GoodTime2.mq5 19 18
'8' - some operator expected GoodTime2.mq5 19 32
']' - semicolon expected GoodTime2.mq5 19 33
']' - unexpected token GoodTime2.mq5 19 33
5 errors, 0 warnings 6 1
2
3
4
5
6
7
Các thông điệp biên dịch có thể không phải lúc nào cũng rõ ràng. Cần lưu ý rằng, ngay cả khi xảy ra lỗi đầu tiên (liên tiếp), có khả năng cao là biểu diễn bên trong của chương trình (như trình biên dịch nhận thấy ở 'giữa câu') khác đáng kể so với những gì lập trình viên đã đề xuất. Đặc biệt, trong trường hợp này, chỉ lỗi đầu tiên và lỗi thứ hai chứa chìa khóa để hiểu vấn đề, trong khi tất cả các lỗi khác đều được truyền bá.
Theo lỗi đầu tiên, trình biên dịch mong đợi tìm thấy ký hiệu của một phép toán giữa 2 và 4 (vì nó nhận thấy 2 và 4 là hai số khác nhau chứ không phải là 24 được phân cách bằng một khoảng trắng). Logic thay thế bao gồm thực tế là một dấu ngoặc vuông đóng bị bỏ qua ở đây và trình biên dịch hiển thị lỗi thứ hai: "'[' - dấu ngoặc đơn trái không cân bằng." Sau đó, khi chạy qua biểu thức bị phá vỡ hoàn toàn, do đó số 8 và dấu ngoặc đóng ']' tiếp theo có vẻ không phù hợp với trình biên dịch. Nhưng trên thực tế, nếu chúng ta chỉ xóa khoảng trắng thừa giữa 2 và 4, tình hình sẽ trở nên bình thường.
Tất nhiên, dễ hơn nhiều khi thực hiện phân tích lỗi như vậy khi chúng ta cố tình thêm vấn đề. Chúng ta không phải lúc nào cũng hiểu trong thực tế cách khắc phục tình huống này hay tình huống khác. Ngay cả trong trường hợp trên, giả sử bạn nhận được mã bị hỏng này từ một lập trình viên khác và các phần tử mảng không chứa thông tin tầm thường như vậy, thì một tùy chọn sửa lỗi khác cũng dễ bị nghi ngờ: Phải để lại 2 hoặc 4, vì có thể tác giả muốn thay thế một số bằng một số khác và không xóa 'dấu chân'.