আমি শুধু প্রেক্ষিত এই আলাপ দ্বারা গ্রেগ ইয়াং চুম্বন করতে সাবধানবাণী লোক: এটা রাখা সহজ মূঢ়।
তিনি যে বিষয়গুলির পরামর্শ দিয়েছিলেন তার মধ্যে একটি হ'ল দিক-ভিত্তিক প্রোগ্রামিং করার জন্য, কোনও কাঠামোর প্রয়োজন হয় না ।
তিনি একটি শক্ত প্রতিবন্ধকতা তৈরি করে শুরু করেন: যে সমস্ত পদ্ধতিতে একটি, এবং কেবল একটিই, প্যারামিটার লাগে (যদিও তিনি আংশিক প্রয়োগ ব্যবহার করে এটিকে খানিকটা পরে শিথিল করেন )।
তিনি যে উদাহরণটি দিয়েছেন তা হল একটি ইন্টারফেস সংজ্ঞায়িত করা:
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);
এটি করার জন্য, উদাহরণস্বরূপ, পোস্টশার্প , কেউ এইভাবে মন্তব্য করতে পারেন 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 );
}
}
গ্রেগ যে যুক্তিটি ব্যবহার করে তা হ'ল গুণাবলী প্রয়োগ থেকে অ্যাট্রিবিউট থেকে সংযোগটি "খুব বেশি যাদু" হয় জুনিয়র বিকাশকারীকে কী ঘটছে তা ব্যাখ্যা করতে সক্ষম হতে। প্রাথমিক উদাহরণটি হ'ল "কেবল কোড" এবং সহজেই ব্যাখ্যা করা।
সুতরাং, বরং দীর্ঘায়িত বিল্ড আপের পরে, প্রশ্নটি হল: আপনি গ্রেগের নন-ফ্রেমওয়ার্কের দৃষ্টিভঙ্গি থেকে এওপি-র জন্য পোস্টশার্প জাতীয় কিছু ব্যবহার করার জন্য কখন স্যুইচ করবেন?
IConsumes
টুকরো সংযোগ স্থাপন করে । বাহ্যিক এক্সএমএল বা কিছু ফ্লুয়েন্ট ইন্টারফেস ব্যবহার করার চেয়ে --- আরও একটি জিনিস শিখতে হবে। কেউ তর্ক করতে পারে যে এই পদ্ধতিটি "শেখার অন্য জিনিস"।