Monthly Archives: มีนาคม 2007

ตอน 36 สิ่งที่ต้องใช้เพื่อการพัฒนา ASP.NET

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

สิ่งที่ต้องใช้เพื่อการพัฒนา ASP.NET

เมื่อเราเขียนและทดสอบ web app เสร็จแล้ว เมื่อจะเปิดใช้งานจริงเราจะนำ web app ของเราไปติดตั้ง (deploy) ใน server เพื่อให้ผู้ใช้จากทั่วโลกสามารถใช้งาน web app ของเราได้ โดยใน server ที่เราไปติดตั้งนั้นจะต้องมีสิ่งต่างๆ ที่จำเป็นต่อการทำงานของ ASP.NET web app อยู่แล้ว web app ของเราจึงจะสามารถทำงานได้

โดยทั่วไปแล้วเราเขียนและทดสอบ web app ในเครื่องของเราเอง ดังนั้นเราจึงต้องจำลองเครื่องของเราให้เป็นเหมือน server ด้วย ซึ่งในเครื่องของเราต้องมีโปรแกรมต่างๆ ดังนี้

  • web server : หากท่านใช้ Windows XP ก็จะหมดปัญหาเรื่องนี้ เพราะอันที่จริง Windows XP ก็คือ Windows NT รุ่นล่าสุดที่มี server และ service ต่างๆ มาให้ครบ รวมทั้ง IIS ด้วย
  • .NET Framework : เราต้องติดตั้ง .NET Framework ซึ่ง download ได้ฟรีจากเว็บไซต์ของไมโครซอฟท์ ในหนังสือนี้จะอ้างถึง version 2.0 เป็นหลัก
  • สิทธิในการใช้เครื่อง : คือมีสิทธิที่จะปรับตั้งการรักษาความปลอดภัยของไฟล์หรือ folder ในเครื่องนั้นให้รันโปรแกรมได้ อ่าน-เขียนได้ ถ้าคุณเป็นเจ้าของเครื่อง และไม่ได้ใช้ folder ใน network share ก็จะมีสิทธิทำได้อยู่แล้ว
  • หากต้องการใช้ฐานข้อมูลแบบ Microsoft SQL Server ก็ต้องติดตั้งโปรแกรม Microsoft SQL server ไว้ด้วย (ตัวอย่างในหนังสือเล่มนี้จะใช้ access database file จึงไม่จำเป็นต้องติดตั้ง MS-SQL server)
  • หากต้องการให้โปรแกรมสามารถส่ง email ได้ต้องติดตั้ง SMTP server ไว้ด้วย

 

สรุปเรื่องสิ่งที่ต้องใช้เพื่อการพัฒนา ASP.NET

  • เครื่อง server ต้องมีโปรแกรม Windows Server (จะใช้ XP หรือ Vista ก็ได้) IIS และ .NET Framework ติดตั้งไว้
  • เครื่อง client มีเพียง web browser (เช่น Internet Explorer, Opera หรือ Mozilla FireFox) ก็สามารถเปิดหน้าเว็บแบบ ASP.NET ได้

 

โครงสร้างเว็บไซต์ ASP.NET

โครงสร้างในที่นี้หมายถึงโครงสร้างของการเก็บไฟล์และ folder แม้เราจะเก็บไฟล์โดยจัดโครงสร้าง folder อย่างไรก็ได้ แต่ ASP.NET ได้กำหนดโครงสร้างที่เป็นธรรมเนียมปฏิบัติไว้เพื่อความเป็นระเบียบเรียบร้อยและความสะดวกของผู้พัฒนา web app ดังนี้

  • หน้า default: หน้า default เหมือนหน้า index.htm หรือ homepage เป็นหน้าที่จะถูกเรียกให้ทำงานโดยอัตโนมัติเมื่อผู้ใช้ป้อนพิมพ์ URL เว็บไซต์ของท่าน หากท่านไม่ระบุเป็นอย่างอื่น หน้า default จะเป็นไฟล์ชื่อ default.aspx
  • App_browsers: เป็น folder เก็บไฟล์นามสกุล .browser ซึ่ง ASP.NET ใช้เก็บลักษณะเฉพาะและข้อจำกัดของ browser ต่างๆ
  • App_Code: เป็น folder ทำหน้าที่เก็บ source code พวกโปรแกรม utility หรือคลาส หรือ object ต่างๆ (เช่นไฟล์นามสกุล .cs, .vb, และ .jsl)
  • App_Data: เป็น folder ที่ใช้เก็บไฟล์ข้อมูลทั่วไปเช่น MDF, XML และฐานข้อมูล
  • App_GlobalResources: เป็น folder ใช้เก็บไฟล์แบบ resources (คือไฟล์นามสกุล .resx และ .resources) ที่เป็นส่วนกลางของทั้งโปรแกรม
  • App_LocalResources: เป็น folder ใช้เก็บไฟล์แบบ resources (คือไฟล์นามสกุล .resx และ .resources) ที่เป็นของเฉพาะหน้าใดหน้าหนึ่งหรือ user control ตัวใดตัวหนึ่ง
  • App_Themes: เป็น folder ใช้เก็บไฟล์แบบ .skin, .css และไฟล์ภาพที่ใช้ประกอบกันเพื่อกำหนด Theme และ Skin ของเว็บไซต์
  • App_WebReferences: เป็น folder ใช้เก็บไฟล์แบบ .wsdl, .xsd และ .discomap ไฟล์สามชนิดนี้ทำหน้าที่เก็บข้อมูลเกี่ยวกับ web service
  • Bin: เป็น folder ใช้เก็บไฟล์แบบ .dll ซึ่งเป็น assembly ที่ถูกคอมไพล์เป็น MSIL แล้ว ปรกติแล้วจะเป็น control หรือ component หรือโค้ดอื่นๆ ที่โปรแกรมต้องใช้อ้างถึง (shared code)

 

โครงสร้าง directory (โฟลเดอร์) ต่างๆ ของเว็บไซต์ ASP.NET ชื่อเหล่านี้เป็นชื่อมาตรฐานที่ ASP.NET รับรู้

 

สรุปเรื่องโครงสร้างเว็บไซต์ ASP.NET
• โครงสร้างการเก็บไฟล์ของเว็บไซต์แบบ ASP.NET มี folder ที่มีชื่อเฉพาะถูกกำหนดไว้แล้ว
• ไฟล์ assembly (ไฟล์นามสกุล .dll) ต้องถูกเก็บไว้ในโฟลเดอร์ Bin
• เราอาจเก็บไฟล์ฐานข้อมูลแบบ access ไว้ในโฟลเดอร์ App_Data หรือ โฟลเดอร์ที่อยู่ภายนอกเว็บไซต์ก็ได้

ตอนต่อไป : ไฟล์ชนิดต่างๆ ใน ASP.NET

Advertisements

ตอน 1 การเขียนโปรแกรมแบบ OOP

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

ดีบักคือการกำจัดบัก โปรแกรมมิ่งคือการนำมันใส่เข้าไป
John Moore

บทที่ 1 การเขียนโปรแกรมแบบ OOP

สาเหตุที่ผู้เขียนนำหัวข้อ “การเขียนโปแกรม แบบ OOP” มาไว้เป็นบทแรกก็เพราะหนังสือเล่มนี้จะสอนภาษา C# และการสร้างเว็บไซต์ catalog สินค้าด้วย ASP.NET โดยเน้นที่การคิดและการปฏิบัติแบบ OOP ทำให้มีคำศัพท์ คำจำกัดความ และแนวคิดหลายอย่างเกี่ยวกับ OOP ที่ท่านจำเป็นต้องรู้ก่อน จึงจะเข้าใจเนื้อหาส่วนใหญ่ในบทต่อๆ ไปได้

หัวข้อที่ท่านจะได้เรียนในบทนี้คือ
• ความหมายของ OOP
• คลาสกับ object
• object กับ type
• การใช้งาน object
• ความเป็นมาของ OOP
• OOP วิธีคิดใหม่ในการสร้างซอฟท์แวร์
• Object based programming
• Object Oriented Programming
• Encapsulation
• Inheritance
• Polymorphism
• OOP กับ Microsoft .NET Framework

ความหมายของ OOP

OOP (ย่อจาก Object Oriented Programming การเขียนโปรแกรมแบบวัตถุวิธี) เป็นรูปแบบ (Paradigm) หรือแนวคิดอย่างหนึ่ง อันมีจุดมุ่งหมายเพื่อการสร้างซอฟท์แวร์ คำว่า Object ในที่นี้หมายถึงวัตถุ หรือสิ่งของที่จับต้องได้ ไม่ได้หมายถึงวัตถุประสงค์ จุดมุ่งหมาย หรือกรรม (ผู้ถูกกระทำ อย่างประธาน กริยา และกรรม ในรูปประโยค)

มีผู้ตีความว่าแนวคิดนี้คือ “การเขียนโปรแกรมโดยมุ่งที่เป้าหมาย (มิได้เน้นที่กระบวนการ)” ผู้เขียนเห็นว่าการตีความดังกล่าวไม่สู้จะถูกต้อง เพราะการเขียนโปรแกรมตามลัทธินี้มีการสร้าง object ขึ้นจริง แม้จะเป็น object อันจับต้องไม่ได้ เพราะอยู่ในสภาพซอฟท์แวร์ แต่ก็มีเจตนาจะเลียนแบบ object ที่เป็นรูปธรรมอย่างเต็มที่

เรื่อง OOP เป็นเรื่องของ object ดังนั้นสิ่งแรกที่ต้องรู้คือความหมายของคำว่า object นิยามของ object คือ “หน่วยหนึ่งของโปรแกรมซึ่งมีหน้าที่การทำงานอันเฉพาะเจาะจง และถูกกำหนดปฏิสัมพันธ์กับโปรแกรมหน่วยอื่นๆ ไว้อย่างแน่ชัด” ในภาษา C# เราสร้าง object จากคลาส

 

คลาสกับ object

คลาสกับ object เป็นสองสิ่งที่มีความเกี่ยวข้องกันโดยตรง คลาสคือโค้ดที่เราเขียนขึ้นเพื่อทำหน้าที่เป็นพิมพ์เขียวของ object การสร้าง object จากคลาสเรียกว่าการทำ instantiation การสร้าง object จากคลาส เทียบได้กับการทำขนมครกสิงคโปร์ เตาขนมจะมีหลุมหลายหลุม แต่ละหลุมมีลวดลายไม่เหมือนกัน ขนมครกที่ได้จากแต่ละหลุมจึงมีรูปร่างต่างๆ กัน คลาสคือหลุมหนึ่งหลุม ขนมครกที่ได้คือ instance ของคลาส หรือ object

เราเรียก object หนึ่ง object ว่าหนึ่ง instance เราสามารถสร้าง object ได้หลายๆ instance จากคลาสเพียงคลาสเดียว จากตัวอย่างขนมครกสิงคโปร์ ในวันหนึ่งๆ แม่ค้าจะทำขนมครกได้เป็นจำนวนมากจากหลุมแต่ละหลุม ส่วนในภาษา C# หากเราสร้างคลาสหนึ่งคลาส ยกตัวอย่างเช่น เป็นคลาสเพื่อนิยาม node หลังจากนั้นเราอาจเขียนโปรแกรมสร้าง binary tree ซึ่งขณะทำงานมันอาจจะสร้าง object จากคลาส node ได้หลายล้าน instance ภายในหนึ่งวินาที

 

คลาสหนึ่งคลาสใช้สร้าง object ได้จำนวนมาก แม้ object แต่ละตัวจะมีคุณสมบัติและการทำงานเหมือนกันหมด แต่ object แต่ละตัวจะมีสถานะและข้อมูลเป็นของตัวเองโดยไม่ขึ้นกับคลาสหรือ object อื่นๆ

การใช้งานคลาสทำได้สองวิธี วิธีแรกคือการนำไปใช้สร้าง object และใช้งานผ่าน object ดังที่อธิบายไปแล้ว อีกวิธีหนึ่งคือเรียกใช้โดยตรงโดยไม่ต้องสร้าง object เรียกว่า static class แม้การใช้งานคลาสวิธีนี้จะไม่มี object ทำให้ดูเหมือนไม่เป็นหลักการ OOP แต่ในบางสถานการณ์ก็ถือว่ามีความเหมาะสมดี

 

object กับ type

เรื่องของ type เป็นเรื่องสำคัญในวิชา OOP ในหนังสือนี้ท่านจึงจะพบคำว่า type อยู่เสมอ จึงมีความจำเป็นที่ท่านจะต้องทำความเข้าใจความหมายของคำว่า type ให้ตรงกับความหมายใน OOP และภาษา C# ก่อน

ในภาษาที่ไม่ใช่ภาษา OOP อย่างภาษา C มี type ต่างๆ เตรียมไว้ล่วงหน้า เช่น int (จำนวนเต็ม) float (จำนวนมีทศนิยม) char (ตัวอักษร) เป็นต้น type เหล่านี้คือชนิดของข้อมูล ยกตัวอย่างเช่นเมื่อเราเขียนโค้ดว่า

int foo;

ซึ่งทำหน้าที่นิยามตัวแปรชนิดจำนวนเต็ม compiler (ตัวแปลภาษา) จะรู้ทันทีว่าควรทำเช่นใดกับตัวแปรชนิดนี้ เพราะ int เป็น type ที่ถูกกำหนดไว้ล่วงหน้าแล้ว (ภายในตัว compiler ภาษา C) เรียกว่า build-in type (หรือ primitive type หรือ abstract data type ก็ว่า)

ภาษา C รับรู้ type อยู่จำนวนหนึ่ง หากเราพบว่า type ที่มีมาให้ไม่สามารถตอบสนองต่อความต้องการของเราได้ เราสามารถนิยาม type ขึ้นเองได้ เรียกว่า user defined data type (ต่อไปจะเรียกย่อว่า UDT) โดยใช้ structure

ยกตัวอย่างการสร้าง structure ชื่อ record เพื่อเก็บข้อมูลนักเรียนเป็นดังนี้

    public struct record
    {
        public char cname;
        public char sname;
        public char exam;
        public char grade;
    }

จะเห็นว่าการสร้าง UDT ด้วย structure คือการนำ type ที่มีอยู่มาผสมกันเพื่อให้ได้เป็น type ใหม่

