ฉันเพิ่งดูการสนทนานี้โดยGreg Youngเตือนผู้คนถึง KISS: Keep It Simple Stupid
หนึ่งในสิ่งที่เขาบอกว่าจะทำอย่างไรการเขียนโปรแกรมเชิงลักษณะอย่างใดอย่างหนึ่งไม่ได้ต้องกรอบ
เขาเริ่มต้นด้วยการทำให้มีข้อ จำกัด ที่แข็งแกร่ง: วิธีการทั้งหมดใช้เวลาหนึ่งและเพียงหนึ่งพารามิเตอร์ (แม้ว่าเขาจะผ่อนคลายนี้เล็กน้อยในภายหลังโดยใช้โปรแกรมบางส่วน )
ตัวอย่างที่เขามอบให้คือการกำหนดอินเตอร์เฟส:
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 );
}
}
อาร์กิวเมนต์ที่ Greg ใช้คือการเชื่อมต่อจากแอททริบิวไปยังการใช้งานแอททริบิวต์คือ "เวทย์มนตร์มากเกินไป" เพื่ออธิบายสิ่งที่เกิดขึ้นกับผู้พัฒนารุ่นเยาว์ ตัวอย่างเริ่มต้นคือ "รหัสเพียง" และอธิบายได้อย่างง่ายดาย
ดังนั้นหลังจากการสะสมค่อนข้างนานคำถามก็คือ: เมื่อไหร่ที่คุณจะเปลี่ยนจากวิธีที่ไม่ใช่กรอบของ Greg ไปสู่การใช้บางสิ่งบางอย่างเช่น PostSharp สำหรับ AOP
IConsumes
ชิ้น แทนที่จะต้องใช้ XML ภายนอกหรืออินเทอร์เฟซ Fluent บางอย่าง แต่ยังต้องเรียนรู้สิ่งอื่นอีก เราอาจโต้แย้งว่าวิธีการนี้เป็น "สิ่งที่ต้องเรียนรู้" อีกด้วย