Saya baru saja menyaksikan pembicaraan oleh Greg Young ini memperingatkan orang-orang untuk KISS: Keep It Simple Stupid.
Salah satu hal yang ia menyarankan adalah bahwa untuk melakukan pemrograman berorientasi aspek, salah satu tidak tidak memerlukan kerangka kerja .
Dia mulai dengan membuat batasan yang kuat: bahwa semua metode mengambil satu, dan hanya satu, parameter (meskipun dia mengendurkan ini sedikit kemudian dengan menggunakan aplikasi parsial ).
Contoh yang diberikannya adalah mendefinisikan antarmuka:
public interface IConsumes<T>
{
void Consume(T message);
}
Jika kita ingin mengeluarkan perintah:
public class Command
{
public string SomeInformation;
public int ID;
public override string ToString()
{
return ID + " : " + SomeInformation + Environment.NewLine;
}
}
Perintah diimplementasikan sebagai:
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);
}
}
Untuk melakukan logging ke konsol, satu maka cukup implementasikan:
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);
}
}
Kemudian, logging pra-perintah, layanan perintah, dan pasca-perintah logging kemudian hanya:
var log1 = new Logger<Command>(null);
var svr = new CommandService(log);
var startOfChain = new Logger<Command>(svr);
dan perintah dijalankan oleh:
var cmd = new Command();
startOfChain.Consume(cmd);
Untuk melakukan ini, misalnya, PostSharp , orang akan membubuhi keterangan dengan CommandService
cara ini:
public class CommandService : IConsumes<Command>
{
[Trace]
public void Consume(Command message)
{
Console.WriteLine("Command complete!");
}
}
Dan kemudian harus mengimplementasikan logging di kelas atribut seperti:
[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 );
}
}
Argumen yang digunakan Greg adalah bahwa koneksi dari atribut ke implementasi atribut adalah "terlalu banyak sihir" untuk dapat menjelaskan apa yang terjadi pada pengembang junior. Contoh awal adalah semua "kode adil" dan mudah dijelaskan.
Jadi, setelah penumpukan yang agak lama, pertanyaannya adalah: kapan Anda beralih dari pendekatan non-kerangka kerja Greg ke menggunakan sesuatu seperti PostSharp untuk AOP?
IConsumes
. Daripada harus menggunakan XML eksternal atau antarmuka Lancar --- hal lain untuk dipelajari. Orang bisa berpendapat bahwa metodologi ini adalah "hal lain yang harus dipelajari" juga.