คลาสก็เหมือน structure เรานิยามคลาสเพราะเราต้องการสร้าง UDT ขอใช้อุปมาขนมครกสิงค์โปรอีกครั้ง ขนมครกสิงค์โปรหนึ่งเตาจะมีหลายหลุม แต่ละหลุมมีลวดลายต่างกัน เช่นหลุมหนึ่งมีลายเป็นปลา อีกหลุมหนึ่งมีลายเป็นหอย ขนมครกที่ได้จากหลุมแต่ละหลุมจึงมีรูปร่างต่างกัน หรือมี type ต่างกัน สิ่งที่ทำให้ type ของขนมครกแตกต่างกันคือตัวหลุม

หลุมแต่ละหลุมบนขนมครกสิงค์โปรเทียบได้กับคลาสหนึ่งคลาส จุดมุ่งหมายในการนิยามคลาสก็เหมือน structure คือเราต้องการสร้าง type ใหม่ object ที่ถูกสร้างจากคลาสจะมี type ตามที่คลาสนั้นได้นิยามไว้

 



การนิยามคลาสใหม่ทำให้เราได้ type ใหม่ object ที่ถูกสร้างจากคลาสต่างกันจะมี type แตกต่างกัน ยกตัวอย่างเช่น object ที่สร้างจากคลาส Star จะมี type เป็น Star ขณะที่ object ที่ถูกสร้างจากคลาส Hexagon จะมี type เป็น Hexagon

 

ภาษา C# สนับสนุนการสร้าง type ใหม่อย่างพิสดาร เมื่อนิยามแล้ว UDT กับ build-in type จะมีศักดิ์ศรีเสมอกัน (คือ compiler จะปฏิบัติต่อ type ที่เราสร้างในลักษณะ first class เช่นเดียวกับ build-in type).NET Framework library เองก็เป็นแหล่งรวม type หลายพัน type ที่เราสามารถนำมาประกอบเป็น type ใหม่ที่มีการทำงานซับซ้อนได้อย่างสะดวกรวดเร็ว

การเขียนโปรแกรมแบบ OOP เราจะใช้เวลาส่วนมากไปกับการออกแบบและนิยาม type ขึ้นใหม่เพื่อนำไปใช้สร้าง object ต่างๆ เมื่อนำ object ทั้งหมดมาประกอบเข้าด้วยกัน เพื่อให้ทำงานร่วมกัน จะทำให้โปรแกรมของเราสร้างผลลัพธ์ได้ตามความประสงค์

 

การใช้งาน object

การใช้งาน object ต้องทำได้ง่าย เราอาจมองว่า object เป็น “กล่องดำ” ในทางวิทยาศาสตร์เราจะเรียกอุปกรณ์ที่เราสามารถนำมาใช้ประโยชน์ได้ โดยไม่จำเป็นต้องรู้รายละเอียดการทำงานภายในของมันว่า กล่องดำ ยกตัวอย่างเช่นโทรศัพท์ เรานำมันมาใช้ประโยชน์เพื่อการสื่อสารได้ โดยไม่จำเป็นต้องรู้ว่ามันทำงานได้อย่างไร เช่นเดียวกัน ในภาษา C# เราสามารถนำ object มาใช้งานได้โดยไม่จำเป็นต้องรู้ว่ามันมี source code ภายในเป็นอย่างไร

เมื่อเราต้องกาเรียกให้ object ทำงานบางอย่างเราจะเรียก method ของมัน ยกตัวอย่างเช่นโทรศัพท์มี method คือการโทรฯ ออก การวางสาย การพักสาย การบันทึกเลขหมายฯ ในภาษา C# เราจะนิยาม method เหล่านี้โดยการเขียนโค้ดหนึ่งชุด คล้ายการนิยามฟังก์ชันในภาษา C

object จะผนวกกระบวนการ (method) และข้อมูล (information) ไว้ภายในตัวของมันเอง จากตัวอย่างโทรศัพท์เก็บเลขหมายที่เราบันทึกไว้ โดยเราไม่จำเป็นต้องรู้ว่ามันเก็บไว้ที่ไหนอย่างไร เรารู้เพียงวิธีดึงเลขหมายที่บันทึกไว้ออกมาใช้งานก็พอ ในภาษา C# object จะเก็บข้อมูลภายในไว้ใน field (คือตัวแปรท้องถิ่นของคลาส) โปรแกรมที่เรียกใช้ object ไม่จำเป็น (และไม่สามารถ) เข้าถึงหรือเปลี่ยนแปลงข้อมูลใน field ได้โดยตรง แต่สามารถเข้าถึงทางอ้อมได้ผ่านส่วนเชื่อมต่อที่เรียกว่า property

ภาษา C# สนับสนุนหลักการทุกรูปแบบในลัทธิ OOP โดยหลักการนี้ มีเรื่องหลัก 3 หัวข้อที่ท่านจำเป็นต้องเข้าใจ คือ
• Encapsulation: การห่อหุ้มวิธีการและข้อมูลไว้ภายในหน่วยหนึ่งๆ
• Inheritance: การสืบทอดคุณสมบัติ
• Polymorphic: การแปรคุณสมบัติ

ผู้เขียนจะอธิบายหลักการแต่ละหัวข้อต่อไปในบทนี้

 

ความเป็นมาของ OOP

แนวคิด OOP ไม่ใช่ของใหม่ แต่มีมาพร้อมๆ กับการเริ่มต้นของวิทยาการคอมพิวเตอร์ ในปี ค.ศ. 1960 นักเขียนโปรแกรม คิดค้นภาษา Simula (อ่านว่าซิมูลา) สำหรับเครื่อง UNIVAC ซึ่งเป็นภาษาแรกที่มีคุณสมบัติในการทำ OOP และอีกสามปีต่อมา นักศึกษาที่สถาบัน MIT อีวาน ซัทเธอร์แลนด์ (Ivan Sutherland) สร้างซอฟท์แวร์ชื่อ Sketcpad เป็นโปรแกรมประยุกต์ทำหน้าที่ช่วยการออกแบบ (CAD) มันเป็นโปรแกรมแรกที่นำ “การปฏิสัมพันธ์กับผู้ใช้ด้วยภาพ” (Graphic User Interface หรือ GUI) มาใช้อย่างสมบูรณ์ และการออกแบบสร้างก็ทำโดยใช้หลักการ OOP อย่างเต็มรูปแบบ

การพัฒนาภาษา Simula สำหรับเครื่อง UNIVAC ในปี ค.ศ. 1960

ดูเหมือนว่าวิวัฒน์ของ OOP และ GUI จะเกี่ยวพันกันอยู่เสมอเพราะต่อมาในปี ค.ศ. 1970 เมื่อศูนย์วิจัยของซีร็อกซ์ ที่ พาโล-อัลโต ต้องการสร้างระบบปฏิบัติการแบบ GUI (ที่ต่อไปจะเป็นบรรพบุรุษของ Mac OS และ Microsoft Windows) ทีมนักวิจัยได้สร้างภาษาใหม่ชื่อ Smalltalk (สมอลทอล์ค) เพื่อให้เหมาะกับการเขียนโปรแกรมแบบ GUI ภาษานี้ได้รับอิทธิพลจากภาษา Simula อย่างมาก

ภาษา Smalltalk บนเครื่อง Alto ในปี ค.ศ. 1970

แนวคิด OOP เริ่มเบ่งบานเต็มที่ในช่วงกลางทศวรรษ 1980 เมื่อบริษัทแอปเปิลและบริษัทไมโครซอฟท์ต่างผลิตระบบปฏิบัติการที่เป็น GUI ออกสู่ท้องตลาด และมีภาษาแบบ OOP เกิดขึ้นใหม่จำนวนมาก เช่น ภาษา Objective C, Modula-2 และ Eiffel แนวคิด OOP ขึ้นถึงจุดสุดยอดใน ค.ศ. 1983 เมื่อ Bjarne Stroustrup นักวิทยาศาสตร์แห่งห้องทดลอง เบลล์ ได้สร้างภาษา C++ ซึ่ง Bjarne ให้นิยามว่าเป็น “ภาษาซีที่มีคลาส”

Bjarne Stroustrup ผู้สร้างภาษา C++

 

ตอนต่อไป : OOP วิธีคิดใหม่ในการสร้างซอฟท์แวร์

คำนำ


ไปหน้าแรก      สารบัญ        Laploy.com    ระเบียนบทความ      บทความจากลาภลอย


เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

สำหรับท่านผู้อ่านบล็อกต้องการซื้อหนังสือแต่หาซื้อไม่ได้
ขอเรียนว่าตอนนี้ก็เหลือน้อยแล้ว ซีเอ็ดบุ๊คบางสาขาก็ไม่มีออเดอร์มา
เพราะเริ่มขายช้าลง ทาง ผจก. ร้านก็ต้องพิจารณาเลือกหนังสือใหม่ๆ แรงๆ
ไปวางขายแทน ถ้าต้องการทราบว่าสาขาไหนมีวางขายบ้าง ก็คงต้องแนะนำให้เข้าไปที่เว็บไซต์ แล้วคลิกเลือกสาขาที่มีวางขาย ก็จะแสดงร้านหนังสือที่มีวางขายออกมาพร้อมเบอร์โทรฯ ครับ หรือจะสั่งซื้อทางเว็บ (www.se-ed.com) จะสะดวกที่สุด

คำนำ

หนังสือเล่มนี้คือทางเลือกสำหรับผู้ที่ต้องการเรียนรู้วิธีคิด และวิธีเขียนโค้ดแบบ OOP แต่ไม่ต้องการเข้าอบรมในชั้นเรียน หากท่านอ่านหนังสือเล่มนี้อย่างตั้งใจ และทำแบบฝึกหัดต่างๆ โดยครบถ้วน ท่านก็จะเข้าใจหลักการ OOP สามารถเขียนโปรแกรมตามแนวคิด OOP และมีพื้นความรู้เพียงพอแก่การศึกษาในระดับสูงต่อไป

ในหนังสือเล่มนี้ ท่านจะได้เรียนรู้เรื่องที่สำคัญอย่างยิ่งต่อวิชาชีพซอฟท์แวร์ในอนาคตสามเรื่องคือ .NET Framework, วิธีสร้าง Web Application และการเขียนโปรแกรมภาษาด้วย C#

โปรดตรวจดูหัวข้อต่อไปนี้ว่ามีหัวข้อใดตรงกับความคิดของท่านหรือไม่

  • ท่านคือนักเขียนโค้ดแบบเดิมๆ ที่ต้องการเปลี่ยนวิธีทำงานมาเป็นแบบ OOP 
  • เป็นบุคคลทั่วไปที่สนใจ และต้องการศึกษาหลักการ OOP 
  • ต้องการเรียนวิธีสร้าง web application แบบ ASP.NET2.0 โดยใช้ภาษา C# 
  • นักเขียนโค้ดภาษา VB ที่ต้องการเริ่มเรียนภาษา C#
  • นักเขียนโค้ดที่เขียนโปรแกรมมาหลายปีแล้ว แต่ยังไม่สามารถเปลี่ยนวิธีคิดให้เป็น OOP ได้ 
  • หากท่านเขียนโค้ดภาษาใดภาษาหนึ่งเป็นแล้ว (เช่น C, C++, JavaScript, VBScript, PHP, Lingo และ ActionScript) แต่ต้องการเปลี่ยนมาเขียนภาษา C#
  • เป็นนักเขียนโค้ดภาษา Java ที่ต้องการเปลี่ยนสายมาเขียน C#
  • ท่านเขียนภาษา C# ได้ แต่ไม่เข้าใจ OOP และอยากเข้าใจ
  • ต้องการเขียนโปรแกรมเพื่อใช้งานฐานข้อมูลแบบ Access, MS-SQL และ MySQL โดยใช้หลักการ OOP
  • ต้องการหัดสร้าง web application ตามหลักการ OOP

หากท่านมีคุณสมบัติตรงตามหัวข้อใดหัวข้อหนึ่งข้างบนนี้ นี่คือหนังสือที่ท่านกำลังมองหา

ปกหน้าด้านนอกของหนังสือ เรียนรู้ด้วยตนเอง OOP C# ASP.NET

 

เป้าหมายของหนังสือเล่มนี้

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

คุณสมบัติและจุดมุ่งหมายของหนังสือเล่มนี้มีดังต่อไปนี้

  • ช่วยให้ท่านเข้าใจหลักการ OOP สามารถคิดเป็น OOP และเขียนโปรแกรมตามหลักการ OOP ได้ 
  • ภาคทฤษฏีสอน OOP โดยอ้างอิงภาษา C# เป็นหลัก แต่จะกล่าวเปรียบเทียบกับภาษา VB.NET, Java และ C++ ด้วย ทำให้ผู้ที่รู้ภาษาดังกล่าวปรับตัวได้ง่ายขึ้น
  • มีภาพประกอบพร้อมคำอธิบายจำนวนมาก เพื่อให้ท่านเข้าใจหลักการต่างๆ ได้ง่ายขึ้น
  • อธิบายคุณสมบัติที่เกี่ยวข้องกับ OOP ทั้งหมดของภาษา C# พร้อมแสดงวิธีนำไปใช้
  • แสดงตัวอย่างเป็น source code ที่สามารถนำไปใช้งานได้จริง
  • แสดงวิธีสร้าง object ที่สามารถนำกลับมาใช้ใหม่ได้ตามหลักการ OOP
  • แสดงวิธีหุ้มฐานข้อมูล access, MySQL และ MS-SQL เพื่อใช้งานในลักษณะ object
  • เพาะนิสัยการเขียนโค้ดภาษ C# ตามจารีต (best practice) โดยยึดตามแนวทางที่ระบุไว้ในมาตรฐาน ECMA-334 และฝึกตามแนวของท่าน Hejlsberg (บิดาแห่งภาษา C#) 
  • หนังสือเล่มนี้ไม่ใช่หนังสือสอนวิชาคอมพิวเตอร์ระดับเบื้องต้นที่สุด หากท่านยังไม่เคยเขียนโปรแกรมมาก่อนเลย ท่านควรอ่าน หรือเรียกการเขียนโปรแกรมเบื้องต้นก่อนเล็กน้อย เช่นสมัครเรียนภาษา C, VB, PHP หรือ JavaScript สักหนึ่งคาบวิชา
  • หนังสือเล่มนี้ไม่ใช่หนังสือสอนภาษา C# ระดับก้าวหน้าที่สุด หากท่านเป็นนักเขียนโค้ดระดับก้าวหน้าที่สุด ท่านอาจพบว่าหนังสือเล่มนี้ไม่มีเนื้อหาที่ให้ความรู้อันใดแก่ท่านเลย
  • ภาษา C# ที่สอนในหนังสือเล่มนี้คือ C#2.0 และครอบคลุมส่วนเพิ่มเติมใน C#3.0 ด้วย

