[ Log On ]
แก้ snippet สำหรับ interface property implementation (C#)

ปกติเวลาเราจะ implement property จาก interface แบบอัตโนมัติ (Ctrl+. -> Implement interface) เรามักจะได้ property แบบนี้

public int Id 
{
   get
   {
      throw new NotImplementedException();
   }
   set
   {
      throw new NotImplementedException();
   }
}

แล้วเราก็มักจะต้องมานั่งลบและแก้ไขมันเป็น

public int Id { get; set; }

นับเป็นงานที่ไม่ยาก แต่ทำให้เสียเวลามาก โดยเฉพาะอย่างยิ่งถ้ามี property ที่ต้อง implement เป็นจำนวนมากๆ 

แก้ไขด้วย Regular Expression !!

บางคนแก้ไขปัญหานี้ด้วยการใช้ regular expression เข้ามาช่วย

Find: (?<member>\w+)\s*\{\s*get\s*\{\s*throw\snew\sNotImplementedException\(\);\s*\}\s*set\s*\{\s*throw\snew\sNotImplementedException\(\);s*\}\s*\}

Replace: ${member} { get; set; }

เท่านี้ก็สามารถแก้ไขปัญหาในกรณีที่มี property ที่ implement จำนวนมากได้แล้ว.. แต่ช้าก่อน! แล้วถ้าเรามี class จำนวนมากๆ ล่ะ? การมานั่งใช้ regular expression ก็อาจจะสามารถช่วยลดระยะเวลาการทำงานได้ แต่มันก็ยังไม่ใช่คำตอบที่ถูกต้องซะทีเดียว

แก้ไขด้วยการเปลี่ยน Snippet เป็นคำตอบสุดท้าย!!

การแก้ไขด้วยการเปลี่ยน snippet เป็นการแก้ไขที่รากของปัญหาครับ วิธีการทำง่ายๆ คือ เปิด VS2010 แบบ "Run as Administrator" แล้วไปที่ File > Open เลือกไปที่ C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Refactoring\PropertyStub.snippet แล้วจัดการแก้ไข

<Code Language="csharp">
    <![CDATA[$signature$
{
    $GetterAccessibility$ get
    {
        $end$throw new $Exception$();
    }
    $SetterAccessibility$ set
    {
        throw new $Exception$();
    }
}]]>
</Code>

เป็น

<Code Language="csharp">
    <![CDATA[$signature$ { get; set; }]]>
</Code>

เท่านี้ก็เป็นอันเรียบร้อยแล้วครับ

ใครที่กำลังเขียนโปรแกรมแบบ Interface-based programming ผมแนะนำเลยว่าให้ทำตามขั้นตอนนี้ซะ มันจะย่นระยะเวลาได้มากทีเดียว และนอกจาก PropertyStub.snippet แล้ว คุณสามารถแก้ PropertyStubGet.snippet กับ PropertyStubSet.snippet ได้เช่นเดียวกันครับ

Happy coding ครับ ! :)