मैं सिर्फ देखा इस बात से ग्रेग युवा चुंबन चेतावनी लोग: यह रखें सरल बेवकूफ।
उनके द्वारा सुझाई गई चीजों में से एक यह है कि पहलू-उन्मुख प्रोग्रामिंग करने के लिए, किसी को एक रूपरेखा की आवश्यकता नहीं है ।
वह एक मजबूत बाधा बनाकर शुरू करता है: कि सभी विधियां एक लेती हैं, और केवल एक, पैरामीटर (हालांकि वह आंशिक अनुप्रयोग का उपयोग करके थोड़ी देर बाद इसे आराम करता है )।
वह जो उदाहरण देता है वह एक इंटरफ़ेस को परिभाषित करता है:
public interface IConsumes<T>
{
void Consume(T message);
}
यदि हम एक आदेश जारी करना चाहते हैं:
public class Command
{
public string SomeInformation;
public int ID;
public override string ToString()
{
return ID + " : " + SomeInformation + Environment.NewLine;
}
}
आदेश के रूप में कार्यान्वित किया जाता है:
public class CommandService : IConsumes<Command>
{
private IConsumes<Command> _next;
public CommandService(IConsumes<Command> cmd = null)
{
_next = cmd;
}
public void Consume(Command message)
{
Console.WriteLine("Command complete!");
if (_next != null)
_next.Consume(message);
}
}
सांत्वना के लिए लॉगिंग करने के लिए, फिर एक ही लागू होता है:
public class Logger<T> : IConsumes<T>
{
private readonly IConsumes<T> _next;
public Logger(IConsumes<T> next)
{
_next = next;
}
public void Consume(T message)
{
Log(message);
if (_next != null)
_next.Consume(message);
}
private void Log(T message)
{
Console.WriteLine(message);
}
}
फिर, प्री-कमांड लॉगिंग, कमांड सर्विस और पोस्ट-कमांड लॉगिंग तो बस:
var log1 = new Logger<Command>(null);
var svr = new CommandService(log);
var startOfChain = new Logger<Command>(svr);
और कमांड द्वारा निष्पादित किया जाता है:
var cmd = new Command();
startOfChain.Consume(cmd);
ऐसा करने के लिए, उदाहरण के लिए, PostSharp , कोई CommandService
इस तरह से एनोटेट करेगा :
public class CommandService : IConsumes<Command>
{
[Trace]
public void Consume(Command message)
{
Console.WriteLine("Command complete!");
}
}
और फिर विशेषता वर्ग में लॉगिंग को कुछ इस तरह से लागू करना होगा:
[Serializable]
public class TraceAttribute : OnMethodBoundaryAspect
{
public override void OnEntry( MethodExecutionArgs args )
{
Console.WriteLine(args.Method.Name + " : Entered!" );
}
public override void OnSuccess( MethodExecutionArgs args )
{
Console.WriteLine(args.Method.Name + " : Exited!" );
}
public override void OnException( MethodExecutionArgs args )
{
Console.WriteLine(args.Method.Name + " : EX : " + args.Exception.Message );
}
}
ग्रेग का उपयोग करने वाला तर्क यह है कि विशेषता से कार्यान्वयन के लिए कनेक्शन "बहुत अधिक जादू है" यह समझाने में सक्षम होना है कि एक जूनियर डेवलपर के लिए क्या हो रहा है। प्रारंभिक उदाहरण सभी "बस कोड" है और आसानी से समझाया गया है।
तो, उसके बाद लंबे समय तक बिल्ड-अप के बाद, सवाल यह है: जब आप ग्रेग के गैर-ढांचे के दृष्टिकोण से स्विच करते हैं, तो AOP के लिए PostSharp जैसी किसी चीज़ का उपयोग करने के लिए?
IConsumes
टुकड़ों में आम CODE को जोड़ रहा है । बाहरी एक्सएमएल या कुछ धाराप्रवाह इंटरफ़ेस का उपयोग करने के बजाय --- अभी तक एक और बात सीखना है। कोई यह तर्क दे सकता है कि यह पद्धति "सीखने के लिए एक और चीज" है।