หนังสือนี้แม้จะครอบคลุมเนื้อหาเบื้องต้น ระดับกลาง และระดับก้าวหน้าของภาษา C# ไว้ทั้งหมด แต่มันก็ไม่ใช่หนังสือที่สอนไวยากรณ์ในภาษา C# (เช่น ไม่สอนว่าคำสั่ง if else ใช้อย่างไร คำสั่ง do while มี syntax อย่างไรเป็นต้น) หากท่านต้องการหนังสือที่มีรายละเอียดทุกคำสั่งในภาษา C# ผู้เขียนขอแนะนำหนังสือชื่อ The C# Programming Language (Hejlsberg สำนักพิมพ์ Addison Wesley) หรือศึกษาได้จากเอกสาร และเว็บไซต์ MSDN (Microsoft development network)

 

วิธีใช้หนังสือเล่มนี้

ภาคหนึ่งคือบทที่ 1 ถึงบทที่ 6 เป็นภาคทฤษฏี ท่านควรหาสถานที่เงียบสงบแล้วใช้สมาธิในการอ่านแต่ละบทโดยไม่รีบร้อน เมื่ออ่านจบแต่ละบทให้ทำส่วนตอบคำถามท้ายบท หากทำข้อใดไม่ได้ให้อ่านทบทวนบทนั้นอีกครั้ง ทำซ้ำเช่นนี้จนสามารถตอบคำถามได้ทุกข้อจึงจะนับว่าเข้าใจเนื้อหาในบทนั้น

แม้บทที่ 1 ถึงบทที่ 6 จะเป็นภาคทฤษฏี แต่ท่านก็ควรป้อนพิมพ์โค้ดตามตัวอย่าง และลองคอมไพล์เพื่อดูผลลัพธ์การทำงานของโปรแกรมด้วย หลักจากนั้นลองดัดแปลงโค้ดให้แปลกออกไปจากตัวอย่าง เพื่อดูว่าจะเกิดอะไรขึ้น เช่นเขียนโค้ดขึ้นใหม่โดยใช้ชื่อตัวแปรที่ท่านกำหนดขึ้นเอง หรือเปลี่ยนแปลงเงื่อนไขของโปรแกรม จะทำให้ท่านเข้าใจเนื้อหาได้ดีขึ้น

ภาคสองเป็นภาคปฏิบัติ ท่านจะต้องติดตั้ง IDE และ compiler ตามที่แนะนำในหัวข้อถัดไป ทดลองคอมไพล์โปรแกรมเพื่อให้แน่ใจว่าการติดตั้งสมบูรณ์ โปรแกรมต่างๆ สามารถทำงานได้ทั้งในส่วน client และ server

เมื่ออ่านแต่ละบทจบแล้ว ท่านควรจะป้อนพิมพ์โค้ดเพื่อสร้างคลาสต่างๆ ที่เรียนไปในบทนั้น ทดสอบการทำงาน และดีบักข้อบกพร่องที่อาจเกิดจากการป้อนพิมพ์ หากไม่สามารถแก้ไขได้ ให้ download โค้ดของบทนั้น (จากเว็บไซต์ที่ระบุในหัวข้อถัด) ไปนำมาเปรียบเทียบหาข้อบกพร่อง หากท่านหาความผิดพลาดไม่พบ หรือมีสิ่งที่ไม่เข้าใจ ให้อ่านทบทวนบทนั้นอีกครั้ง ถ้ายังไม่สามารถแก้ปัญหาได้ให้ post ข้อความไว้ใน web board ที่ระบุไว้ในหัวข้อถัดไป

ตอนท้ายของแต่ละบทในภาคปฏิบัติจะมีโครงงาน เพื่อให้ท่านหัดเขียนโปรแกรมตามหัวข้อที่เรียนไปในบทนั้น ท่านควรจะพยายามทำแบบฝึกหัดเหล่านี้ให้สำเร็จโดยไม่เปิดดูเฉลยท้ายเล่ม ซึ่งเป็นเรื่องสำคัญมาก เพราะการเรียน programming เป็นเรื่องของการปฏิบัติ การลองผิดลองถูก และชั่วโมงบิน (ในการเขียนโค้ด)

เมื่อท่านอ่านจบทั้งเล่ม ทำแบบทดสอบ และแบบฝึกหัดครบทั้งหมดแล้ว ท่านควรจะสร้างโปรแกรมสักหนึ่งหรือสอง project ตามหัวข้ออะไรก็ได้ที่ท่านต้องการ (เช่นโปรแกรมบริหารห้องสมุด หรือโปรแกรมจัดการ web board) โดยมีข้อแม้ว่าจะต้องเป็นโปรแกรมที่ใช้แนวคิด OOP อย่างสมบูรณ์ ให้เริ่มจากโครงงานที่มีขอบเขตไม่ใหญ่มากนัก เมื่อทำเสร็จแล้วจึงเพิ่มคุณสมบัติก้าวหน้าต่างๆ ในภายหลัง การทำโครงงานจะทำให้ท่านสามารถเขียนโปรแกรมแบบ OOP ได้

ขณะที่ท่านเขียนโปรแกรมหากติดปัญหาใดๆ ให้ใช้หนังสือนี้เป็นเป็นคู่มือเพื่อค้นคว้าอ้างอิง โดยสามารถใช้ส่วน “ข้อสรุปเกี่ยวกับ…” ซึ่งมีอยู่ทุกๆ ส่วนท้ายข้อหัวข้อสำคัญๆ ซึ่งจะทำให้ท่านได้ข้อมูลเกี่ยวกับเรื่องๆ นั้นๆ อย่างรวดเร็ว ยกตัวอย่างเช่น ขณะที่ท่านกำลังเขียนโปรแกรมอยู่แล้วเกิดจำไม่ได้ว่า access modifier คืออะไรและมีไว้ทำอะไร แต่จำได้ว่าเคยอ่านไปแล้ว ให้ท่านมองหาคำว่า access modifier ในสารบัญละเอียด และเปิดไปยังหัวข้อนั้น ที่ท้ายหัวข้อจะมี “ข้อสรุปเกี่ยวกับ access modifier” ซึ่งท่านสามารถใช้ทบทวนความจำได้อย่างรวดเร็ว

 

ซอฟท์แวร์ที่ใช้ในการเรียนการสอน

การเขียนโปรแกรมภาษา C# เพื่อทดสอบหลักการ OOP ท่านอาจใช้เพียง Text editor อย่าง Windows Notepad ก็ได้ แต่เพื่อให้เขียนโปรแกรมได้สนุกขึ้น ท่านควรใช้เครื่องมืออำนวยความสะดวกในการเขียนโปรแกรม ผู้เขียนขอแนะนำให้ใช้ Microsoft Visual Studio 2005 หรือ Express Edition ที่ท่านสามารถ download ได้ฟรีจาก http://msdn.microsoft.com/vstudio/express/

ท่านควร download โปรแกรม Visual C# 2005 Express Edition เพื่อทดสอบการเขียนโปรแกรมภาษา C# แบบ desktop (WinForm และ console application) และ download โปรแกรม Visual Web Developer 2005 Express Edition เพื่อทดสอบการเขียนโปรแกรมแบบ web application และ download โปรแกรม SQL Server 2005 Express หากต้องการทดสอบการทำงานกับฐานข้อมูลแบบ MS-SQL และท่านควร download MSDN Library Express หากต้องการข้อมูลอ้างอิงต่างๆ แบบ off-line

ASP.NET ที่จะใช้แสดงตัวอย่างเป็น ASP.NET 2.0 สิ่งที่ท่านจำเป็นต้องใช้เพื่อทดสอบโปรแกรม และทำแบบฝึกหัดคือเครื่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ Windows XP, Windows Server 2003 หรือสูงกว่า หรือ Windows Vista ที่ติดตั้ง IIS (Internet Information Service) ไว้แล้ว หากยังไม่ได้ติดตั้ง ท่านสามารถติดตั้งโปรแกรม IIS ได้จากแผ่น CD Windows XP Professional, Windows Server 2003-2005 หรือ Windows Vista (ใน Windows Vista จะเป็น IIS เวอร์ชัน 7) โดยการเลือก Add/Remove

นอกจาก Windows XP และ IIS แล้วท่านยังจำเป็นต้องมี .NET Framework version 2.0 ซึ่งท่านสามารถ download มาติดตั้งได้ฟรีจากเว็บไซต์ http://www.microsoft.com/downloads

ผู้เขียนจะไม่อธิบายรายละเอียดวิธี download และติดตั้งโปรแกรมเหล่านี้ เพราะมีวิธีการเช่นเดียวกับการ download และติดตั้งโปรแกรมทั่วไป

 

ตัวอย่างการทำงานของเว็บไซต์

ผู้เขียนได้จดทะเบียนและเปิดใช้งานเว็บไซต์ตัวอย่าง เพื่อให้ท่านสามารถทดสอบการทำงานของเว็บไซต์ที่ท่านจะได้เรียนวิธีสร้างในหนังสือเล่มนี้ คือ http://www.thailand2siam.com ซึ่งเป็นเว็บไซต์ที่ใช้งานจริงโดยสมบูรณ์ ท่านจึงสามารถทดลอง function ต่างๆ ของโปรแกรมได้ทั้งหมด เช่นการ เรียกดูรายการสินค้า การเพิ่ม ลบ แก้ไข ข้อมูลสินค้า

หากท่านต้องการทดลองแก้ไขข้อมูลสินค้า โปรดเข้าไปในหน้า sign-on และใช้ข้อมูลดังนี้

User name : reader
Password : reader

 

วิธีเข้าถึง Source code

ในหนังสือเล่มนี้ผู้เขียนอธิบายหลักการออกแบบ และหน้าที่ของโปรแกรมโดยละเอียด โดยแยกอธิบายแต่ละส่วน แต่เพื่อไม่ให้หนังสือหนามากเกินไป ผู้เขียนจึงไม่ตีพิมพ์ Source code ของทุกคลาสซ้ำรวมกันทั้งหมดอย่างต่อเนื่อง หากท่านต้องการดู Source code ที่ต่อเนื่อง หรือต้องการดาวน์โหลด Source code ทั้ง project เพื่อนำมาทดลองคอมไพล์ในเครื่องของท่านๆ สามารถดาวน์โหลดได้จากหน้า http://www.thailand2siam.com/download โดยท่านอาจเลือก download เพียงบางส่วน คลาส บางหน้าเว็บ หรือจะดาวน์โหลดทีเดียวทั้งหมดก็ได้ (user name และ password คือ reader)

การถามคำถามและการปรับปรุงข้อมูล

หากท่านต้องการถามคำถามที่เกี่ยวข้องกับหนังสือเล่มนี้ หรือติชม หรือให้ข้อแนะนำใดๆ หรือต้องการสื่อสารกับผู้เขียน โปรด post ข้อความของท่านไว้ในเว็บบอร์ด http://www.thailand2siam.com/messageboard ผู้เขียนจะตอบคำถามทุกข้อโดยเร็วที่สุดเท่าที่จะทำได้

การตรวจทานความถูกต้องของต้นฉบับของหนังสือเล่มนี้ แม้จะทำอย่างอย่างประณีต แต่กระนั้นหาผู้เขียนพบหรือได้รับรายงานข้อผิดพลาดใดๆ ภายหลังหนังสือออกจำหน่ายไปแล้ว ผู้เขียนจะ post การแก้ไขไว้ในเว็บบอร์ดนี้

เนื้อหาโดยย่อของหนังสือ

หนังสือเล่มนี้แบ่งออกเป็นสองภาค คือจากบทที่ 1 ถึงบทที่ 6 เป็นภาคทฤษฏี และบทที่ 7 ถึงบทที่ 21 เป็นภาคปฏิบัติ ตอนท้ายเล่มจะมีข้อสอบ เฉลยแบบฝึกหัดในแต่ละบท และเฉลยข้อสอบ

 

เนื้อหาโดยสังเขปของแต่ละบทเป็นดังนี้

บทที่ 1 การเขียนโปรแกรมแบบ OOP

อธิบายคำศัพท์ คำจำกัดความ และแนวคิดหลายอย่างเกี่ยวกับ OOP ที่ท่านจำเป็นต้องรู้ก่อน จึงจะเข้าใจเนื้อหาส่วนใหญ่ในบทต่อๆ ไปได้

  • ความหมายของ OOP
  • คลาสกับ object
  • object กับ type
  • การใช้งาน object
  • ความเป็นมาของ OOP
  • OOP วิธีคิดใหม่ในการสร้างซอฟท์แวร์
  • Object based programming
  • Object Oriented Programming
  • Encapsulation
  • Inheritance
  • Polymorphism
  • OOP กับ Microsoft .NET Framework

บทที่ 2 .NET Framework และคลาสไลบรารี

แนะนำ เรื่องพื้นฐานของ Microsoft .NET Framework โดยสังเขป ซึ่งมีหัวข้อต่างๆ ดังนี้

  • การเขียนโปรแกรมใน Microsoft .NET Framework
  • เรื่องพื้นฐานที่จำเป็นต้องรู้เกี่ยวกับ .NET Framework
  • การประมวลผลแบบกระจาย
  • เรื่องของ managed code
  • เรื่องของ CLR
  • การจัดสรรหน่วยความจำ
  • เรื่องของ stack
  • เรื่องของ heap
  • เรื่องของ garbage collector
  • เรื่องของ Dispose และ Finalize
  • แนะนำ .NET Framework class library
  • วิธีเขียนโค้ดเรียกใช้งาน FCL

