Tôi đã đọc qua một số bài viết về Caching and Memoization và cách thực hiện dễ dàng bằng cách sử dụng các đại biểu và Generics. Cú pháp này khá đơn giản và dễ dàng thực hiện, nhưng tôi chỉ cảm thấy do tính chất lặp đi lặp lại nên có thể tạo mã dựa trên một thuộc tính, thay vì phải viết cùng một mã hệ thống ống nước.Làm cách nào để tiêm/tạo mã ống nước vào các phương pháp được trang trí với Thuộc tính?
Hãy nói rằng chúng tôi bắt đầu với ví dụ mặc định:
class Foo
{
public int Fibonacci(int n)
{
return n > 1 ? Fibonacci(n-1) + Fibonacci(n-2) : n;
}
}
Và sau đó đến memoize này:
// Let's say we have a utility class somewhere with the following extension method:
// public static Func<TResult> Memoize<TResult>(this Func<TResult> f)
class Foo
{
public Func<int,int> Fibonacci = fib;
public Foo()
{
Fibonacci = Fibonacci.Memoize();
}
public int fib(int n)
{
return n > 1 ? Fibonacci(n-1) + Fibonacci(n-2) : n;
}
}
tôi nghĩ, nó sẽ không thể đơn giản hơn chỉ cần thực hiện một bộ tạo mã để spits ra mã này, một khi nó tìm thấy một phương pháp được gắn thẻ phù hợp với một trong các phương pháp mở rộng Memoize. Vì vậy, thay vì phải viết mã hệ thống ống nước này, tôi chỉ có thể thêm một thuộc tính:
class Foo
{
[Memoize]
public int Fibonacci(int n)
{
return n > 1 ? Fibonacci(n-1) + Fibonacci(n-2) : n;
}
}
Thành thực mà nói, tôi biết điều này là nhìn giống như đường biên dịch cần được chuyển đổi bởi một tiền xử lý so với thế hệ mã thực tế nhưng câu hỏi của tôi là:
- bạn nghĩ gì là cách tốt nhất để tìm các phương pháp trong file aC# nguồn mà có một thuộc tính nhất định, phân tích ra parametertypes và returntype, và tạo ra một đại biểu phù hợp với dấu vân tay này
- Điều gì sẽ là cách tốt nhất để tích hợp điều này vào quá trình xây dựng, mà không thực sự qua viết mã của tôi. Có thể làm một số tiền xử lý trên các tập tin nguồn trước khi chuyển nó vào trình biên dịch?
Cảm ơn bất kỳ và tất cả ý tưởng.
Cập nhật:
tôi đã nhìn vào thư viện PostSharp Shay như đã gợi ý, và nó có vẻ rất phù hợp cho công việc trên các ứng dụng phi thời gian quan trọng như quản lý giao dịch, Tracing hoặc Security.
Tuy nhiên, khi sử dụng nó trong một bối cảnh thời gian quan trọng, nó đã chứng minh là chậm hơn rất nhiều so với đại biểu. Một triệu lần lặp của ví dụ Fibonacci với mỗi lần thực hiện dẫn đến thời gian chạy chậm hơn 80 lần. (0,012ms postsharp và 0,00015ms đại biểu cho mỗi cuộc gọi)
Nhưng thành thật mà nói, kết quả là hoàn toàn có thể chấp nhận được trong ngữ cảnh mà tôi định sử dụng nó. Cảm ơn bạn đã trả lời!
Update2:
Rõ ràng tác giả của PostSharp đang làm việc chăm chỉ trên release 2.0 mà sẽ bao gồm, trong số những thứ khác, cải tiến hiệu suất trong mã sản xuất, và thời gian biên dịch.
Điều này trông giống như một lựa chọn rất tốt. Hãy nhìn vào nó. –
Tôi đã bỏ phiếu này, nhưng tôi có thể hơi thiên vị :). –
@Patrick, vì vậy bạn làm tất cả công việc khó khăn và tôi nhận được phiếu bầu :) –