วันอังคารที่ 22 ตุลาคม พ.ศ. 2556

User Control เรียก Method จาก Parent Page ด้วย Reflection

สำหรับคนที่เขียนโปรแกรมด้วย User Control อาจประสบปัญหา เมื่อต้องการส่งข้อมูลจากเพจลูก (Child User Control) ไปยังเพจหลัก (Parent Page)  จะไม่สามารถทำได้ หรือใช้วิธีอื่นๆ แทน เช่น ส่ง Session แทน แต่มันมีวิธีอยู่นะ มาดูตัวอย่างเลยดีกว่า

Parent Page Method

public void DisplayMessage(string message)
{
   Response.Write(message);
}

Child User Control Method

protected void btnSend_Click(object sender, EventArgs e)
{
    this.Page.GetType().InvokeMember("DisplayMessage"/*ชื่อ Method ที่เพจหลัก*/, System.Reflection.BindingFlags.InvokeMethod, null, this.Page, new object[] { txtMessage.Text/*Object ที่ต้องการส่งกลับไป*/ });
}

Credit: ASPSnippets

วันศุกร์ที่ 12 กรกฎาคม พ.ศ. 2556

Naming Convention

ทุกบริษัทมักจะมีมาตรฐานการตั้งชื่อแตกต่างกันไป
แต่ถ้าคุณอยากปรับมาตรฐานของคุณเป็นแบบมาตรฐานสากล
ผมขอแนะนำ มาตรฐานการตั้งชื่อของ Microsoft

ก่อนอื่นแนะนำรูปแบบ Case ก่อน
Case ที่ใช้ในการตั้งชื่อมี 2 แบบ คือ

  • Pascal Case

  • Camel Case
Pascal Case คือ นำคำต่าง ๆ ในชื่อที่จะตั้งมาติดกัน
โดยตัวอักษรแรกของคำเป็นตัวใหญ่ เช่น "PascalCase"

Camel Case ก็จะคล้าย ๆ กับ Pascal Case
แต่ตัวอักษรแรกจะเป็นตัวเล็ก เช่น "camelCase"

อย่างไรก็ตาม ทั้ง Pascal Case และ Camel Case มีจุดที่เหมือนกันคือ

  • ไม่มีเครื่องหมาย ขีดล่าง (_) ระหว่างคำ
ดังนั้น เราจะใช้ คำว่า FirstName แทนคำว่า First_Name

มีกฏง่าย ๆ ว่าเมื่อใหร่จะใช้ Pascal Case หรือ Camel Case

  • ถ้าเป็น Public Member, Type และ Namespace ให้ใช้ Pascal Case

  • Parameter ให้ใช้ Camel Case
กฏการเลือกคำที่จะใช้ตั้งชื่อ

  • อ่านเข้าใจง่าย เช่น LoadDataByXml แทน LoadCommand2

  • ไม่มี Prefix เป็น Type เช่น rowIndex แทน intRowIndex

  • ไม่ใช้คำย่อ เช่น SaveCommand แทน SaveCmd
การตั้งชื่อ Assembly และ Namespace

  • <ชื่อบริษัท>.<ชื่อสินค้า/โครงการ>.<ส่วนประกอบหลัก>[.<ส่วนประกอบย่อย>]
    เช่น Microsoft.WindowsMobile.DirectX
การตั้งชื่อ Class, Struct

  • เป็นคำนาม เช่น ExcelLoader แทน ClassLoadExcel

  • ไม่มี Prefix เช่น ConfigurationManager แทน Cls_Config หรือ CConfig

  • มี Suffix ตาม Class ต่อไปนี้ Attribute, EventArgs, Exception, Dictionary, Stream, Collection, และ Permission เช่น InvalidOperationException
การตั้งชื่อ Interface

  • เป็นคำนาม หรือ คุณศัพท์ เช่น IEnumerable

  • มี Prefix เป็นตัว I ใหญ่
การตั้งชื่อ Delegate

  • Delegate ที่ใช้งานกับ Event ชื่อจะตรงกัน แต่ Suffix ด้วยคำว่า EventHandler เช่น MouseClickEventHandler

  • นอกนั้นอาจเป็นคำนาม หรือกริยา ลงท้ายด้วยคำว่า Callback
การตั้งชื่อ Enum

  • เป็นคำนาม, หากเป็น Flag ให้เป็นคำนามพหูพจน์

  • ไม่มี Suffix เช่น Enum หรือ Flag