บทที่ 3 ภาษา C# ระดับพื้นฐาน

แนะนำหลักการ OOP ที่ปรากฏในภาษา C# อันเป็นข้อมูลที่ท่านจำเป็นต้องรู้หากต้องการใช้ภาษา C# เป็นเครื่องมือเพื่อเขียนโค้ดตามหลักการ OOP ยกตัวอย่างเช่น value type กับ reference type เป็นอย่างไร การใช้งานแตกต่างกันอย่างไร อะไรคือ interface มีประโยชน์อย่างไร ควรนำมาใช้เมื่อใดเป็นต้น

  • ชื่อภาษา C#
  • ภาษา C# คืออะไร
  • ผู้สร้างภาษา C#
  • เปรียบเทียบภาษา C# กับภาษาอื่นๆ
  • ภาษา C# มีอะไรดี
  • ปรัชญาในการออกแบบภาษา C#
  • คุณสมบัติอื่นๆ ของภาษา C#
  • คุณสมบัติที่เพิ่มขึ้นในเวอร์ชัน 2.0
  • คุณสมบัติที่เพิ่มขึ้นในเวอร์ชัน 3.0
  • โปรแกรม Hello world
  • โครงสร้างของโปรแกรมในภาษา C#
  • namespace
  • Type ในภาษา C#
  • ตัวแปรในภาษา C#
  • Value type
  • Reference type
  • การทำ Boxing และ Unboxing
  • การสร้างคลาส
  • Base class / Derived class
  • class implicit type conversion
  • stuct
  • หลักการตั้งชื่อในภาษา C#
  • นิพจน์และตัวกระทำในภาษา C#
  • การประกาศ
  • Array
  • สรุปท้ายบท
  • คำถามท้ายบท

บทที่ 4 ภาษา C# ระดับปานกลาง

แนวคิดพื้นฐานของภาษา C# ที่จะนำเสนอในบทนี้ เป็นเรื่องพื้นฐานที่ท่านจำเป็นต้องรู้ก่อนศึกษาในขั้นประยุกต์ใช้งานในภาคสองของหนังสือเล่มนี้ ในบทนี้ท่านจะได้เรียนหัวข้อต่างๆ ดังต่อไปนี้

  • Statement
  • สมาชิกของคลาสและ struct
  • Access modifier
  • Type modifier
  • Assembly
  • Field
  • property
  • Method
  • constructor
  • destructor
  • method Parameter
  • method Signature
  • method overloading

บทที่ 5 ภาษา C# ระดับก้าวหน้า

บทนี้ผู้เขียนจะอธิบายลักษณะพิเศษ (features) ต่างๆ ของภาษา C# ซึ่งเป็นเครื่องอำนวยให้เราเขียนโค้ดเป็น OOP ได้โดยสะดวกและสง่างาม ขอให้ท่านมอง features เหล่านี้เป็นเหมือนเครื่องมือซึ่งอยู่ในกล่องเครื่องมือ ที่บางอย่างเราต้องใช้บ่อยๆ ขณะที่บางอย่างนานๆ ครั้งจึงจะได้ใช้ และบางอย่างแทบไม่มีโอกาสได้ใช้เลย

ยกตัวอย่างเช่น เรามักจำเป็นต้องสร้างและใช้งาน delegate บ่อยๆ ขณะที่ interface นั้น นานครั้งจึงจะเจอสถานการณ์ที่จำเป็นต้องสร้างขึ้นเอง (ส่วนมากมักจะเรียกใช้ของผู้อื่นเสียมากกว่า) ส่วน Pointer นั้นเราอาจไม่เคยมีโอกาสได้ใช้เลย

ผู้เขียนรวบรวม features ระดับก้าวหน้าของภาษา C# ไว้ครบตั้งแต่ C# เวอร์ชันแรก ถึง c#3.0 แต่เนื่องจากภาษา C# มี features ก้าวหน้าจำนวนมาก จึงนำเสนอได้เพียงโดยย่อพอสังเขป สำหรับใช้เป็นความรู้เบื้องต้นเพื่อศึกษาในระดับสูงต่อไป

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

ในบทนี้ท่านจะได้เรียนเรื่องต่างๆ ดังต่อไปนี้

  • Inheritance
  • Versioning
  • Abstract
  • Interface
  • IEnumerator
  • Indexer
  • Iterator, yield
  • Regex (Regular Expression)
  • Generic
  • Operator overloading
  • Delegate
  • Pointer และ Unsafe Code
  • Implicitly typed local variables
  • Lambda expressions
  • Object และ collection initializes
  • Anonymous types
  • Implicitly typed arrays
  • Query expressions
  • Expression trees

บทที่ 6 การเขียนโปรแกรมบนเว็บด้วยภาษา C#

ในบทนี้ท่านจะได้เรียนหัวข้อต่างๆ ที่สำคัญสำหรับการเขียนโปรแกรมในเว็บด้วยภาษา C# ซึ่งมีหัวข้อหลักดังนี้

  • การเขียน Web app
  • กายวิภาคของของ ASP.NET
  • สิ่งที่ต้องใช้เพื่อการพัฒนา ASP.NET
  • โครงสร้างเว็บไซต์ ASP.NET
  • ไฟล์ชนิดต่างๆ ใน ASP.NET
  • การทำงานของหน้าเว็บแบบ ASP.NET
  • Postback และ Round trip
  • Server Controls
  • Event อันเกิดจาก Page และ Server control
  • Event ที่มีความถี่สูง
  • สถาปัตยกรรมของ ASP.NET
  • System.Web.UI Namespace
  • ASP.NET Page Class
  • Code-Behind
  • Web User Control
  • CSS กับ Web server control
  • Global.asax
  • Web.config
  • เว็บไซต์ catalog สินค้า

บทที่ 7 คลาสที่เป็นรากฐานของทั้งเว็บไซต์

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

  • design consistency
  • คลาส WebBaseRoot
    • Constructor
    • OnInit
    • AddHead
    • AddTail
    • AddTitle
    • AddMainFrame
    • AddControlsFromDerivedPage
    • AddMenu
    • AddTailAddress
    • AddRunTimeControls
    • GenerateHtmlFrom
    • BuildPage
  • คลาส WebBaseNormal
    • โครงสร้างของคลาส WebBaseNormal
    • Constructor
    • AddMenu
    • AddMainMenu
    • AddCatMenu
    • AddTailAddress
    • AddRunTimeControls
  • คลาส WebFormBase

บทที่ 8 คลาสสร้างส่วนประกอบมาตรฐานของเว็บไซต์

ในบทนี้ท่านจะได้เรียนวิธีนิยามคลาสสร้างส่วนประกอบมาตรฐานของเว็บไซต์ catalog สินค้า www.thailand2siam.com ซึ่งมีสามคลาสคือ Default ทำหน้าที่เป็น homepage คลาส GlobalVar ทำหน้าที่เก็บค่ากำหนดต่างๆ และ TailAddress ทำหน้าที่สร้างข้อความแสดงชื่อที่อยู่ของบริษัทซึ่งจะปรากฏที่ด้านล่างสุดของทุกๆ หน้า

หัวข้อต่างๆ ในบทนี้คือ

  • เรื่องของ Reusable
  • คลาส Default
    • Default.aspx.cs
    • ส่วนประกอบต่างๆ ในหน้า Default.aspx
  • คลาส GlobalVar
    • string Literal
    • Menu literal
    • Background & Color scheme
    • Category literal
    • public constant
    • folder specific
  • คลาส TailAddress
    • สมาชิกแบบ filed
    • สมาชิกแบบ property
    • constructor
  • RenderTailAddress
  • Cascade Style Sheet

บทที่ 9 สร้างเมนูให้เป็น object

อธิบายเบื้องหลังวิธีคิดในการสร้าง object โดยยกตัวอย่างวิธีออกแบบและสร้างเมนูที่ใช้งานได้จริงในเว็บไซต์

  • กายวิภาคของเมนู
  • ทางเลือกในการสร้างเมนู
  • การกำหนดรูปแบบเมนูด้วย CSS
  • คลาส MenuNavigator
    • สมาชิก field
    • สมาชิกแบบ property
    • สมาชิกแบบ method
      • constructor
      • method RenderMenu
  • วิธีสร้างเมนูแบบ LiteralControl
  • การนำ menu ไปใช้งาน

บทที่ 10 การสร้างหน้าเว็บ

สามบทที่ผ่านมาท่านได้เรียนองค์ประกอบพื้นฐานทั้งหมดของเว็บไซต์ catalog สินค้า www.thaialnd2siam.com ที่ใช้เป็นตัวอย่างในหนังสือเล่มนี้ไปแล้ว ในบทนี้เราจะมาดูว่าโปรแกรม ASP.NET ทำอะไรบ้างเมื่อผู้ใช้เปิดหน้าเว็บ เกิดอะไรขึ้นกับโปรแกรมของเรา ASP.NET มีขั้นตอนการทำงานอย่างไรกับโค้ดในหน้าเว็บ Default.aspx ซึ่งเป็นหน้า Home page ของเว็บไซต์ของเรา

หัวข้อต่างๆ ที่ท่านจะได้เรียนในบทนี้คือ

  • ยุค Web Application
  • การพัฒนา WebForm
  • การทำงานของ WebApp
  • การสร้างโดเมน
  • การตรวจสอบไวรัสและ event
  • การทำงานของ constructor
  • การตอบสนอง event OnInit
  • การจับ Control ใส่ container
  • Control ที่ต้องบรรจุใน form
  • การตอบสนอง Page_Load

บทที่ 11 คลาสจัดการฐานข้อมูลสินค้า

ในบทนี้ท่านจะได้เรียนวิธีนำหลักการ abstract และ information hiding ตามแนวคิด OOP มาประยุกต์ใช้เพื่อทำฐานข้อมูลให้เป็น object ที่จะช่วยให้การเขียนโปรแกรมเพื่อดึงข้อมูลสินค้าจากฐานข้อมูล และนำมาแสดงแยกตามประเภทสินค้า หรือแสดงรายละเอียดสินค้าแต่ละตัวทำได้โดยง่าย และโค้ดสามารถนำกลับมาใช้ใหม่ได้

หัวข้อต่างๆ ที่ท่านจะได้เรียนในบทนี้คือ

  • ทบทวนเรื่องพื้นฐานเกี่ยวกับฐานข้อมูล
  • Access database
  • SQL Server
  • โครงสร้างฐานข้อมูล
  • Database wrapped class
  • ADO.NET
  • คลาส ProductDatabase
  • สมาชิกแบบ field ของคลาส ProductDatabase
  • สมาชิกแบบ property ของคลาส ProductDatabase
  • สมาชิกแบบ Method ของคลาส ProductDatabase
  • productDataBase
  • RecordCount
  • GetData
  • UpdateData
  • AddData
  • UpdateImage
  • DeleteRecord
  • โค้ดโดยสมบูรณ์ของคลาส ProductDatabase

บทที่ 12 คลาสแสดงรายการสินค้า

สาทิตการสร้าง object ที่ห้อหุ้มข้อมูลจากฐานข้อมูล และวิธีนำ object ไปใช้ในหน้าเว็บ เว็บไซต์ catalog สินค้า http://www.thailand2siam.com ที่ใช้เป็นตัวอย่างในหนังสือเล่มนี้ รายการสินค้าที่แสดงบนจอมีภาวะเป็น object ทั้งหมดเรียกว่า thumb ในบทนี้ท่านจะได้เรียนวิธีสร้าง thumb การนิยามคลาส ShowThumb และคลาส ShotThumbList และคลาส ShowCategory ซึ่งเป็นหน้าเว็บแสดงรายการสินค้า

หัวข้อต่างๆ ที่ท่านจะได้เรียนในบทนี้คือ

  • กายวิภาคของ thumb
  • คลาส ShowThumb
    • สมาชิกแบบ field ของคลาส ShowThumb
    • constructor
    • RenderItem
  • คลาส ShowThumbList
    • กายวิภาคของ thumb list
    • สมาชิกแบบ field ของคลาส ShowThumbList
    • สมาชิกแบบ property ของคลาส ShowThumbList
    • constructor ของคลาส ShowThumbList
    • RenderList
  • คลาส ShowCategory
    • CatListParam
      • Method ในคลาส ShowCategory
      • constructor
      • Page_Load
      • DisplayThubmList
      • MakeThumbList
      • ReadCatDatabase
      • AddTail
      • AddCatMainFrame
      • AddTailAddress
      • UpdateColorSet
      • ShowUserName
      • ImageButtonLogin_Click
      • ImageButtonLogOut_Click

บทที่ 13 คลาสแสดงรายละเอียดสินค้า

สาทิตการใช้โค้ดภาษา HTML ร่วมกับโค้ดภาษา C# เพื่อสร้าง object บนหน้าเว็บแทนการใช้ Web Server Control

ขณะที่ผู้ใช้งานเว็บไซต์ www.thailand2siam.com กำลังชมรายการสินค้าในหน้าแสดงรายการสินค้า (หน้า ShowCategory.aspx) เมื่อต้องการดูรายละเอียดของสินค้า ก็เพียงแค่คลิกเมาส์ที่ภาพ thumbnail หรือที่ลิงค์ More โปรแกรมจะแสดงรายละเอียดสินค้านั้นทันที หน้าเว็บที่ทำหน้าที่แสดงรายละเอียดสินค้าคือ ViewDetail.aspx (ต่อไปจะเรียกย่อว่า ViD) ในบทนี้ท่านจะได้เรียนรายละเอียดวิธีสร้าง ViD ด้วยการเขียนโปรแกรมภาษา C# เพื่อนิยามคลาสและสมาชิกต่างๆ ของมัน

  • กายวิภาคของ ViD
  • คลาส ProductDetail
  • สมาชิกแบบ property ของคลาส ProductDetail
  • สมาชิกแบบ method ของคลาส ProductDetail
    • method RenderProductDetail
  • คลาส ViewDetail
  • สมาชิกแบบ Field ของคลาส ViewDetail
  • สมาชิกแบบ method ของคลาส ViewDetail
    • constructor
    • Page_Load
    • CheckCalVisible
    • cal_ConverterClose
    • CheckAuthorize
    • GetPostParam
    • SetProNav
    • AddAdminMenu
    • AddContent
    • AddBackMenu
    • ShowAdminMenu
    • AddRunTimeControls
    • LinkButtonRemove_Click
    • ButtonCurrencyConverter_Click
    • CreateDataTable
    • GetOneRecord

