วันพฤหัสบดีที่ 18 พฤศจิกายน พ.ศ. 2553

Button และ TextBox

รู้จักกับคลาส, สตรักและอื่นๆ
จากรูปข้างต้นนี้ เพื่อนๆได้เขียนโค้ดเพื่อใช้งานคลาส, สตรัก, ออบเจกต์, พรอเพอร์ตี้, เมธอดและอื่นๆมาแล้ว โปรดสังเกตว่าชื่อ (อักษรนำ) ของมันเหล่านั้นขึ้นต้นด้วยพิมพ์ใหญ่ทั้งสิ้น และถูกระบายเป็นสีฟ้าโดย Visual Studio (เปลี่ยนสีได้ครับ) สำหรับคลาสและสตรัก นอกจากนั้นเป็นสีดำ

คลาส (class) คืออะไร ?
คลาสคือการนิยาม (สร้าง) ไทป์ใหม่ อาจเกิดขึ้นจากการประกอบไทป์เดิมที่มีอยู่แล้ว ภาษา Object Oriented Pogramming (OOP) อย่าง C++ และ Java ล้วนสนับสนุนให้นิยามไทป์ใหม่ทั้งสิ้น

ผมจะไม่เอ่ยถึงการนิยามคลาสตอนนี้นะครับ แต่จะกล่าวถึงการนำคลาสจาก .NET มาใช้งานที่เกี่ยวข้องกับการติดต่อฐานข้อมูล โดยทำเป็น application ตัวอย่างเล็กๆ

การนิยามคลาสภาษา C# จากเพื่อนคนอื่นๆ
- www.codetoday.net

สตรัก (struct) คืออะไร ?
สตรักคือการนิยาม (สร้าง) ไทป์ใหม่เช่นเดียวกับคลาส และคล้ายกับคลาสมาก แตกต่างกันเพียงสตรักเป็น value type ส่วนคลาสเป็น reference type

ผมจะไม่เอ่ยถึงการนิยามสตรักตอนนี้นะครับ หาก application ตัวอย่างอาจมีบางส่วนที่เรียกใช้งานสตรัก เมื่อถึงตอนนั้นจึงค่อยพูดถึงการนิยามสตรักก็แล้วกัน

พรอเพอร์ตี้ (properties) คืออะไร ?
คือคุณสมบัติ เป็นหนึ่งในสมาชิกของคลาสและสตรัก ซึ่งจะกำหนดให้มีหรือไม่ก็ได้ (เราเขียนเอง) พรอเพอร์ตี้มักเป็นสมาชิกแบบ public data (ถ้าไม่เข้าใจให้อ่านผ่านไปก่อนนะครับ) แต่แท้จริงแล้วมันคือเมธอดชนิดพิเศษที่เรียกว่า accessors (สำหรับกำหนดค่าหรือขอค่าของฟิวด์)

เมธอด (method) คืออะไร ?
คือพฤติกรรมหรือกระบวนการ เป็นหนึ่งในสมาชิกของคลาสและสตรัก ซึ่งจะกำหนดให้มีหรือไม่ก็ได้ (เราเขียนเอง) เมธอดเป็นบล็อกของโค้ดที่มีคำสั่งเรียงกัน บล็อกเริ่มต้นจากเครื่องหมาย { และจบที่เครื่องหมาย }

เพื่อนๆหลายคนและผมเองมักสับสนระหว่างฟังก์ชันในภาษา C กับเมธอด แท้จริงแล้วรูปแบบการเขียนแทบไม่แตกต่างกัน แต่ต่างกันที่ความคิดในการออกแบบภาษามากกว่าครับ กล่าวคือ
     เราใช้ฟังก์ชันเพื่อแบ่งโค้ดโปรแกรมใหญ่ออกเป็นโค้ดโปรแกรมย่อยที่สามารถทำงานจบในตัวเองได้ หรือจะเรียกไปยังฟังก์ชันอื่นก็ได้
     ส่วนเมธอดใช้เพื่ออธิบายพฤติกรรมของออบเจกต์ ซึ่งเป็นเอกลักษณ์ของออบเจกต์แต่ละชนิดนั่นเอง เช่น ไก่ต้องขันได้ ขันถือเป็นเมธอดของออบเจกต์ไก่ หรือ สุนัขต้องเห่าได้ เห่าถือเป็นเมธอดของออบเจกต์สุนัข เพื่อนๆคงไม่อาจให้ไก่เห่าหรือเปลี่ยนให้สนุกขันหรอกจริงไหม ?

ออบเจกต์ (object) คืออะไร ?
ในที่นี้ออบเจกต์ หมายถึง พื้นที่ที่ถูกจองในหน่วยความจำหลัก (ซึ่งแบ่งออกเป็นสองส่วนคือ หน่วยความจำหลักส่วน stack และหน่วยความจำส่วน heap) โดยคำสั่ง new

ถ้าใช้คำสั่ง new กับสตรัก จะเกิดออบเจกต์ของกล่อง value ในหน่วยความจำหลักส่วน stack

ถ้าใช้คำสั่ง new กับคลาส จะเกิดออบเจกต์ของกล่อง reference ในหน่วยความจำหลักส่วน heap ครับ

อินสแตนท์ (instance) คืออะไร ?
ในที่นี้อินสแตนท์ หมายถึง ชื่อที่กำหนดเป็นตัวอ้างอิง reference ซึ่งเก็บ address ของออบเจกต์ที่เกิดขึ้นจากคำสั่ง new โดยอาจเป็นอินสแตนท์ของคลาสหรือสตรักก็ได้

เราอาจประกาศอินสแตนท์ไว้ก่อน แล้วค่อยให้ค่ากับมันในบรรทัดถัดไป ตัวอย่าง
     Form form; /*สร้างอินสแตนท์ชื่อ form มีไทป์เป็น Form*/
     form = new Form(); /*ให้ค่า reference กับ form*/

หรือประกาศและให้ค่าทันทีในบรรทัดเดียวกัน ตัวอย่าง
     Form form = new Form();

เมื่ออ้างถึงอินสแตนท์เราสามารถใช้เครื่องหมาย . (dot) เพื่อเข้าถึงสมาชิกพรอเพอร์ตี้หรือเมธอดของออบเจกต์ได้ ตัวอย่าง
     form.BackColor = Color.Pink; /*กำหนดค่าสีชมพูให้กับพรอเพอร์ตี้ BackColor*/
     form.Controls.Add(textBox); /*เพิ่มออบเจกต์ text box โดยเมธอด Add*/

บางครั้งการเรียกอินสแตนท์ว่าออบเจกต์ก็ไม่ผิด ถ้ามันอ้างอิง (reference) ไปยังออบเจกต์นั้นจริง

ตัวแปร (variable) คืออะไร ?
ในที่นี้ตัวแปร หมายถึง ชื่อที่ถูกกำหนดเพื่อใช้อ้างอิงหน่วยความจำหลักส่วน stack โดยค่า (value) ของมันไม่ได้มาจากคำสั่ง new กล่าวคือเป็นการกำหนดค่าคงที่ให้เสียมากกว่า ตัวอย่าง
     int a = 10; /*เรียก a ว่าตัวแปรของไทป์ int*/
แต่ถ้าเขียนเป็น
     int a = new int(); /*เรียก a ว่าอินสแตนท์ของออบเจกต์ int*/

และมักเรียกตัวแปรต่างจากฟิวด์ เนื่องจากมักนิยามให้มันเป็นตัวประเภท local variable ที่ประกาศขึ้นภายในพรอเพอร์ตี้, เมธอดหรือคอนสตรักเตอร์เท่านั้น

คำสั่ง new คืออะไร ?
คำสั่งเพื่อสั่งจองพื้นที่ในหน่วยความจำหลัก มักตามหลังคำสั่งนี้ด้วยคอนสตรักเตอร์

คำสั่ง static คืออะไร ?
คำสั่งเพื่อกำหนดให้ CLR จองหน่วยความจำให้กับสมาชิกที่กำหนด static ทันที แม้ว่าพื้นที่ดังกล่าวจะถูกเรียกไปใช้หรือไม่ก็ตาม เรียกอีกอย่างว่าสมาชิกแบบ global (ใช้ร่วมกัน)

ตัวอย่างการประกาศและใช้งานสมาชิก static จะกล่าวถึงในโอกาสต่อไปครับ

***หมายเหตุ
- ฟิวด์ (field) หมายถึง สมาชิกของคลาสหรือสตรัก (ภาษาจาวาเรียกว่า แอตทริบิวต์ (attribute)) สำหรับเก็บค่า (value) ข้อมูล ซึ่งเพื่อนๆจะเห็นชัดเมื่อกล่าวถึงเรื่องการนิยามคลาสหรือสตรัก
- คอนสตรักเตอร์ (constructor) หมายถึง เมธอดพิเศษในคลาสหรือสตรัก และจะทำงานอัตโนมัติเมื่อเราสร้างออบเจกต์ด้วยคำสั่ง new ซึ่งเพื่อนๆจะเห็นชัดเมื่อกล่าวถึงเรื่องการนิยามคลาสหรือสตรัก

รู้ได้อย่างไรว่าคำไหนเป็นคลาสหรือเป็นสตรัก ?
เมื่อใช้เครื่องมือเขียนโค้ดจาก Microsoft Visual Studio ให้ลองเอาเมาส์แตะที่ชื่อคลาสหรือสตรักที่สงสัย
รูปด้านล่าง เพื่อนๆจะเห็นว่า Form เป็นคลาส

รูปด้านล่าง เพื่อนๆจะเห็นว่า Color เป็นสตรัก


Visual Studio ใช้สัญลักษณ์ช่วยแยกแยะไทป์แต่ละประเภท
โปรดสังเกตรูปสัญลักษณ์ภายในวงกลม (หรือรี) เหล่านี้

เพราะในขณะที่เพื่อนๆเขียนคำสั่ง เจ้า pop up ช่วยเหลือนี้จะปรากฏขึ้นมาทุกครั้ง
หากไม่ปรากฏ ต้องแน่ใจว่า cursor อยู่ในตำแหน่งเหมาะสมแล้วกด Ctrl + Space bar

ขอแค่ส่งไทป์ให้ตรงกันก็ชนะไปกว่าครึ่งทางแล้ว!
อย่างที่เราทราบกันว่าไลบรารี .NET ประกอบด้วยไทป์ทั้งนั้น
ตัวอย่าง รูปด้านล่างนี้เลือกใช้เมธอด Run เพื่อสร้างชิวิต (กระตุ้น thread) ให้กับออบเจกต์ของคลาส Form

ดังนั้นเมื่อไทป์ของอินสแตนท์ form ตรงกับไทป์ของพารามิเตอร์ของเมธอด Run มันจึงยอมรับ
***สังเกต รูปด้านบนนี้เราสามารถใช้เมาส์คลิกที่สามเหลี่ยมในวงกลม เพื่อเลือกไทป์หรือลำดับไทป์ของพารามิเตอร์ของเมธอด Run ได้

P13_ButtonAndTextBox
- สร้างโปรเจ็กค์ใหม่เพิ่มเข้าไปยังโซลูชัน CsharpTutorialForFriends เหมือนเคย
- ตั้งชื่อมันว่า P13_ButtonAndTextBox
- เพิ่ม References ชื่อ System.Windows.Forms และ System.Drawing
- โค้ดเพิ่มดังนี้

- ผลลัพธ์

แบบฝึกหัด
- จากโค้ดจงแยกแยะคำสั่งออกเป็น
     คลาส ได้แก่ ?
     สตรัก ได้แก่ ?
     พรอเพอร์ตี้ ได้แก่ ?
     เมธอด ได้แก่ ?
     ออบเจกต์ ได้แก่ ?
     อินสแตนท์ ได้แก่ ?

3 ความคิดเห็น:

  1. Hi there, just wanted to say, I liked this blog post.

    It was inspiring. Keep on posting!

    Also visit my blog post ... best cellulite treatment

    ตอบลบ
  2. Thanks , I have recently been searching for info about this topic for ages and yours is the greatest I have found out till now.
    However, what concerning the bottom line? Are you certain concerning the source?


    My page: natural cellulite treatment

    ตอบลบ
  3. ยอดเยี่ยมจริงๆ ครับ

    ตอบลบ