การตั้งชื่อ Generic Type Parameter

  • ใช้ตัวอักษร T หรือขึ้นต้นด้วย T เช่น TName, TValue

  • หากมี Generice Type Contraint ให้ตั้งชื่อตาม Contraint เช่น ถ้า Generic Type เป็น Stream ก็ใช้ TStream
การตั้งชื่อ Method

  • ให้ใช้ Verb เช่น CreateDocument
การตั้งชื่อ Property, Field, Parameter

  • เป็นคำนาม หรือ คุณศัพท์ ชื่ออาจจะตรงกับ Type ไปเลยก็ได้ เช่น CacheLevel

  • ถ้า Return Type เป็น Boolean ให้ Prefix ด้วยคำว่า Is, Are, Has, Can เช่น IsReadOnly

  • Parameter ต้องเป็น Camel Case เสมอ
การตั้งชื่อ Event

  • เป็นคำกริยา ถ้าก่อน Method ทำงานเป็นกริยา -ing ถ้าหลัง Method ทำงานแล้วเป็นกริยา -ed เช่น Loading, Loaded
****************************************************
ทีนี้ Microsoft ไม่ได้กำหนดว่าถ้าเป็น Private Member หรือ Local Variable จะต้องตั้งอย่างไร
ถ้าอยากได้ Guideline ก็ขอแนะนำแบบที่นิยมกันครับ

การตั้งชื่อ Private Member

  • ใช้ Camel Case เสมอ

  • ถ้าเป็น Private Field จะมี Prefix เป็นขีดล่าง (_) เช่น _isReadOnly
    (คนที่ใช้ C# บางคนไม่ชอบข้อนี้ แต่ใน VB ไม่สามารถตั้งชื่อเดียวกันได้
    แม้จะใช้คนละ Case เช่น isReadOnly กับ IsReadOnly
    ผมจึงคิดว่า ควรมีขีดล่าง เพื่อเป็นมาตรฐานเดียวกัน)

ส่วนกฏการตั้งชื่อ Local Variable ใช้กฏเดียวกับ Parameter

ทำไมไม่ Prefix ชื่อด้วยตัวย่อ?

การ Prefix ชื่อด้วยตัวย่อ เราเรียกว่า Hungarian Notation
     ตัวอย่างเช่น gWinCurrent, tblEmployer

Hungarian Notation มีตั้งแต่ 40 ปีที่แล้ว (ยุค 70)

จะว่ามันเป็นมาตรฐานอย่างหนึ่งก็ไม่ผิด
Hungarian Notation ทำให้เรารู้ Scope และ Type ของตัวแปรทันทีแค่ดูชื่อ
นอกจากนี้ยังเป็นตัวจัดกลุ่มของตัวแปรอีกต่างหาก

อย่างไรก็ตาม Hungarian Notation มีข้อเสีย ดังต่อไปนี้

  • Compiler เช็ค Type ให้ตั้งแต่ Compile Time อยู่แล้ว ไม่จำเป็นต้องแสดง Type ของตัวแปร

  • Visual Studio มี Tooltip กับ Intellisense ไว้ช่วยแสดงและค้นหา Type ที่ต้องการอยู่แล้ว

  • ทำให้ Code อ่านยากไม่ได้ใจความ เช่น gStrLogin เมื่อเทียบกับ LoginName

  • ชื่อตัวแปรมักจะสื่อถึง Type ของตัวแปรอยู่แล้ว เช่น FirstName เป็น string, IsReadOnly เป็น bool

  • ต้องสร้างมาตรฐานตัวย่อขึ้นมาด้วย ทำให้เพิ่มความซับซ้อนในการตั้งชื่อ

  • และบางทีตัวย่อก็เป็นความชอบส่วนตัว เช่น GroupBox มีหลายแบบ gru, grp, gpb, gbx
อย่างไรก็ตาม หลาย ๆ คนก็ชอบ Hungarian Notation ด้วย 2 เหตุผล

  • เขียนสั้น เช่น txtFirstName สั้นกว่า FirstNameTextBox

  • จัดกลุ่มได้ดีเวลาเรียกใช้ Intellisense เช่น พิมพ์ menu Intellisense ก็จะขึ้น menu ทุกอันมาให้เลือก
ทั้งหมดนี้ เป็นความชอบส่วนตัว ใครชอบแบบไหนไปลองปรับใช้ดูครับ Smiley

Credit: Chaowman