หัวข้างต่างๆ ข้างบนมีหน้าที่แสดงการประยุกต์ใช้งานหลักการ OOP และภาษา C# ในแง่มุมต่างๆ ดังนี้

  • การสร้างหน้าเว็บเป็น base class ที่นำไป inherit เป็นหน้าเว็บใหม่
  • การสร้างส่วนแสดงรายละเอียดสินค้าให้เป็น object
  • วิธีรับ event ที่เกิดจาก delegate
  • การประยุกต์ใช้งาน parameter modifier แบบ out
  • การใช้ client script ร่วมกับ server script ด้วยการสร้างฟังก์ชันภาษา JavaScript ทำงานโต้ตอบกับโค้ดภาษา C#
  • การสร้างหน้าเว็บที่ทำงานได้สองหน้าที่ คือใช้เป็นหน้าแสดงรายละเอียดสินค้า และใช้เป็นหน้าแก้ไขข้อมูลสินค้า โดยทำงานร่วมกับ user control
  • การตรวจสอบสิทธิของผู้ใช้ (ว่าเป็น user หรือเป็น Admin)
  • การใช้งาน user control
  • การใช้ struct เพื่อรับข้อมูลจากฐานข้อมูล

บทที่ 14 การประยุกต์ใช้งาน delegate และ event กับเครื่องแปลงค่าเงิน

ในบทนี้ท่านจะได้เรียนวิธีนำหลักการ delegate และ event มาประยุกต์ใช้ในทางปฏิบัติ และจะได้เรียนวิธีออกแบบและสร้างโปรแกรมใน .NET Framework ที่สำคัญหลายหลักการ เช่น การสร้างข้อกำหนดจำเพาะของคลาส การออกแบบ user interface การใช้คำสั่ง using วิธีนำ Delegate มาใช้ร่วมกับ event โดยมีหัวข้อต่างๆ ในบทนี้ดังนี้

  • คลาสและรถจักรยานยนต์
  • คลาส CurrencyConverter เครื่องแปลงค่าเงิน
  • คุณสมบัติของเครื่องคิดเลข
    • คุณสมบัติในแง่การใช้งาน
    • คุณสมบัติในแง่การทำงาน
  • ออกแบบด้วยการถามตอบ
    • โจทย์ในแง่การใช้งาน
    • โจทย์ในแง่การพัฒนา
  • สถาปัตยกรรม Model-view-controller (MVC)
  • Currency Converter กับ User Interface
  • คลาส CurrencyConverter
  • ความสำคัญของ using
  • ส่วนนิยามชื่อคลาส CurrencyConverter
  • สมาชิกของคลาส
  • delegate เดี๋ยวนี้
  • ทำไมคลาส CurrencyConverter จึงต้องใช้ delegate
  • Delegate กับผู้ให้บริการและผู้รับบริการ
  • วิธีประกาศ delegate
  • Delegate และ Event
  • รายละเอียดของขั้นตอน event และ delegate
  • สรุปเรื่อง delegate

บทที่ 15 การประยุกต์ใช้ Constructor, destructor และสมาชิกอื่นๆ ของคลาส

ในบทนี้ท่านจะได้เรียนวิธีนิยามและการประยุกต์ใช้งาน filed สมาชิกเพื่อสร้างตัวแปรทั้งแบบ value type และ reference type การประยุกต์ใช้ enum และตัวจัดการสีของ .NET วิธีนิยามและการประยุกต์ใช้งาน property วิธีเขียนโค้ดเพื่อกลั่นกรองค่าที่รับมาจาก client class และในตอนท้ายบทผู้เขียนจะแสดงวิธีนิยาม constructor และ destructor เพื่อสร้างและทำลาย object

หัวข้อที่ท่านจะได้เรียนในบทนี้มีดังนี้

  • ผู้สร้างและผู้ทำลาย
  • แผนภูมิของคลาส CurrencyConverter
  • Field ของคลาส CurrencyConverter
    • การกำหนดตำแหน่งบนหน้าเว็บ
    • ผู้ช่วยจัดการสีโดยอัตโนมัติ type color
    • เรื่องของ enum
    • object แบบ Web Server Control
  • Property ของคลาส CurrencyConverter
    • property Top
    • implicit parameter
    • ขั้นตอนการทำงานของ property Top
    • Property Left
    • Property อื่นๆ ของคลาส CurrencyConverter
  • Constructor ผู้สร้าง
    • Operator new
    • Constructor overload และ constructor chain
    • static constructor และ Initializers
    • ประโยชน์ของ constructor
    • Constructor ของคลาส CurrencyConverter
  • Destructor ผู้ทำลาย
    • ข้อสังเกตเกี่ยวกับ destructor

บทที่ 16 การใช้ Web server control โดยการเขียนโค้ด: สอนเทคนิคการใช้ Web Server Control ด้วยการเขียนโค้ดแทนการลาก-หยอดใน designer ของ Visual Studio .NET

ในบทที่ 14 และ 15 ท่านได้เรียนวิธีนิยามคลาส delegate, event และสมาชิกแบบ field , method constructor และ destructor ของคลาส CurrencyConverter ไปแล้ว ในบทนี้เราจะมาดูรายละเอียดสมาชิกแบบ method ที่เหลือในคลาส CurrencyConverter

หัวข้อต่างๆ ที่ท่านจะได้เรียนในบทนี้คือ

  • method ShowConverter
  • ตัวอ้างอิงหน้าเว็บ
  • Comment ในภาษา C#
  • การสร้าง Panel หลัก
  • Layer กับ Z-Index
  • ControlCollection
  • การสร้าง Title Bar
  • การสร้าง Title text และ Cascade style sheet
  • ปุ่ม Convert!
  • Reference type กับ object
  • การใช้ Event, Delegate กับปุ่ม
  • วิธีอ่าน text file ใน server
  • การเรียกใช้สมาชิกของ static class
  • วิธีเขียน text file ใน server
  • การใช้งาน Web service
  • การคำนวณอัตราแลกเปลี่ยน
  • method ที่ทำงานเมื่อกดปุ่ม

บทที่ 17 สร้าง ASP.NET User Control เพื่อท่องไปในรายการสินค้า: สาทิตวิธีสร้างและใช้งาน object แบบ User Control

ในบทที่ผ่านมาท่านได้เรียนวิธีสร้าง object ซึ่งมีส่วนติดต่อกับผู้ใช้ไปแล้วหลายตัว เช่น ระบบเมนู thumb list และเครื่องคิดเลข โดยทุกตัวใช้วิธีสร้างแบบเขียนโค้ดภาษา C# ล้วนๆ ในบทนี้ท่านจะได้เรียนวิธีสร้าง object แบบ ASP.NET User Control (WUC) ซึ่งเป็นวิธีที่ง่ายกว่ามาก เพราะเราจะใช้ Designer ของโปรแกรม Microsoft Visual Studio .NET (VS.NET) ช่วยสร้างโค้ดให้โดยอัตโนมัติ

หัวข้อที่ท่านจะได้เรียนในบทนี้มีดังนี้

  • กายภาพของ PN
  • ASP.NET Web User Control
  • วิธีสร้าง WSC
  • ไฟล์ ProductNavigator.ascx
  • คลาส ProductNavigator
    • สมาชิกแบบ filed ของคลาส ProductNavigator
    • สมาชิกแบบ Property ของคลาส ProductNavigator
    • สมาชิกแบบ method ของคลาส ProductNavigator
      • ShowNavThumb
      • GetNextRecord
      • GetPreviousRecord
      • GetFirstRecord
      • GetLastRecord
      • ShowProduct
      • method บริการ event ปุ่ม BF, BL, BP และ BN
      • ImageButtonNav_Click

บทที่ 18 สร้างหน้า Log-In และคลาสจัดการสิทธิของผู้ใช้: สาทิตวิธีประยุกต์ใช้ฐานข้อมูล session variable และการใช้ AccessDataSource Control

เว็บไซต์ http://www.thailand2siam.com ที่ใช้เพื่อเป็นตัวอย่างการประยุกต์ใช้งานหลักการ OOP และภาษา C# ในหนังสือเล่มนี้ นอกจากจะมีส่วนแสดงรายละเอียดของหน่วยงาน และส่วนแสดงรายการสินค้า ซึ่งเป็นหน้าเว็บสำหรับผู้ชมทั่วไปแล้ว ยังมีส่วนหน้าเว็บเพื่อให้ผู้ดูแลเว็บไซต์ (web admin) สามารถ แก้ไข ลบ เพิ่มข้อมูลสินค้าได้โดยง่าย

หัวข้อที่ท่านจะได้เรียนในบทนี้มีดังนี้

  • ระบบสิทธิของ User
  • ตาราง UserData
  • คลาส UserDataBase
  • หน้า UserLogIn
  • คลาส UserLogIn
    • Method UserLogin (constructor)
    • Method Page_Load
    • Method ButtonLogIn_Click
  • หน้า UserListShow
  • คลาส UserListShow
    • Method UserListShow (constructor)
    • Method Page_Load
    • Method ShowUserTable
  • หน้า UserViewDetail
  • กายวิภาคของ PN
  • คลาส UserViewDetail
    • constructor
    • Page_Load
    • AddMenu
    • CreateDataTable
    • ShowUserData
    • ShowPageNavigator
  • หน้า UserEdit
  • AccessDataSource Control
  • FormView Web Server Control
  • คลาส UserEdit
  • หน้า UserLogOut
  • คลาส UserLogOut

บทที่ 19 ในบทนี้ผู้เขียนจะสาทิตวิธีประยุกต์ใช้งาน OOP โดยแสดงตัวอย่างการสร้างหน้าเว็บเพื่อแก้ไขข้อมูลสินค้า ในบทนี้ท่านจะได้เรียนหัวข้อต่างๆ ต่อไปนี้

  • หน้าเว็บเพื่อการแก้ไขข้อมูล Edit.aspx
  • โค้ดในไฟล์ Edit.aspx
  • คลาส Edit
    • Constructor
    • Method PageLoad
    • Method SetProductEdit
    • Method AddRunTimeControls
  • สร้าง UserControl เพื่อป้อนพิมพ์ข้อมูลสินค้า
  • คลาส ProductEdit
    • สมาชิก Field ของคลาส ProductEdit
    • สมาชิก property ของคลาส ProductEdit
    • Method RenderProdEdit
    • การส่งผ่าน struct เป็นพารามิเตอร์
    • Method CreateDataTable
    • Method GetOneRecord
    • method GetFromTextBox
    • Method AddContent
    • Method populateCategoryListBox
    • เทคนิคการใส่ข้อมูลใน DropDownList
    • Method บริการการกดปุ่ม
    • Method ButtonSubMit_Click
    • Method ButtonCancel_Click
    • Method ButtonNewImage_Click
  • หน้าเว็บเพื่อการเพิ่มข้อมูลใหม่ หน้า Add.aspx
  • หน้าเว็บเพื่อการลบข้อมูลสินค้า
  • วิธีเขียน JavaScript เพื่อใช้งานร่วมกับภาษา C#

บทที่ 20 หน้าเว็บซึ่งทำหน้าที่เพิ่มและเปลี่ยนภาพสินค้า หรือหน้า NewImage.aspx เป็นหน้าเว็บสุดท้ายที่ผู้เขียนยังไม่ได้อธิบาย ผู้เขียนเก็บหน้านี้ไว้อธิบายหลังสุดไม่ใช่เพราะมันมีความสำคัญน้อยที่สุด อันที่จริงแล้วหน้าเว็บ NewImage.aspx มีแง่มุมน่าสนใจ ควรค่าแก่การเรียนรู้หลายอย่าง

ตัวอย่างเทคนิคการเขียนโปรแกรมภาษา C# ที่ท่านจะได้เรียนในบทนี้คือ วิธีเขียนโปรแกรมแสดงกรอบข้อความ Chose file เพื่อให้ผู้ใช้เลือกไฟล์ที่ต้องการ เทคนิคการ upload ไฟล์ภาพจากคอมพิวเตอร์ของผู้ใช้ไปยังเครื่องแม่ข่าย วิธีเปลี่ยนฟอร์แมตภาพเป็น .jpg เขียนโค้ดเปลี่ยนขนาดภาพให้มีขนาดต่างๆ และวิธีบันทึกไฟล์ภาพลงในเครื่องแม่ข่ายเป็นต้น

หัวข้อต่างๆ ที่ท่านจะได้อ่านในบทนี้มีดังนี้

· วิธีการใช้งานหน้าเปลี่ยนภาพสินค้า

  • กายวิภาคของหน้าเว็บ NewImage.aspx
  • คลาส NewImage
    • Constructor ของคลาส NewImage
    • method GetOneRecord
    • method AddContent
    • method ResizeImage
    • method MakeLongFileName
    • method UpdateImageDataBase
    • method validFileExtention
    • method ButtonUpload_Click
    • method ButtonCancel
    • method ButtonOK_Click

บทที่ 21 ถึงตอนนี้เราสร้างหน้าเว็บและนิยามคลาสต่างๆ ของเว็บไซต์ www.thailand2siam.com ครบถ้วนหมดแล้ว ถึงเวลาที่เราจะนำทุกอย่างมารวมกันและเปิดใช้งานเว็บไซต์ ในบทนี้ท่านจะได้เรียนหัวข้อต่างๆ ดังต่อไปนี้

  • วิธีคอมไพล์โปรแกรมให้เป็นเว็บไซต์
  • วิธีสร้าง server เพื่อทดสอบโปรแกรม
  • การเลือก ASP.NET web server
  • ฟรี ASP.NET 2.0 web hosting
  • วิธีติดตั้งเว็บไซต์ใน ASP.NET web server
  • การสร้างตารางในฐานข้อมูลแบบ Microsoft SQL

หมายเหตุ

เว็บไซต์ที่ท่านกำลังอ่านนี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ ครอบคลุมบทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) ข้อเขียนในหนังสืออาจอาจแตกต่างจากในเว็บไซต์ (Blog นี้) เพราะที่ท่านกำลังอ่านนี้เป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (เนื้อหาก่อนการ edit)

