Trong khi các giải pháp khác, thanh lịch hơn có thể tốt hơn để sử dụng nếu bạn có thể, chuỗi mixin có thể cực kỳ hữu ích. Chúng cho phép tái sử dụng cả mã và tạo mã. Chúng được kiểm tra tại thời gian biên dịch. Mã mà kết quả là chính xác giống như nếu bạn đã tự viết bằng tay, vì vậy nó không kém an toàn hơn nếu bạn đã tự viết nó bằng tay.
Vấn đề với mixin chuỗi là chúng khó kiểm soát hơn mã viết tay theo nghĩa nó không được đặt trong nguồn của bạn theo cùng cách với số dòng có thể theo dõi rõ ràng về lỗi và có thể khó gỡ lỗi hơn. Ví dụ, hãy hello world với một mixin chuỗi:
import std.stdio;
void main()
{
mixin(hello());
}
string hello()
{
return "
writeln(\"hello world\");
";
}
Nếu chúng ta loại bỏ các dấu chấm phẩy sau writeln()
, sau đó các lỗi chúng tôi đã nhận sẽ
d.d(7): found 'EOF' when expecting ';' following statement
Các mixin được thực hiện trên dòng 5. Dòng 7 là một dòng trống. Vì vậy, số dòng là hữu ích hạn chế ở đây. Bây giờ, mixin này đủ ngắn để chúng ta có thể đặt nó trên một dòng và nhận ra rằng lỗi trên cùng dòng với mixin, nhưng với các mixin phức tạp hơn, điều đó rõ ràng sẽ không hoạt động. Vì vậy, bằng cách sử dụng một mixin chuỗi, khả năng của bạn để tìm ra nơi một lỗi là bị suy yếu.Nếu mã được tạo ra bằng cách sử dụng CTFE, sau đó nó sẽ trở nên khó khăn hơn nhiều để tìm ra chính xác những gì mã thậm chí trông giống như để tìm ra những gì sai với nó. Nó giống như tìm ra mã vĩ mô kiểu C biến thành mã nào, ngoại trừ việc nó có thể tồi tệ hơn vì chúng có thể được tạo thay vì thay thế trực tiếp. Tuy nhiên, chúng không thay thế trừ khi bạn nói rõ với chúng, vì vậy chúng an toàn hơn nhiều so với các macro kiểu C.
Kết hợp chuỗi hoàn toàn an toàn và không có gì đặc biệt sai với chúng, nhưng chúng giúp bảo trì khó hơn theo một số cách. Mã viết tay tương ứng sẽ dễ debug hơn. Tuy nhiên, chuỗi mixin đủ mạnh để chúng có thể tạo ra nhiều mã cho bạn và tiết kiệm cho bạn rất nhiều chi phí bảo trì theo nghĩa đó, và chúng cho phép bạn sử dụng lại mã, điều này cũng có thể là một sự bảo trì lớn.
Vì vậy, cho dù sử dụng một mixin chuỗi là một ý tưởng tốt trong một tình huống cụ thể phụ thuộc vào tình hình đó. Tôi không thấy bất cứ điều gì đặc biệt sai với họ, và tôi chắc chắn sẽ không gọi họ là một khuôn mẫu, nhưng có cả ưu và khuyết điểm khi sử dụng chúng sao cho chúng là ý tưởng hay tùy thuộc vào những gì bạn đang làm . Trong nhiều trường hợp, có nhiều giải pháp sạch hơn, thanh lịch hơn sẽ tốt hơn. Ở những người khác, họ chính xác là những gì bác sĩ đã ra lệnh.
Cá nhân, tôi nghĩ rằng chúng tuyệt vời nếu bạn muốn tạo mã, tiết kiệm cho mình nỗ lực phải viết mã đó bằng tay và có thể giúp tạo mã đúng cho nhiều tình huống khác nhau và tránh mạo hiểm tạo ra các lỗi mới như bạn có thể đã có bạn viết nó cho mình trong mỗi những nơi mà bạn sử dụng mixin. Nó cũng là một trong những cách để hoàn toàn sử dụng lại mã mà không phải lo lắng về chi phí của một cuộc gọi hàm hoặc các vấn đề với các giới hạn của thừa kế đơn hoặc bất kỳ thứ gì khác làm cho việc sử dụng lại mã bằng cách gọi hàm hoặc thừa kế khó hơn. Bạn chỉ cần sao chép và dán mã vào từng vị trí theo cách tạo ra để nếu bạn thay đổi mã, các thay đổi sẽ được dán ở mọi nơi mà bạn không phải lo lắng về việc theo dõi tất cả chúng như thể bạn đã có bản sao tay và dán.
Vì vậy, hãy sử dụng mixin chuỗi nếu thích hợp và tốt nhất là không nên sử dụng chúng nếu chúng không cần thiết, nhưng không có gì thực sự sai khi sử dụng chúng.
* sniff * Tôi yêu bạn, Feep. Điều này thực sự là một trong những ý tưởng tuyệt vời của bạn. –
Mỗi mẹo bán gọn gàng đáng tin cậy như vậy có ba hoặc bốn ý tưởng chỉ đơn thuần là _horrible_ - như trình phân tích cú pháp đồ thị máy dựa trên văn bản CTFE được chôn sâu trong tools.base :) – FeepingCreature