Önce izlediğim bu konuşmayı tarafından Greg Young KISS uyarı insanlar: It Simple Stupid tutun.
O önerdi şeylerden biri biri, yani boy odaklı programlama yapmaktır yok değil bir çerçeve ihtiyaç .
Güçlü bir kısıtlama yaparak başlıyor: tüm yöntemlerin bir ve yalnızca bir parametre alması (bunu biraz sonra kısmi uygulama kullanarak gevşetmesine rağmen ).
Verdiği örnek bir arayüz tanımlamaktır:
public interface IConsumes<T>
{
void Consume(T message);
}
Bir komut vermek istiyorsak:
public class Command
{
public string SomeInformation;
public int ID;
public override string ToString()
{
return ID + " : " + SomeInformation + Environment.NewLine;
}
}
Komut şu şekilde uygulanır:
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);
}
}
Konsola giriş yapmak için, bir tanesi sadece uygular:
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);
}
}
Ardından, komut öncesi günlüğü, komut servisi ve komut sonrası günlüğü yalnızca:
var log1 = new Logger<Command>(null);
var svr = new CommandService(log);
var startOfChain = new Logger<Command>(svr);
ve komut aşağıdakiler tarafından yürütülür:
var cmd = new Command();
startOfChain.Consume(cmd);
Bunu yapmak için, örneğin, PostSharp , biri CommandService
şu şekilde açıklamalıdır :
public class CommandService : IConsumes<Command>
{
[Trace]
public void Consume(Command message)
{
Console.WriteLine("Command complete!");
}
}
Daha sonra, günlüğü şöyle bir özellik sınıfında uygulamak zorundasınız:
[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 );
}
}
Greg'in kullandığı argüman, nitelikten özniteliğin uygulanmasına olan bağlantının, küçük bir geliştiriciye neler olduğunu açıklayabilmek için "çok fazla büyü" olduğu şeklindedir. İlk örnek tüm "sadece kod" ve kolayca açıklanır.
Öyleyse, bu uzun soluklu birikimden sonra soru şu: Greg'in çerçeve dışı yaklaşımından AOP için PostSharp gibi bir şey kullanmaya ne zaman geçiyorsunuz?
IConsumes
parçaları birbirine bağladığı yönünde . Harici XML veya biraz Akıcı arayüz kullanmak zorunda kalmaktansa --- öğrenmesi gereken bir şey daha var. Biri de bu metodolojinin “öğrenilecek başka bir şey” olduğu iddia edilebilir.