ในเว็บนี้ผู้เขียนแบ่งแต่ละบทออกเป็นตอนสั้นๆ เพื่อให้สะดวกกับการอ่านบนหน้าจอ โดยแบ่งออกดังนี้

  • บทที่ 1 ในหนังสือคือ ตอนที่ 1 ถึงตอนที่ 7 ใน Blog
  • บทที่ 2 ในหนังสือคือ ตอนที่ 8 ถึงตอนที่ 10 ใน Blog
  • บทที่ 3 ในหนังสือคือ ตอนที่ 11 ถึงตอนที่ 18 ใน Blog
  • บทที่ 4 ในหนังสือคือ ตอนที่ 19 ถึงตอนที่ 23 ใน Blog
  • บทที่ 5 ในหนังสือคือ ตอนที่ 24 ถึงตอนที่ 32 ใน Blog
  • บทที่ 6 ในหนังสือคือ ตอนที่ 33 ใน Blogเป็นต้นไป

 

ตอนต่อไป: การเขียนโปรแกรมแบบ OOP

อารัมภกถา

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

อารัมภกถา

OOP เป็นคำที่นักเขียนโปรแกรมทุกคนรู้จักดี แต่มีนักเขียนโปรแกรมจำนวนน้อยที่เข้าใจความหมาย และมีนักเขียนโปรแกรมจำนวนน้อยไปกว่านั้นอีกที่นำมันมาประยุกต์ใช้ได้จริงๆ นี่เป็นเรื่องน่าแปลกใจ เพราะหลักการ OOP ไม่ใช่สิ่ง “สูงส่ง” หรือยากเกินกว่าที่คนทั่วไปจะเข้าใจได้ สาเหตุน่าจะเกิดจากเรายังขาดตำราที่เน้นเรื่อง OOP โดยเฉพาะ ตำราที่อธิบายหลักการ OOP โดยละเอียด เป็นภาษาที่เข้าใจได้ง่าย และสาทิตการประยุกต์ใช้ด้วยตัวอย่างงานจริง

หลักการ OOP ไม่ใช่ของใหม่ มันเป็นหลักการที่เริ่มต้นมาพร้อมๆ กับวิธีเขียนโค้ดแบบ procedural แต่เพิ่งจะได้รับความนิยมมากขึ้นในระยะสิบปีที่ผ่านมา ปัจจุบันนักเขียนโค้ดจำนวนมากหันไปหาภาษา OOP อย่าง Java ภาษา .NET (และภาษาอื่นๆ ที่เริ่มได้รับความนิยมเพิ่มขึ้นอย่าง Python และ Ruby) แม้กำลังใช้ภาษาแบบ OOP แต่นักเขียนโปรแกรมจำนวนมาก กลับไม่สามารถเขียนโปรแกรมตามแนวคิด OOP ได้

OOP อาจไม่ใช่แก้วสารพัดนึก หรือปราศจากข้อบกพร่อง แต่ OOP เป็นเรื่องสำคัญ และกำลังทวีความสำคัญมากขึ้น ผู้เขียนๆ โปรแกรมมานานยี่สิบปี เคยผจญความยากลำบากในการเปลี่ยนวิธีคิดจาก procedural เป็น OOP มาแล้ว จึงรวบรวมสิ่งเหล่านั้นมาเรียบเรียงไว้ในหนังสือเล่มนี้ โดยหวังว่าจะเป็นทางลัดตัดสั้น ช่วยให้ท่านข้ามอุปสรรคและหลุมพราง เข้าสู่โลกแห่ง OOP ได้โดยไม่เสียเวลามากกว่าที่จำเป็น

ข้อมูลที่ใช้ในการเขียนหนังสือเล่มนี้ ส่วนหนึ่งมาจากประสบการณ์ การทดสอบ และการสร้างของผู้เขียนเอง อีกส่วนหนึ่งมาจากบทความจากเว็บไซต์ต่างประเทศ และหนังสือตามรายการที่ปรากฏในบรรณานุกรม

แม้หนังสือเล่มนี้จะถูกตรวจสอบความถูกของเนื้อหาและรูปเล่มอย่างอย่างประณีต แต่อาจเป็นไปได้ว่ายังมีสิ่งผิดพลาดหลงเหลืออยู่บ้าง ผู้เขียนขอน้อมรับข้อบกพร่องเหล่านั้น หากมีความดี หรือคุณประโยชน์ใดๆ เกิดจากหนังสือเล่มนี้ ผู้เขียนขอยกความดีเหล่านั้นให้แก่บรรดาผู้คิดประดิษฐ์ OOP C# และ ASP.NET ทั้งหมด

ตอนต่อไป: คำนำ

ตอน 35 กายวิภาคของของ ASP.NET

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

กายวิภาคของของ ASP.NET

ASP.NET เป็นโปรแกรมที่อยู่ภายใน .NET Framework ทำหน้าที่ช่วยให้เราสามารถพัฒนาและใช้งานเว็บไซต์แบบ ASP.NET ได้ การพัฒนา web app แบบ ASP.NET เราสามารถใช้ภาษา .NET ต่างๆ ได้ เช่น VB.NET, C#.NET, J#.NET และ C++.NET

ASP.NET มีส่วนประกอบต่างๆ ดังนี้

1. framework สำหรับหน้าเว็บและ control ต่างๆ
2. compiler ของ ASP.NET
3. ระบบรักษาความปลอดภัยขั้นพื้นฐาน
4. ส่วนจัดการกับสภาวะ (state)
5. การกำหนดลักษณะของ application
6. ส่วนตรวจสอบและเฝ้าดูการทำงานของระบบ
7. ส่วนสนับสนุนการดีบัก
8. framework สำหรับ XML web service
9. ส่วนเพิ่มขยายของ host และส่วนจัดการ application life cycle
10. ส่วนเพิ่มขยายของ designer environment

ต่อไปนี้ผู้เขียนจะอธิบายรายละเอียดของแต่ละส่วนโดยสังเขป

1. framework สำหรับหน้าเว็บและ control ต่างๆ

ส่วนนี้ทำหน้าที่เป็น framework สำหรับการเขียนโปรแกรมที่ทำงานใน web server เพื่อสร้างหน้าเว็บอย่างมีพลวัต โดย browser หรือโปรแกรม client ใดๆ สามารถเรียกให้ทำงานได้ โดย ASP.NET จะสร้างเป็นโค้ด HTML ส่งไปให้ตามที่ร้องขอ

ASP.NET สนับสนุนการสร้างหน้าเว็บสำหรับเปิดดูในอุปกรณ์เคลื่อนที่เช่น โทรศัพท์เคลื่อนที่ คอมพิวเตอร์ขนาดพกพา และ PDA (personal digital assistants)

หน้าเว็บแบบ ASP.NET มีความเป็น OOP โดยสมบูรณ์ หน้าเว็บแบบ ASP.NET สามารถทำงานกับชิ้นส่วน HTML โดยผ่านทาง properties, methods และ events หน้าเว็บแบบ ASP.NET ลดความซับซ้อนของการสร้าง web app แบบเก่าโดยให้โค้ดการทำงานส่วนใหญ่เกิดขึ้นที่ server และ framework ยังทำหน้าที่จัดการสถานะของแต่ละหน้าเว็บและ controls ต่างๆ ในแต่ละ process life cycle ให้อีกด้วย

 

Control ต่างๆ

คำว่า controls ในที่นี้หมายถึง object บนหน้าเว็บแบบ ASP.NET เช่น ปุ่ม textbox, list box และ label หน้าเว็บที่สร้างด้วย ASP.NET สามารถทำงานได้กับ control หลายแบบ คือ

  • HTML server control: คือ server control ที่ทำเลียนแบบ html element เช่น ปุ่ม Label, list box, Text box เพื่อให้เราสามารถเขียนโปรแกรมควบคุมได้โดยง่าย
  • ASP.NET Web Server Control: คล้ายๆ HTML server control บางอย่างก็ซ้ำกัน ยกตัวอย่างเช่น button ที่มีทั้งแบบที่เป็น HTML server control และแบบ ASP.NET Web Server Control แต่แบบที่เป็น ASP.NET Web Server Control จะมีลูกเล่นมากกว่า ยกตัวอย่างเช่น button control แบบ ASP.NET Web Server Control มี property ให้เรากำหนด border หรือขนาดของกรอบได้ ขณะที่ button control แบบ HTML server control ไม่มี
  • Validation control: คือ control ทำหน้าที่ตรวจสอบการป้อนข้อมูล
  • User controls: คือ control ที่เราสร้างเองโดยอาศัยหน้าเว็บ ASP.NET ร่วมกับ control สามแบบข้างต้นมาผสมกันเป็น control ใหม่

องค์ประกอบต่างๆ ของหน้าเว็บ เช่น button, check box และ TextBox ถ้าเป็นหน้าเว็บ html ธรรมดาจะเรียกว่า html element แต่ในหน้าเว็บแบบ ASP.NET เรียกองค์ประกอบเหล่านี้ว่า control

 

2. compiler ของ ASP.NET

โค้ดทั้งหมดของ ASP.NET ต้องถูกคอมไพล์ก่อน นั่นทำให้โปรแกรมที่ได้มีคุณสมบัติดีๆ หลายอย่างเช่น strongly type ทำงานมีประสิทธิภาพสูงสุด และ early binding เป็นต้น เมื่อโค้ดถูกคอมไพล์ (เป็น MSIL) แล้ว CLR จะคอมไพล์ซ้ำอีกครั้ง (เป็น native code) เมื่อหน้าเว็บถูกโหลด เพื่อให้โปรแกรมทำงานได้รวดเร็วที่สุด ASP.NET มี compiler ที่จะคอมไพล์ส่วนประกอบต่างๆ ในหน้าเว็บ เช่น control ต่างๆ ให้กลายเป็น assembly เดียวกันเพื่อที่ ASP.NET จะนำไปให้บริการแก่ผู้ใช้ที่ร้องขอได้สะดวก

3. ระบบความปลอดภัยพื้นฐาน

ASP.NET จัดให้มีระบบพื้นฐานเกี่ยวกับการ login ของผู้ใช้ โดยผู้เขียนโค้ดจะเลือกใช้ระบบรักษาความปลอดภัยของ IIS หรือจะใช้ระบบรักษาความความปลอดภัยที่เพิ่มขึ้นเป็นพิเศษของ ASP.NET ก็ได้

4. ส่วนจัดการกับสภาวะ (state)

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

ส่วนโปรแกรมแบบ ASP.NET ทำงานเหมือน desktop เพราะ ASP.NET มีส่วนเก็บข้อมูลสถานะเหล่านี้ทั้งระหว่างการเปิดไปมาในหน้าเว็บต่างๆ หรือระหว่างการทำงานแต่ละครั้ง (คือปิด browser ไปแล้วเปิดขึ้นใหม่ภายหลัง) หรือแม้แต่การทำงานข้ามเครื่องคอมพิวเตอร์ก็ยังเก็บได้

5. การกำหนดลักษณะของ application

คุณลักษณะนี้ทำให้เราสามารถตั้งค่ากำหนดลักษณะของ web app ของเราได้ง่าย โดยอาจกำหนดไว้เมื่อติดตั้ง application หรือเมื่อติดตั้งไปแล้วจะแก้ไขเปลี่ยนแปลงอย่างไรก็ได้ตามใจชอบ โดยไม่ส่งผลกระทบต่อการทำงานของ application เพราะการเก็บค่ากำหนดนี้จะอยู่ในไฟล์แบบ XML ซึ่งเป็น ASCII text ไฟล์ธรรมดา

6. ส่วนตรวจสอบและเฝ้าดูภาวะของระบบ

คุณสมบัตินี้ช่วยให้ผู้สร้าง application สามารถเฝ้าติดตามผลการทำงานของ application ได้โดยดูจาก log ไฟล์ที่บันทึกสภาพการ error และประสิทธิภาพการทำงานของโปรแกรม

7. ส่วนสนับสนุนการ debug

ปรกติแล้ว web app จะดีบักได้ยากหรือทำไม่ได้เลย แต่ ASP.NET ใช้ประโยชน์จาก run-time debugging ที่มีอยู่ในตัว .NET Framework การ debug โปรแกรมจึงทำได้ง่ายและกว้างขวางเช่นเดียวกับ Win app

8. framework สำหรับ XML web service
ASP.NET สนับสนุน XML web service ซึ่งเป็นกลไกที่ช่วยให้ application สามารถแลกเปลี่ยนข้อมูลกันได้โดยไม่ถูก firewall ขัดขวาง (เพราะข้อมูลที่แลกเปลี่ยนเป็น text ล้วนๆ) web service ไม่ขึ้นอยู่กับเทคโนโลยีแบบใดโดยเฉพาะ ทำให้ใช้สามารถใช้ภาษาหรือเทคโนโลยีในการสร้าง web service ได้หลายแบบ หรือประสมกันได้

หนังสือเล่มนี้จะเน้นการสร้าง web app เป็นหลัก จึงไม่มีตัวอย่างการสร้าง web service คงมีแต่ตัวอย่างการเรียกใช้ (consume) web service เท่านั้น

9. ส่วนเพิ่มขยายของ host และส่วนจัดการ application life cycle

แม้ ASP.NET จะทำงานอยู่บน IIS ซึ่งทำหน้าที่เป็น web server แต่มันก็มีส่วนจัดการด้าน hosting ของมันเองด้วยทำให้ ASP.NET สามารถติดตามและจัดการตั้งแต่ application เริ่มทำงาน (เมื่อผู้ใช้เริ่มเปิดหน้าเว็บหน้าแรก) ไปจน application จบการทำงาน

10. ส่วนเพิ่มขยายของ designer environment

คุณสมบัตินี้ทำให้ผู้สร้าง web app ที่ทำงานใน ASP.NET สามารถออกแบบหน้าเว็บโดยใช้เครื่องมือแบบ visual เช่น Visual Studio ได้ ซึ่งใช้การทำงานแบบลากและหยอด (เหมือน macromedia dreamweaver) ทำให้นักออกแบบสามารถหน้าเว็บสร้างหน้าเว็บที่ซับซ้อนได้ง่ายและรวดเร็ว

