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

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

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

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

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

 

 

 

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

 

เมื่อถึง ค.ศ. 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 ที่ดีวิธีหนึ่ง

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

 

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

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

 

Object Oriented Programming

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

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

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

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

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

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

ภาพ 109: ไอวาร์ จาคอบสัน ผู้นำเสนอหลักการ OOSE

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

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

ภาพ 110: ดิจิตอลไอซีแบบโลจิกเกต

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

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

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

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

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

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

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

 

ตอนต่อไป:ความหมายของ object

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • tone  On มกราคม 26, 2009 at 11:24 am

    <b>OO เป็นแนวคิดในเชิงวัตถุ เมือนำ OO มาเป็นแนวทางในการสร้าง Software ก็เกิดเป็นศาสตร์ทางด้านการสร้าง Software ซึ่งสามารถใช้ศึกษาและปฏิบัติได้และเป็นไปในทิศทางเดียวกัน เช่น OOAD OOP</b>

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: