Đó là một sự đánh đổi. Để tôi lấy một ví dụ. Tôi tình cờ biết về kỹ thuật của differential execution vào khoảng năm 1985, và tôi nghĩ đó là một công cụ thực sự tốt cho việc lập trình giao diện người dùng. Về cơ bản, phải mất chương trình đơn giản có cấu trúc như thế này:
void Foo(..args..){
x = y;
if (..some test..){
Bar(arg1, ...)
}
while(..another test..){
...
}
...
}
và mucks với cấu trúc điều khiển như thế này:
void deFoo(..args..){
if (mode & 1){x = y;}
{int svmode = mode; if (deIf(..some test..)){
deBar(((mode & 1) arg1 : 0), ...)
} mode = svmode;}
{int svmode = mode; while(deIf(..another test..)){
...
} mode = svmode;}
...
}
Bây giờ, một cách thực sự tốt để làm điều đó sẽ có được để viết một phân tích cú pháp cho C hoặc bất kỳ ngôn ngữ cơ sở là gì, và sau đó đi bộ cây phân tích, tạo ra mã tôi muốn. (Khi tôi làm điều đó ở Lisp, phần đó thật dễ dàng.)
Nhưng ai muốn viết một trình phân tích cú pháp cho C, C++, hay bất cứ thứ gì?
Vì vậy, thay vào đó, tôi chỉ cần viết macro để tôi có thể viết mã như thế này:
void deFoo(..args..){
PROTECT(x = y);
IF(..some test..)
deBar(PROTECT(arg1), ...)
END
WHILE(..another test..)
...
END
...
}
Tuy nhiên, khi tôi làm điều này trong C#, ai đó trong sự khôn ngoan của họ quyết định macro là xấu, và tôi don không muốn viết một trình phân tích cú pháp C#, vì vậy tôi phải làm việc tạo mã bằng tay. Đây là một nỗi đau của hoàng gia, nhưng nó vẫn đáng giá so với cách viết mã thông thường.
+1 cảm ơn Mike. Đó là câu trả lời hay nhất :) – Viet