06 February 2007

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

xx
เมื่อถึง ค.ศ. 1990 บริษัทซัน ไมโครซิสเต็มนำภาษา Java (อย่าปะปนกับภาษา JavaScript เพราะเป็นคนละภาษากัน) ออกสู่สาธารณชน มันได้รับความนิยมในทันที เพราะเป็นภาษาสมัยใหม่ที่มีคุณสนับสนุน OOP อย่างสมบูรณ์ และมีข้อดีคือมี virtual machine ในระบบปฏิบัติหลายแบบ ทำให้เขียนเพียงครั้งเดียวสามารถนำไปใช้งานทุกที่ โดยไม่ต้องคอมไพล์ใหม่ ทำให้สะดวกเมื่อนำไปใช้ในองค์กรขนาดใหญ่ ที่มีฮาร์ดแวร์คละกันหลายแบบ

ต่อมาในปี ค.ศ. 2000 บริษัทไมโครซอฟท์ได้ปรับกระบวนทัศน์ขององค์กร ให้มุ่งไปยังเครือข่ายอินเตอร์เน็ต ไมโครซอฟท์ได้ประดิษฐ์ .NET Framework และภาษาต่างๆ หลายภาษาเช่น VB.NET, C# และ J# โดยทั้ง .NET Framework เองและภาษาสำหรับ .NET มีความเป็น OOP อย่างสุดโต่ง

จากที่กล่าวมาจะว่าเห็นแนวโน้มในการสร้างซอฟท์แวร์กำลังมุ่งไปยัง OOP มากขึ้นเรื่อย จึงนับเป็นการดีหากนักเขียนโปรแกรมจะเรียนรู้วิธีคิดแบบ OOP จนสามารถเขียนโปรแกรมภาษาใดภาษาหนึ่งที่สนับสนุน OOP อย่างเต็มรูปแบบ เนื่องจากระบบปฏิบัติการวินโดวส์ของบริษัทไมโครซอฟท์ถูกใช้อย่างกว้างขวางมาก ผู้เขียนเห็นว่าการเรียนรู้วิธีเขียนโปรแกรมใน .NET Framework จึงไม่น่าจะเสียเวลาเปล่า

ภาษาที่เป็นภาษาหลักของ .NET Framework คือภาษา C# ซึ่งบัดนี้ได้กลายเป็นภาษาตามมาตรฐานของ ISO และ ECMA แล้ว ดังนั้นการเรียนรู้หลักการ OOP โดยใช้ภาษา C# เป็นเครื่องมือจึงน่าจะเป็นประโยชน์ไม่เฉพาะแต่ในระบบปฏิบัติการ Windows หรือ .NET เท่านั้น แต่อาจนำไปใช้ได้กับระบบปฏิบัติการอื่นด้วย (เช่น Linux) อีกทั้งยังเป็นวิธีฝึกฝนการคิดแบบ OOP ที่ดีวิธีหนึ่ง



โครงการ Mono จัดทำ .NET Framework ที่ทำงานใน Mac OS X, Linux และ Solaris (www.mono-project.com)
x
x
Object based programming

นักเขียนโปรแกรม VB6 บางคนพบว่าตนไม่สามารถเขียนโปรแกรมใน VB.NET ได้ดีนัก เพราะพบแนวคิดที่แตกต่างจาก VB6 ไปมากจนไม่อาจปรับวิธีทำงานให้เข้ากับ VB.NET ได้ สาเหตุที่เป็นเช่นนั้นเพราะ VB6 เป็น Object based programming (การเขียนโปรแกรมที่มีพื้นฐานจากวัตถุ) ส่วน VB.NET เป็นภาษา OOP โดยสมบูรณ์ มิได้เป็นเพียง VB6 เวอร์ชันใหม่ ขณะที่นักเขียนโปรแกรมที่เคยเขียนภาษ C++ และหรือภาษา Java มาแล้วจะสามารถเรียนรู้ภาษา C# ได้อย่างรวดเร็วเพราะมีพื้นฐานเกี่ยวกับ OOP มาบ้างแล้ว

ใน VB6 มี object อยู่จำนวนหนึ่งเรียกว่า Control (เช่นปุ่มและ Label) มันมี property method และ event ครบถ้วนเหมือน object ใน OOP แต่เราไม่สามารถนำมันมา “สืบสันดาน” (inheritance) หรือนำมาสร้างเป็น object ใหม่ โดยเพิ่มเติมแก้ไขคุณสมบัติของมันได้ง่ายเหมือนที่ทำได้ในภาษา .NET การไม่มีคุณสมบัติ inheritance เป็นเครื่องชี้ว่าภาษา VB6 ไม่ใช่ภาษา OOP