สรุปเรื่องกายวิภาคของของ ASP.NET

• ASP.NET มีส่วนประกอบหลัก 10 ส่วน
• ASP.NET สนับสนุนการสร้างหน้าเว็บสำหรับเปิดดูในอุปกรณ์เคลื่อนที่
• หน้าเว็บแบบ ASP.NET มีความเป็น OOP โดยสมบูรณ์
• controls คือ object บนหน้าเว็บแบบ ASP.NET
• โค้ดทั้งหมดของ ASP.NET ต้องถูกคอมไพล์ก่อน
• ASP.NET มีการทำงานแบบจดจำสถานะ
• ASP.NET สนับสนุน XML web service

ตอนต่อไป : สิ่งที่ต้องใช้เพื่อการพัฒนา ASP.NET

ตอน 34 ความสัมพันธ์ของ Object lifetime, Garbage collector และ Marshalling

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

ความสัมพันธ์ของ Object lifetime, Garbage collector และ Marshalling

 

ท่านผู้อ่านชื่อคุณ myme เขียนมาในเว็บบอร์ด (www.aicybernetic.com/gbook) บอกเพียงสั้นๆ ว่า “อยากทราบการทำงาน ความสัมพันธ์ของ object lifetime, garbage collector, marshalling ค่ะ” ผู้เขียนตัดสินใจนำมาเขียนรับใช้เป็นบทความใน blog นี้ (แทนที่จะตอบในเว็บบอร์ด) เผื่อจะเป็นประโยชน์แก่ผู้ค้นหาข้อมูลเดียวกันนี้ท่านอื่นๆ

เนื้อหาในบทนี้ท่านจะได้เรียนเรื่องเกี่ยวกับ object lifetime หรือช่วงชีวิตของ object ซึ่งเป็นเรื่องเกี่ยวกับการเกิดและการดับของ object วิธีทำลาย object ของโปรแกรม Garbage collector (GC) ว่ามีคติอย่างไรในการตัดสินใจว่า object ใดควรอยู่หรือควรถูกทำลาย และ COM object มีช่วงชีวิตอย่างไร

ผู้เขียนจะเริ่มโดยอธิบายความหมาย (โดยสังเขป) ของคำสามคำในหัวเรื่อง คือคำว่า Object lifetime, Garbage collector และ Marshalling ก่อนจะเข้าเรื่องความสัมพันธ์ของสามสิ่งนี้ต่อไปในตอนท้าย

 

Object lifetime

Object lifetime คือช่วงชีวิตของ object ระยะเวลาเริ่มจาก object ถูกสร้างขึ้น คงอยู่ ถูกใช้งาน หมดหน้าที่การทำงานและถูกทำลาย คือช่วงชีวิตของ object

Object คือสิ่งที่เราสร้างจากคลาส เมื่อเราสร้าง object โปรแกรม CLR จะจัดสรรพื้นที่หน่วยความจำใน “ฮีพ” (หมายถึง managed heap ของ .NET) เพื่อทำหน้าที่เก็บ object และข้อมูลของ object (สมาชิกแบบ field) object จะคงอยู่ใน heap จนกระทั่งโปรแกรม GC ตรวจพบว่า object จะไม่ถูกใช้งานอีกแล้ว มันจะตัดสินใจทำลาย object นั้น โดยกำหนดให้พื้นที่ใน heap บริเวณที่เคยใช้เก็บ object นั้นกลายเป็นที่ว่าง

 

Garbage collector

Garbage collector คือโปรแกรมทำหน้าที่จัดการหน่วยความจำโดยอัตโนมัติ ภาษาแบบ OOP ส่วนมากเช่นภาษา Lisp, Smalltalk, Java และ C# ล้วนมี Garbage collector ในที่นี้ผู้เขียนจะพูดถึงเฉพาะ Garbage collector ซึ่งเป็นส่วนหนึ่งของบริการต่างๆ ใน .NET Framework

GC ตรวจสอบว่า object หมดอายุและสมควรถูกทำลายแล้วหรือไม่โดยใช้กระบวนการหรือ algorithm ที่แน่นอน ซึ่งจะอธิบายต่อไปภายหลัง

 

Marshalling

คำว่า Marshall ใน .NET และภาษา C# มีความหมายสองอย่างคือ

  1. การแปลง object ให้อยู่ในรูปของ byte ที่เรียงกัน ปรกติจะเป็นข้อมูลแบบ text ในรูปแบบ XML เพื่อการรับ-ส่งตัว object และข้อมูล ไปยังระบบอื่น เช่นบันทึกเป็นไฟล์ลงในดิสก์ หรือส่งไปยังคอมพิวเตอร์เครื่องอื่นในเครือข่าย
  2. การแปลง COM object (โค้ด native ในสภาพของ DLL แบบ WinAPI/Win32) ให้เป็น object แบบ .NET การแปลงทำได้โดยใช้บริการต่างๆ ที่ .NET เตรียมไว้ให้คือ Platform Invocation Services ที่มักเรียกย่อว่า P/Invoke

บทความนี้จะอธิบาย Marshalling ในความหมายที่สอง โดยจะพูดถึงความสัมพันธ์ของ P/Invoke กับ Garbage collector เป็นหลัก

 

การสร้างและทำลาย object

การจะเข้าใจความสัมพันธ์ของ P/Invoke กับ Garbage collector ได้จะต้องเข้าใจพื้นฐานหลักการทำงานของ Garbage collector ดังนั้นในหัวข้อนี้ผู้เขียนจะอธิบายวิธีที่ CLR สร้าง object และวิธีที่ GC ทำลาย object โดยสังเขป

ในสภาพแวดล้อมที่ไม่ถูกจัดการโดย GC ยกตัวอย่างเช่นใช้ภาษา C++ แบบ WinAPI เมื่อเราสร้างและใช้งาน object จะเกิดกระบวนการต่างๆ ต่อไปนี้

1. C runtime จองพื้นที่ในหน่วยความจำเพื่อเก็บตัว object และข้อมูลต่างๆ ของ object
2. โค้ดของเรากำหนดค่าเริ่มต้นต่างๆ เพื่อให้ object ทำงานได้
3. โค้ดของเราใช้งาน object โดยเรียกใช้สมาชิกต่างๆ ของ object
4. โค้ดของเราล้างค่าอ้างอิงต่างๆ เพื่อทำลาย object
5. โค้ดของเราแจ้งให้ C runtime ปลดปล่อยหน่วยความจำ

ขั้นตอนทั้งห้าเป็นสิ่งที่เกิดขั้นตลอดเวลาเมื่อโปรแกรมทำงาน ปัญหาหลักที่อาจเกิดขึ้นกับกระบวนการนี้มีสองอย่างคือ

1. โปรแกรมของเราลืมเรียกโค้ดส่วนล้างค่าอ้างอิงและปลดปล่อยหน่วยความจำ
2. โปรแกรมของเราจองพื้นที่ทับพื้นที่ในหน่วยความจำที่ไม่ว่าง (กำลังถูกใช้โดยโปรแกรมอื่น)

ผลลัพธ์ที่เกิดจากปัญหาสองประการนี้ทำนายได้ยาก ผู้สร้าง.NET Framework จึงคิดป้องกันปัญหาทั้งสอง โดยให้ runtime (Common Language Runtime หรือ CLR) จัดการขั้นตอนทั้งหมดให้เราดังนี้

1. CLR จองพื้นที่ในหน่วยความจำเป็นพื้นที่ขนาดใหญ่เรียกว่า heap
2. CLR กำหนดพื้นที่ใน heap ให้แก่ object
3. โปรแกรมของเราใช้งาน object โดยเรียกใช้สมาชิกต่างๆ ของ object
4. GC ล้างค่าอ้างอิงต่างๆ ของ object เพื่อยกเลิกการใช้งาน object
5. GC ปลดปล่อย heap ส่วนที่เคยเก็บ object

จะเห็นว่าขั้นตอนเป็นอัตโนมัติเกือบทั้งหมด เราเพียงเรียกใช้งาน object (ในขั้นตอน 3) โดยไม่ต้องกังวลเรื่องการจองหรือการปลดปล่อยหน่วยความจำ

 

การจัดสรรหน่วยความจำของ .NET CLR

เมื่อโปรแกรมของเราเริ่มทำงาน CLR จะจองพื้นที่ในหน่วยความจำไว้ส่วนหนึ่ง เป็นพื้นที่ติดต่อกันทั้งหมด เรียกว่า heap หรือ managed heap เพื่อใช้เป็นที่เก็บ object (โปรดดูรายละเอียดเรื่อง heap ในบทที่ 2) CLR จะสร้าง pointer ตัวหนึ่งชื่อ NextObjPrt ทำหน้าที่ระบุตำแหน่งในหน่วยความจำที่จะใช้เก็บ object ตัวใหม่ โดยในตอนเริ่มงานจะกำหนดให้ NextObjPrt มีค่าเท่ากับตำแหน่งล่างสุดของ heap

ยกตัวอย่างการทำงานของ CLR เป็นดังนี้ เมื่อ CLR พบว่าโปรแกรมของเราต้องการสร้าง object A มันจะจองที่ใน heap ให้แก่ object A แล้วเพิ่มค่า NextObjPrt ไปยังตำแหน่งถัดไป หากเราสร้าง object อีกสองตัว คือ B และ C ผลลัพธ์จะเป็นอย่างที่เห็นในภาพ

 

เมื่อจัดสรรหน่วยความใน heap ให้ object แล้ว CLR จะเพิ่มค่า pointer ชื่อ NextObjPrt ให้ชี้ไปยังตำแหน่งถัดไปจาก object ตัวสุดท้าย หาก CLR ต้องการสร้าง object ใหม่ แต่ heap เต็ม จะเกิด error แบบ OutOfMemoryException เมื่อทำคำสั่ง new

 

Root และ Garbage collection

GC จะตรวจสอบว่ามี object ใดใน heap ที่ไม่ถูกโปรแกรมเรียกใช้อีกต่อไปแล้วหรือไม่ (เป็นขยะ) หากมีมันจะลบ object นั้นออกจาก heap วิธีการตรวจสอบว่า object เป็นขยะหรือไม่ ทำได้โดยการตรวจสอบ root

โปรแกรมทุกโปรแกรมจะมีสิ่งที่เรียกว่า root ซึ่งประกอบขึ้นจากสิ่งต่างๆ ดังนี้

1. pointer ที่ชี้ไปยัง object แบบ static หรือ global
2. pointer ที่ชี้ไปยังตัวแปรท้องถิ่นใน stack ของ thread นั้นๆ
3. pointer ที่ชี้ไปยังพารามิเตอร์ใน stack ของ thread นั้นๆ
4. รีจิสเตอร์ของซีพียูซึ่งเก็บ pointer ที่ชี้ไปยัง object ใน heap

ผู้ทำหน้าที่ดูแลรักษาสถานะของ root คือ CLR และ JIT (Just-in-time compiler) โดยทั้งสองจะยินยอมให้ GC ตรวจสอบ root ของโปรแกรมใดๆ ก็ได้

เมื่อ GC เริ่มทำงานมันจะอนุมานว่า object ทุกตัวใน heap เป็นขยะหรือพูดอีกอย่างคือ GC จะอนุมานว่าไม่มี root ของโปรแกรมใดๆ อ้างไปยัง object ใน heap เลย จากนั้น GC จะเริ่มท่องไปใน root แล้วทำแผนที่แสดงความสัมพันธ์ของ object ต่างๆ ใน heap

 

ภาพนี้แสดง heap เมื่อมี object เกิดขึ้นจำนวนมาก แต่ root อ้างอิงโดยตรงไปยัง object เพียงสี่ตัวคือ A, C, D และ F เมื่อ GC ท่องไปใน root แล้วทำแผนที่แสดงความสัมพันธ์ของ object ต่างๆ ใน heap มันพบว่า object C อ้างถึง object H ด้วย GC จึงนำ H มารวมไว้ในแผ่นที่ด้วยเช่นกัน และ GC จะท่องไปใน heap เพื่อตรวจปรับปรุงแผนที่อยู่เสมอ

 

เมื่อ GC ตรวจสอบ root ครบแล้ว GC จะรู้ว่ามี object ใดบ้างที่ถูกอ้างถึงโดย root และ object อื่นๆ และมี object ใดบ้างที่ไม่ถูกอ้างถึงเลย ซึ่ง object เหล่านั้นจะถูกพิจารณาว่าเป็นขยะ ยกตัวอย่างในภาพ object B, E, G, I และ J ถูกมองว่าเป็นขยะ ดังนั้นพื้นที่ใน heap บริเวณ B, E, G, I และ J จึงถูกมองว่าเป็นที่ว่าง

GC จะขจัดที่ว่างใน heap โดยขยับ object H ลงมาติดกับ object D เพื่อให้ object ที่ดีทั้งหมด อยู่ในพื้นที่ๆ ต่อเนื่องกัน ผลลัพธ์ที่ได้จะเป็นดังภาพนี้

 

สภาพของ heap หลัง GC นำขยะออกไปแล้ว NextObjPrt จะถูกปรับตำแหน่งใหม่ให้ถูกต้อง เมื่อถึงตอนนี้หากโปรแกรม run คำสั่ง new อีกครั้ง object จะถูกสร้างขึ้นได้โดยไม่มี error แบบ OutOfMemoryException

 

ที่อธิบายมานี้เป็นหลักการทำงานของ GC อย่างง่าย อันที่จริง GC จะไม่ทำลาย object ทันทีที่กลายเป็นขยะ แต่จะเก็บไว้ก่อน และจัดลำดับไว้เป็นรุ่นๆ (generation) object บางตัวที่ตายแล้วอาจคืนพื้นชีพขึ้นได้ (ด้วยกระบวนการ resurrection ในกรณีมีการทำ finalization) โปรดดูรายละเอียดเรื่องการลำดับรุ่นของ GC ในบทที่ 2 หัวข้อ Garbage collector

 

Runtime-Callable Wrappers