Visual Basic 6.0 เป็นภาษาที่ได้รับความนิยมมากเพราะช่วยให้พัฒนาโปรแกรมได้อย่างรวดเร็ว
x
x
Object Oriented Programming

OOP ไม่ใช่ภาษา ไม่ใช่ซอฟท์แวร์ มันเป็นเพียง Paradigm (อ่านว่า พาราดิม แปลว่า แบบ หรือตัวอย่าง) หรือ สไตล์การเขียน มันยังเป็นวิธีคิดอีกด้วย หากนักเขียนโค้ดยังคิดแบบ non-OOP แม้จะใช้ซอฟท์แวร์หรือใช้ภาษา OOP อย่างดี โค้ดผลลัพธ์ก็จะไม่เป็น OOP ไปได้

OOP เป็นส่วนหนึ่งของวิชาวิศวกรรมซอฟท์แวร์ วิชานี้มีขึ้นเพื่อยกระดับการสร้างซอฟท์แวร์ให้เป็นไปตามหลักวิศวกรรม เพราะเดิมการเขียนโค้ดเป็นเรื่องของความสามารถเฉพาะตัว นักเขียนโปรแกรมแต่ละคนใช้หลักการเฉพาะตน ทำให้การสร้างซอฟท์แวร์มีความเป็นศิลปะมากกว่าศาสตร์ พฤติกรรมเช่นนี้เป็นปัจจัยหนึ่งซึ่งทำให้เกิดสภาพการณ์ที่เรียกว่า วิกฤตกาลซอฟท์แวร์ (Software crisis) ตอนปลายทศวรรษ 1960 เป็นวิกฤตกาลด้านความขาดแคลนซอฟท์แวร์ที่มีประสิทธิภาพ

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


การมาถึงของไมโครโปรเซสเซอร์มีส่วนทำให้วิกฤตกาลซอฟท์แวร์รุนแรงขึ้น

ในปีค.ศ. 1968 องค์การนาโต้ (NATO องค์การสนธิสัญญาแอตแลนติกเหนือ) ได้จัดสัมมนาเรื่อง วิศวกรรมซอฟท์แวร์ ที่ประเทศเยอรมัน เพื่อหาแนวทางแก้ไขวิกฤตกาลซอฟท์แวร์ การสัมมนานี้วางรากฐานของวิศวกรรมซอฟท์แวร์ โดยหยิบยืมเทคโนโลยีและวิธีปฏิบัติจากสาขาวิชาอื่น มาปรับใช้กับการสร้างซอฟท์แวร์ ซึ่งไม่ได้หมายถึงแค่วิธีเขียนโค้ด แต่ยังรวมถึงขึ้นตอนปฏิบัติอื่นๆ ด้วย เช่น การออกแบบ การทดสอบ การบริหารโครงการ และงานวางแผนต่างๆ เป็นต้น

ในปี ค.ศ. 1992 ไอวาร์ จาคอบสัน (Ivar Jacobson) ได้นำเสนอแนวคิด วิศวกรรมซอฟท์แวร์แบบวัตถุวิธี (Object-oriented software engineering หรือ OOSE) แนวคิดนี้เสนอให้นำหลักการ use cases มาประยุกต์ใช้กับการออกแบบซอฟท์แวร์โดยโดยการใช้ UML (Unified Modeling Language) เป็นเครื่องมือหลัก

ทั้ง OOSE และ OOP ต่างเป็นส่วนหนึ่งของวิชา “การออกแบบและวิเคราะห์แบบวัตถุวิธี” (Object-oriented Analysis and Design หรือ OOAD) แม้ OOSE และ OOP จะชื่อคล้ายกันและอยู่ในวิชา OOAD เหมือนๆ กัน แต่ก็เป็นสองหัวข้อวิชาที่แยกจากกัน โดย OOSE เน้นเรื่องการออกแบบ ส่วน OOP เน้นเรื่องการเขียนโค้ด ในหนังสือเล่มนี้ผู้เขียนจะสอนวิธีคิดและเขียนโค้ดให้เป็น OOP เท่านั้น หากต้องการศึกษาเรื่อง OOAD และ OOSE ท่านอาจศึกษาได้ชั้นเรียนวิชานี้ หรือจากตำราเล่มอื่น