หากต้องการเรียกใช้ method ในไฟล์ .DLL แบบ Win32 ทำได้โดย copy ไฟล์ .DLL ตัวที่ต้องการไปใส่ในโฟลเดอร์ bin แล้วเขียนโค้ดเรียกใช้ดังนี้

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace testInput
{
    class PortAccess
    {
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void PortOutput(int adress, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        public static extern int PortInPut(int address);
        int portAddress;

        public PortAccess()
        {
            portAddress = 0xF300;
        }

        public void OutPut(int value)
        {
            PortOutput(portAddress, value);
        }
        public int InPut()
        {
            return PortInPut(portAddress);
        }
    }
} 

โค้ดข้างบนแสดงวิธีเรียกใช้ method Out32 และ Inp32 จากไฟล์ inpout32.dll ที่ผู้เขียนมักใช้เพื่อรับ-ส่งข้อมูลทางพอร์ทขนาน (printer port) เมื่อต้องการเชื่อมต่อกับอุปกรณ์ฮาร์ดแวร์ต่างๆ

ตัวอย่างข้างบนเป็นการทำ DLLImport ในกรณีที่ต้องการนำ COM object มาทำเป็น object ใน managed code ก็ทำได้โดยใช้กลไกที่เรียกว่า Interoperability (หรือมักเรียกย่อว่า interop) ซึ่งทำได้ง่ายมากด้วยการ add reference (ใน Visual Studio .NET เลือกเมนู Project/Add Reference เลือก tab COM แล้วเลือก COM object ที่แสดงในรายการ)

เมื่อ add reference แล้วเราสามารถใช้งาน COM object ได้เหมือน managed object เพราะผู้สร้าง .NET ได้จัดเตรียมกลไกเรียกว่า Runtime-Callable Wrappers (RCW) เพื่อให้เราสามารถใช้งาน COM component ได้ใกล้เคียง .NET object มาก โดย RCW จะจัดการด้านต่างๆ ต่อไปนี้ให้โดยอัตโนมัติ

1. Marshall ข้อมูลและ method ระหว่าง .NET กับ COM
2. เป็น proxy กับอินเตอร์เฟสของ COM
3. จัดการ identity (เหมือน root) ของ object
4. จัดการ interface มาตรฐานของ COM (เช่น IUnkonwn และ IDispatch)
5. ดูแลเมื่อเกิด error และจัดให้มี exception handling
6. จัดการกับ object lifetime

ในบทนี้เราจะพิจารณาเฉพาะหัวข้อสุดท้ายคือ object lifetime หรือช่วงชีวิตของ object

 

RCW ทำหน้าที่กันเราไว้จากความยุ่งยากในการเชื่อมต่อกับ COM object โดยมันจะ consume interface ต่างๆ ของ COM object และเผยให้เราเห็นเพียงบางตัว ในภาพนี้ RWC consume interface สามตัวคือ IUnkonw, IDispatch และ INew แต่เผยให้เราเข้าถึงได้เฉพาะ INew หลักการนี้มีชื่อเรียกว่า Marshaling selected interfaces

 

ยกตัวอย่างเช่นหากเรา add reference คลาสไลบรารีของ Microsoft Word (ซึ่งทำหน้าที่อ่านและเขียนเอกสารแบบ .doc) แล้ว เราสามารถสร้าง object ได้ด้วยคำสั่งดังนี้

Word.Application myWord = new Word.ApplicationClass();

 

Object lifetime

ในหัวข้อที่ผ่านมาผู้เขียนพูดถึงการสร้างและทำลาย object แบบ .NET ซึ่งเป็น object ที่เกิดจากคลาสที่เราเขียนในภาษา C# แต่ในกรณี COM object โปรแกรม GC จะจัดการกับมันอย่างไร

ในภาษา C++ เราสามารถควบคุม object lifetime ได้ตามใจชอบโดยใช้ตัวกระทำ new เพื่อสร้าง object และ delete เพื่อทำลาย object แต่ COM object เราทำเช่นนั้นไม่ได้ เพราะ object ตัวเดียวอาจถูกใช้งานได้จากหลายๆ โปรแกรม หากโปรแกรมตัวใดตัวหนึ่งทำลาย object โปรแกรมที่เหลือย่อมจะทำงานล้มเหลว COM object จึงใช้หลักการ reference count เพื่อควบคุม object lifetime

หลักการทำงานของ reference count (RC) คือเมื่อ client ต้องการใช้งาน object มันจะต้องเรียก interface IUnknown::AddRef ซึ่งจะเพิ่มค่าของ RC ขึ้นหนึ่ง เมื่อ client ใช้งาน object เสร็จแล้วมันจะต้องเรียก interface IUnknown::Release ซึ่งจะทำหน้าที่ลดค่า RC ลงหนึ่ง เมื่อค่าของ RC ลดลงเท่ากับศูนย์แสดงว่าไม่มีโปรแกรมใดต้องการใช้งาน object อีกต่อไป runtime จึงรู้ว่าสามารถทำลาย object นั้นได้

เมื่อเรานำ COM object มาใช้ในสภาพแวดล้อม .NET managed โดยใช้วิธี add reference และสร้าง object เป็น RCW โปรแกรม CLR จะรักษาค่าของ RC ไว้ให้เท่ากับหนึ่งเสมอ (ยกเว้น object ถูก marshal ไปยัง AppDomain อื่น CLR จะเพิ่มค่า RC ขึ้นหนึ่ง) ทำให้ COM object ไม่ทำลายตัวเองก่อนจะถูกทำลายโดย GC

เนื่องจาก RCW เป็นคลาสใน .NET Framework ดังนั้น object ที่เกิดจาก RCW จึงเป็น managed object โปรแกรม GC สามารถจัดการกับ object แบบ RCW ได้เหมือน object อื่นๆ ทำให้ lifetime ของ COM object กับ .NET managed object ไม่แตกต่างกัน

หากต้องการให้ RCW ถูกกำจัดทันทีก็สามารถทำได้ตามขั้นตอนต่อไปนี้

  1. กำหนดให้ตัวแปรที่อ้างอิง RCW มีค่าเป็น null
  2. เรียก method System.GC.Collect เพื่อบังคับให้ GC ทำงาน
  3. เรียก method System.GC.WaitForPendingFinalizers เพื่อหยุดการทำของ thread ไว้จนกว่า thread ที่กำลังดำเนินการกับคิว finalizer จะล้างคิวหมด
  4. เรียก method Marshal.ReleaseComObject เพื่อลดค่าของ RC ลงหนึ่ง

ขั้นตอนเหล่านี้ให้ใช้เมื่อจำเป็นจริงๆ เท่านั้น เพราะโดยปรกติ GC สามารถจัดการ RCW ได้ดีอยู่แล้ว หากไม่มีเหตุจำเป็นควรปล่อยให้ GC จัดการไปตามปรกติ

 

สรุปเรื่อง ความสัมพันธ์ของ Object lifetime, Garbage collector และ Marshalling

• Object lifetime คือช่วงเวลาตั้งแต่ object ถูกสร้างถึง object ถูกทำลาย
• Garbage collector คือบริการใน CLR ทำหน้าที่กำจัด object ซึ่งหมดประโยชน์แล้ว
• Marshalling คือการรับ-ส่งข้อมูลและ method ระหว่าง unmanaged และ managed
• GC เก็บ object ใน heap และใช้ pointer NextObjPrt เก็บสถานะของ heap
• GC พิจารณาว่า object เป็นขยะโดยใช้ root เป็นตัวอ้างอิง
• การนำ COM object มาทำเป็น object แบบ managed ทำได้โดยใช้ RCW
• RCW มี object lifetime เหมือน managed object ทั่วไป

ตอนต่อไป : กายวิภาคของของ ASP.NET

ตอน 33 การเขียนโปรแกรมบนเว็บด้วยภาษา C#

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

มันยากที่จะอ่านหนังสือสอนเล่นกลโดยไม่พลิกดูที่ปกบ่อยๆ เพื่อให้มั่นใจว่ามันไม่ใช่หนังสือสอนการเขียนโปรแกรม

Bruce Tognazzini

 

บทที่ 6 การเขียนโปรแกรมบนเว็บด้วยภาษา C#

ก่อนหน้าที่จะมี ASP.NET การสร้าง desktop application (โปรแกรมที่ทำงานในเครื่องคอมพิวเตอร์ส่วนบุคคลต่อไปจะเรียก Win app) กับการสร้าง web application (โปรแกรมที่ทำงานร่วมกับ sever ในอินเตอร์เน็ต โดยใช้ web browser เป็นตัว client ต่อไปจะเรียก Web app) เป็นงานที่แตกต่างกันมาก จนกระทั่ง ASP.NET ทำให้ความแตกต่างนี้แคบลง

ในบทนี้ท่านจะได้เรียนหัวข้อต่างๆ ที่สำคัญสำหรับการเขียนโปรแกรมในเว็บด้วยภาษา C# ซึ่งมีหัวข้อหลักดังนี้

  • การเขียน Web app
  • กายวิภาคของของ ASP.NET
  • สิ่งที่ต้องใช้เพื่อการพัฒนา ASP.NET
  • โครงสร้างเว็บไซต์ ASP.NET
  • ไฟล์ชนิดต่างๆ ใน ASP.NET
  • การทำงานของหน้าเว็บแบบ ASP.NET
  • Postback และ Round trip
  • Server Controls
  • Event อันเกิดจาก Page และ Server control
  • event ที่มีความถี่สูง
  • สถาปัตยกรรมของ ASP.NET
  • System.Web.UI Namespace
  • ASP.NET Page Class
  • Code-Behind
  • Web User Control
  • CSS กับ Web server control
  • Global.asax
  • Web.config
  • เว็บไซต์ catalog สินค้า

 

การเขียน Web app

ในปี ค.ศ. 1988 บริษัทไมโครซอฟท์นำ OS/2 มาปรับปรุงใหม่และตั้งชื่อว่า Windows NT พอถึงปี 1995 Windows NT ก็ถูกพัฒนามาจนถึงเวอร์ชัน 3.51 และในเวอร์ชันนี้ไมโครซอฟท์ได้แนะนำสิ่งใหม่ที่เรียกว่า Internet Information Services (IIS) เป็นชุดของ service เกี่ยวกับอินเตอร์เน็ต ปัจจุบันนี้ IIS (ร่วมกับ Windows NT ที่บัดนี้กลายเป็น Windows Server 2005) ซึ่งกลายเป็น web server ที่ได้รับความนิยมมากที่สุดเป็นที่สองรองจาก Apache HTTP server และความแตกต่างเริ่มลดลงเรื่อยๆ (คือความนิยมใน IIS เพิ่มขึ้น ขณะที่ความนิยมใน Apache ลดลง อ้างจาก Netcraft)

IIS ได้รับการปรับปรุงมาเรื่อย (ปัจจุบันเป็น version 7.0) แต่สิ่งสำคัญเกิดขึ้นในปี 1996 เมื่อ IIS ออกเป็น version 3.0 เพราะมันได้ผนวกตัว add-on ใหม่ชื่อ ASP 1.0 เข้ามาด้วย ASP หรือ Active Server Pages คือเทคโนโลยีที่ทำให้ server สามารถสร้างหน้าเว็บได้อย่างมีพลวัต ทำให้การเขียนโปรแกรมด้วย server script (เช่น vbscript) สามารถเปลี่ยนแปลงหน้าเว็บได้ ทำให้สามารถสร้าง web app ได้ง่ายขึ้น

ปัจจุบัน ASP ได้กลายเป็น ASP.NET โดยกลายเป็นส่วนหนึ่งของเทคโนโลยี .NET Framework (ออก version 2.0 ในเดือนธันวาคม ค.ศ. 2005) ASP.NET มีความก้าวหน้ากว่า ASP มาก มันทำให้นักเขียนโค้ดสามารถเขียนโปรแกรมด้วยภาษา .NET กับหน้าเว็บได้เลย โดยจะเขียนแทรกเข้าไปในหน้าเว็บโดยตรง (inline code) หรือจะเขียนแยกส่วนโค้ดไว้เป็นอีกไฟล์ต่างหากก็ได้ (code behind) ในหนังสือเล่มนี้จะใช้แบบ code-behind

 

รูปแบบหรือ model การเขียนโปรแกรมใน .NET Framework มีสามแบบคือ WinForm ซึ่งเป็นการสร้าง desktop application WebForm เป็นการสร้าง Web application และ Web Service เป็นการสร้างโปรแกรมที่ทำงานในคอมพิวเตอร์หลายๆ เครื่องในเครือข่าย หนังสือเล่มนี้มีเฉพาะแบบที่สองคือ WebForm

 

การเขียนโปรแกรมด้วยภาษา .NET เพื่อทำงานกับเว็บไซต์โดยทั่วไปแล้วจะคล้ายคลึงกับการเขียนโปรแกรมแบบ Win app มาก แต่กระนั้นก็ยังถือว่าเป็นแบบ (model) ที่ต่างกัน โดยการสร้างซอฟท์แวร์ใน .NET จะถูกแบ่งออกเป็นสาม model คือ WinForm เป็นการสร้าง desktop app เพื่อทำงานในคอมพิวเตอร์ส่วนบุคคล WebForm คือการสร้าง web app เพื่อทำงานใน web browser โดยการทำงานส่วนใหญ่จะเกิดขึ้นใน server และอย่างที่สามคือ web service ซึ่งเป็นการทำงานประสานกันระหว่างโปรแกรมที่ทำงานอยู่ในคอมพิวเตอร์หลายๆ เครื่อง (ในอินเตอร์เน็ต)

 

สรุปเรื่องการเขียน web app

  • ASP.NET web server คือคอมพิวเตอร์ที่มีโปรแกรม Windows server (หรือ XP หรือ Vista), IIS และ .NET Framework ติดตั้งไว้
  • การเขียนโปรแกรมสร้างเว็บใน ASP.NET มีวิธีทำคล้ายการเขียนโปรแกรมแบบ desktop application
  • การเขียนโค้ดใน ASP.NET 2.0 ขึ้นไปทำได้สองวิธีคือเขียนแทรกเข้าไปในหน้าเว็บโดยตรง (inline code)กับเขียนแยกส่วนโค้ดไว้เป็นอีกไฟล์ (code behind)
  • การสร้างซอฟท์แวร์ใน .NET มีสาม model คือ WinForm, WebForm และ Web service

ตอนต่อไป: ความสัมพันธ์ของ Object lifetime, Garbage collector และ Marshalling