ขอย้อนกลับไปในช่วงทศวรรษ 1970 มีการเสนอว่าหากจะแก้วิกฤตซอฟท์แวร์ ก็น่าจะหาทางทำให้การสร้างซอฟท์แวร์ง่ายเหมือนฮาร์ดแวร์ ในสมัยนั้นฮาร์ดแวร์ส่วนมากถูกสร้างจากไอซีดิจิตอล แบบ “โลจิกเกต” ยกตัวอย่าง เช่น หากท่านต้องการสร้างวงจรดิจิตอลอะไรสักอย่าง ท่านไม่จำเป็นต้องนำทรานซิสเตอร์ ตัวต้านทาน และตัวเก็บประจุมาต่อกัน แต่ท่านสามารถเลือกไอซีที่เป็น โลจิกเกต (logic gate) ที่มีอยู่มากมายหลายร้อยแบบ นำมาสร้างเป็นวงจร digital combination (ดิจิตอล คอมบิเนชัน คือวงจรดิจิตอลที่เกิดจากการนำ logic gate หลายๆ แบบมาเชื่อมต่อกัน) ที่มีคุณสมบัติตามที่ท่านต้องการได้ไม่ยาก

การนำไอซีดิจิตอลมาใช้งานท่านไม่จำเป็นต้องรู้กระบวนการทำงานภายในของมัน ท่านเพียงแต่ต้องรู้ว่ามันต้องการอินพุท (input) อย่างไร และจะให้ผลลัพธ์ (output) ออกมาเป็นอย่างไร (ข้อมูลเพื่อการนำไปเชื่อมต่อหรือ interface กับไอซีตัวอื่น) ซึ่งเป็นเรื่องดี เพราะท่านไม่ต้องเสียเวลาไปกับการเรียนรู้วิธีทำงานภายในของไอซีแต่ละตัว ทำให้การออกแบบสร้างวงจรใหม่ๆ ทำได้รวดเร็วและง่ายขึ้นมาก นี่คือสาเหตุหนึ่งที่ทำให้วงการฮาร์ดแวร์ก้าวหน้าไปได้อย่างรวดเร็ว

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


ของเล่นพลาสติก เลโก (Lego) ทุกชิ้นถูกออกแบบให้มี interface ตรงกัน

ย้อนกลับไปอีกในปี 1968 องค์การนาโต้ (NATO องค์การสนธิสัญญาแอตแลนติกเหนือ) ได้จัดสัมมนาเรื่อง Mass Produced Software Components (การผลิตชิ้นส่วนซอฟท์แวร์เป็นจำนวนมาก) ที่ประเทศเยอรมัน เพื่อต้านวิกฤตกาลซอฟท์แวร์ การสัมมนานี้วางรากฐานแนวคิดการทำซอฟท์แวร์ให้เป็น component หรือซอฟท์แวร์ไอซี ผู้นำการสัมมนาเรียกแนวคิดนี้ว่า Component Oriented Programming (ย่อว่า COP) หรือการเขียนโปรแกรมโดยเน้นการสร้างชิ้นส่วน

component หมายถึง Object ที่ถูกสร้างขึ้นตามข้อกำหนดจะเพาะเพื่อตอบสนองเป้าหมายห้าประการคือ

  1. นำกลับมาใช้ใหม่ได้
  2. เป็นอิสระต่อสภาพแวดล้อม
  3. ทำงานร่วมกับ component อื่นได้
  4. ใช้วิธี Encapsulation
  5. เป็นอิสระต่อการนำไปใช้และการปรับเปลี่ยนเวอร์ชัน


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

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

x

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

x

บทที่ 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
x

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

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

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

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

x

คลาสกับ 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 แต่ในบางสถานการณ์ก็ถือว่ามีความเหมาะสมดี
x

x

object กับ type

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

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

xxxxint 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 เพื่อเก็บข้อมูลนักเรียนเป็นดังนี้

struct
{
xxxxchar cname[8];
xxxxchar sname[16];
xxxxchar exam[16];
xxxxchar grade;
} record;

จะเห็นว่าการสร้าง 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 ทั้งหมดมาประกอบเข้าด้วยกัน เพื่อให้ทำงานร่วมกัน จะทำให้โปรแกรมของเราสร้างผลลัพธ์ได้ตามความประสงค์
x

x
การใช้งาน 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: การแปรคุณสมบัติ

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

x

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

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

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

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

05 February 2007

บทนำ

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

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

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

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

  • หากท่านคือนักเขียนโค้ดแบบเดิมๆ ที่ต้องการเปลี่ยนวิธีทำงานมาเป็นแบบ 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 นี่คือหนังสือที่เหมาะสำหรับท่าน
  • หนังสือเล่มนี้ไม่ใช่หนังสือสอนวิชาคอมพิวเตอร์ระดับเบื้องต้นที่สุด หากท่านยังไม่เคยเขียนโปรแกรมมาก่อนเลย ท่านควรอ่าน หรือเรียกการเขียนโปรแกรมเบื้องต้นมาก่อนสักเล็กน้อย
  • หนังสือเล่มนี้ไม่ใช่หนังสือสอนภาษา C# ระดับก้าวหน้าที่สุด หากท่านเป็นนักเขียนโค้ดระดับก้าวหน้าที่สุด ท่านอาจพบว่าหนังสือเล่มนี้ไม่มีเนื้อหาที่ให้ความรู้เพิ่มเติมแก่ท่านได้
  • ภาษา C# ที่สอนในหนังสือเล่มนี้คือ C#2.0 และจะมีอธิบายส่วนที่เพิ่มเติมใน C#3.0 ด้วย

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


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

การเขียนโปรแกรมภาษา 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 เพื่อนำมาทดลองคอมไพล์ในเครื่องของท่านๆ สามารถดาวน์โหลดได้จากหน้า www.thailand2siam.com/download โดยท่านอาจเลือก download เพียงบางส่วน คลาส บางหน้าเว็บ หรือจะดาวน์โหลดทีเดียวทั้งหมดก็ได้ (user name และ password คือ reader)


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

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


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

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


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

บทที่ 1 การเขียนโปรแกรมแบบ OOP: อธิบายหลักการ และความเป็นมาของหลักการ OOP อธิบายหลักการพื้นฐานที่สุดของ OOP คือ Encapsulation, Inheritance และ Polymorphism โดยสังเขป แนะนำให้รู้จักกับแนวคิดและคำศัพท์ เพื่อเตรียมให้ผู้อ่านพร้อมสำหรับเนื้อหาในบทต่อๆ ไป แนะนำ .NET Framework อย่างกว้างๆ ในระดับพื้นฐาน

บทที่ 2 .NET Framework และคลาสไลบรารี: แนะนำใช้รู้จักกับคลาสไลบรารีของ .NET Framework หน้าที่และการทำงานของ CLR การประมวลผลแบบกระจาย ลักษณะของ managed code องค์ประกอบของ CLR แนวคิดและคำศัพท์ของ .NET Framework การจัดสรรหน่วยความจำ การทำงานของ stack และ heap หลักการทำงานของ Garbage collector การแบ่งหมวดหมู่ของ namespace และวิธีเขียนโปรแกรมเพื่อเรียกใช้คลาสต่างๆ ใน .NET Framework

บทที่ 3 ภาษา C# ระดับพื้นฐาน: อธิบายโครงสร้างภาษา C# วิธีสร้างและใช้งาน namespace อธิบายการใช้ type ทั้งแบบ value type และ Reference type การทำ boxing และ unboxing อธิบายวิธีสร้างคลาส สร้าง struct วิธีตั้งชื่อให้กับสิ่งต่างๆ ในโปรแกรม นิพจน์ และการประกาศ

บทที่ 4 ภาษา C# ระดับปานกลาง: อธิบายสิ่งที่จำเป็นต้องรู้ในการเขียนโปรแกรมภาษา C# เช่น Statement, สมาชิกของคลาสและ struct Access modifier, Type modifier, Assembly, Field, properties, Method, constructor, destructor, method, Parameter, method Signature และ method overloading

บทที่ 5 ภาษา C# ระดับก้าวหน้า: ลักษณะพิเศษต่างๆ ของภาษา C# เช่นสิ่งที่เกี่ยวเนื่องกับการทำ Inheritance อันได้แก่ Versioning, Abstract, Interface คุณสมบัติก้าวหน้าของภาษา C# 2.0 เช่น IEnumerator, Indexer, Iterator, yield, Regex (Regular Expression), Generic, Operator overloading, Delegate, Pointer และ Unsafe Code คุณสมบัติก้าวหน้าของภาษา C# 3.0 อาทิ Implicitly typed local variables, Lambda expressions, Object และ collection initializes, Anonymous types, Implicitly typed arrays, Query expressions และExpression trees

บทที่ 6 การเขียนโปรแกรมบนเว็บด้วยภาษา C#: อธิบายความเป็นมาของการเขียนโปรแกรมในเว็บ ที่เรียกว่า web application ส่วนประกอบของ ASP.NET ตัว Framework และ control ต่างๆ โครงสร้างของเว็บไซต์แบบ ASP.NET ไฟล์ชนิดต่างๆ ขั้นตอนการทำงานของหน้าเว็บแบบ ASP.NET หลักการ post back และ round trips, server control และ event สถาปัตยกรรมของ ASP.NET, web user control และการใช้งานร่วมกับ CSS แนะนำโครงสร้างและการทำงานของเว็บไซต์ http://www.thailand2siam.com/ โดยย่อ

บทที่ 7 คลาสที่เป็นรากฐานของทั้งเว็บไซต์: สาทิตวิธีแก้ปัญหาเรื่อง design consistency โดยใช้ประยุกต์ใช้หลักการ OOP

บทที่ 8 คลาสสร้างส่วนประกอบมาตรฐานของเว็บไซต์: อธิบายวิธีสร้างเว็บไซต์ที่ผู้นำโค้ดไปใช้สามารถ customize เว็บไซต์ได้โดยสะดวกและรวดเร็ว

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

บทที่ 10 การสร้างหน้าเว็บ: สาทิตการนำหลักการ inheritance มาใช้ในการสร้างหน้าเว็บ

บทที่ 11 คลาสจัดการฐานข้อมูลสินค้า: สาทิตการประยุกต์ใช้หลักการ abstract, information hiding และ encapsulation เพื่อสร้าง object ฐานข้อมูล

บทที่ 12 คลาสแสดงรายการสินค้า: สาทิตการสร้าง object ที่ห้อหุ้มข้อมูลจากฐานข้อมูล และวิธีนำ object ไปใช้ในหน้าเว็บ

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

บทที่ 14 การประยุกต์ใช้งาน delegate และ event กับเครื่องแปลงค่าเงิน: สาทิตวิธีประยุกต์ใช้งาน delegate ซึ่งเป็น function pointer แบบ OOP

บทที่ 15 การประยุกต์ใช้ Constructor, Destructor และสมาชิกอื่นๆ ของคลาส: สาทิตวิธีประยุกต์ใช้ความรู้เกี่ยวกับ Garbage collector และ enum การทำงานกับ Web Server Control

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

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

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

บทที่ 19 หน้าเว็บเพื่อการแก้ไข เพิ่ม และลบข้อมูลสินค้า: แสดงวิธีสร้าง Web User Control เพื่ออำนวยความสะดวกในการแก้ไขข้อมูลสินค้า

บทที่ 20 คลาสเพิ่มและเปลี่ยนภาพสินค้า: สาทิตวิธีประยุกต์ใช้ GDI+ เพื่อจัดการภาพสินค้า วิธี upload file สู่ server วิธีแปลง format ภาพ วิธีย่อ-ขยายภาพ

บทที่ 21 นำทุกอย่างมารวมกันและเปิดใช้งานเว็บไซต์: สอนเทคนิคการทำ ASP.NET web application deployment

04 February 2007

อารัมภกถา

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

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

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


กิตติกรรมประกาศ

ขอขอบคุณ Ole-Johan Dahl และ Kristen Nygaard ผู้สร้างภาษา Simula 67 ซึ่งเป็นภาษาแรกที่ใช้หลักการ OOP ขอขอบคุณ Bjame Stroustrup ผู้สร้างภาษา C++ ซึ่งเป็นภาษาที่ทำให้หลักการ OOP ได้รับความนิยมแพร่หลาย ขอขอบคุณ Anders Hejlsberg ผู้ประดิษฐ์ภาษา C# และบริษัทไมโครซอฟท์ผู้ผลิต .NET Framework และ ASP.NET และขอขอบคุณบุคลากรในวงการคอมพิวเตอร์อีกจำนวนมากเกินกว่าจะกล่าวถึงได้ครบถ้วน ซึ่งเป็นผู้เขียนตำรา และบทความในอินเตอร์เน็ตที่ผู้เขียนใช้ค้นคว้าอ้างอิง และขอขอบคุณ อลิส อิสหาก และคุณบุษบา ที่เข้าใจและอดทนเมื่อผู้เขียน (นั่ง) ทำงานจนดึกทุกคืน

ลาภลอย วานิชอังกูร

คำศัพท์ในบทนี้