Laploy Web Board
Would you like to react to this message? Create an account in a few clicks or log in to continue.

OOP ดียังไงครับ

2 posters

Go down

OOP ดียังไงครับ Empty OOP ดียังไงครับ

ตั้งหัวข้อ  Max++ 24th January 2010, 3:50 pm

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

ผมได้ยินใครๆเค้าว่า MFC เป็น OOP ผมเองก็คิดอย่างนั้นแต่เชื่อมั๊ยครับผมไม่เคยใช้หลักการอะไรลึกๆของ OOP อย่างเช่น การ inherit เลย
เป็นแต่สร้างออบเจ็คแล้วเรียกใช้ฟังก์ชันในคลาสที่ต้องการเท่านั้น หรือฟังก์ชันอะไรที่ใช้บ่อยและผมต้องเขียนขึ้นมาเองผมก็เอาไปประกาศไว้เป็นตัวแปรหรือฟังก์ชัน Global ซึ่งสามารถทำให้ทุกคลาสมองเห็นและเรียกใช้งานได้
เหมือนอย่างคลาส GlobalVar ในหนังสือของอาจารย์นั่นแหละครับ
ซึ่งผมเองก็คิดว่าวิธีนี้ง่ายดีและก็ยึดมาเป็นแบบแผนในการเขียนโปรแกรมโดยตลอดทั้งๆที่ผมรู้ว่ามัน"ผิดหลัก"ในการเขียนโปรแกรม
แต่ทำไงได้ล่ะครับก็ไม่รู้จริงๆ ไม่ได้จบสายคอมฯมาอีกต่างหาก(ผมจบอิเล็กฯ)

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

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

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

พล่ามมาเยอะแล้ว พอแค่นี้ก่อนแล้วกันนะครับ
สรุปคำถามผมคือทำไมเราต้องเขียนโปรแกรมด้วยหลัก OOP ครับ

Max++

จำนวนข้อความ : 4
Join date : 24/01/2010

ขึ้นไปข้างบน Go down

OOP ดียังไงครับ Empty การนำโค้ดกลับมาใช้ใหม่

ตั้งหัวข้อ  Admin 25th January 2010, 12:32 am

สวัสดีครับ ขอบคุณที่ติดตามผลงานนะครับ เข้าเรื่องเลยก็แล้วกัน

คำถามคือ OOP มีประโยชน์อย่างไร คำตอบคือมีประโยชน์หลายอย่าง แต่จุดสำคัญที่เป็นหัวใจของ OOP คือ reusable หรือการนำโค้ดกลับมาใช้ใหม่

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

ยกตัวอย่างเช่น

สมมุติว่าคุณเขียน sub ชื่อ abc ทำหน้าที่ย่อขนาดไฟล์ และปรากฏว่า sub นี้มีประโยชน์ดีมาก คือเหมาะจะนำไปใช้บ่อยๆ ในตำแหน่งต่างๆ ของโครงงานหลายโครงงานที่คุณกำลังพัฒนา สมมุติว่าคุณกำลังพัฒนาสามโครงงานคือ x, y และ z และคุณเขียน abc ไว้ใน x เมื่อต้องการนำไปใช้ใน y และ z คุณจึงใช้วิธีก็อปปีโค้ด abc จาก x ไปแปะไว้ใน y และ z

ปัญหาจะเกิดขึ้นเมื่อเวลาผ่านไป (เช่นหนึ่งปี) และคุณพบว่าโค้ดส่วน abc ไม่ดี หรือทำงานช้าเกินไป จึงปรับปรุงใหม่เป้นเวอร์ชันสองที่มีประสิทธิภาพดีกว่าเดิม แต่เนื่องจากคุณเขียน abc ไว้ใน x เมื่อแก้ไขแล้ว x จะทำงานดีขึ้น แต่ z กับ y จะแย่ยังอยู่เหมือนเดิมเพราะเป็นโค้ดเก่า คุณจึงต้องก็อปปีโค้ด abc จาก x ไปแปะไว้ใน y และ z ใหม่เสียอีกรอบหนึ่ง

ถ้าไม่ได้ปรับปรุงอะไรกันบ่อยนัก การก็อปปีและแปะก็พอทำไหวอยู่ แต่ความชุลมุนจะเกิดขึ้นทันทีหากคุณแก้ หร้อปรับปรุง abc หลายๆ หน และจะยิ่งยุ่งขี้นไปอีกหากคุณไม่ได้มีแค่ abc แต่มี sub อื่นๆ อีกเยอะเช่นมี def, ghi, jkl, mno ฯลฯ และสถานะการจะยิ่งเลวร้ายหากคุณไม่ได้พัฒนาแค่ x, y, z แต่ยังมีโปรเจ็กต์อื่นๆ ในมืออีกเป็นสิบและเพิ่มใหม่หลายสิบงานทุกๆ ปี และโปรเจกต์เหล่านี้ มีโค้ดที่คุณก็อปปีและแปะไข้วกันไปมาอย่างกว้างขวาง จนยากที่จะระบุได้ว่าส่วนไหนมาจากโปรเจคไหน การชำระโค้ดโดยก็อปปีและแปะจะทำได้ยาก หรืออาจถึงกับไม่อยู่ในวิสัยที่จะทำได้

แต่ถ้าคุณใช้หลักการ OOP มาตั้งแต่ต้น เมื่อคุณปรับปรุง abc ทั้ง x, y และ z จะได้รับอานิสงค์ทั้งหมด นั่นคือปัญหาเรื่องความต่อเนื่อง เรื่องเวอร์ชัน และเรื่องการปรับปรุงโค้ดจะรับการดูแลโดยอัตโนมัติ

ที่ว่ามานี้เป็นเพียงตัวอย่างประโยชน์ของ OOP ในแง่ reusable อย่างสามัญที่สุด แต่ OOP ยังมีประโยชน์ในประเด็นอื่นๆ อีกมาก

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

OOP ดียังไงครับ Empty Re: OOP ดียังไงครับ

ตั้งหัวข้อ  Max++ 25th January 2010, 11:09 am

ขอบคุณอาจารย์มากนะครับสำหรับคำตอบ
ผมเข้าใจเกือบทุกประเด็นที่อาจารย์ได้กล่าวถึงครับ แต่ไม่เข้าใจประเด็นที่ว่าทำไมเราไม่แยกฟังก์ชันที่ใช้บ่อยออกมาเป็น Library
จากที่อาจารย์ยกตัวอย่าง
Admin พิมพ์ว่า:
ยกตัวอย่างเช่น

สมมุติว่าคุณเขียน sub ชื่อ abc ทำหน้าที่ย่อขนาดไฟล์ และปรากฏว่า sub นี้มีประโยชน์ดีมาก คือเหมาะจะนำไปใช้บ่อยๆ ในตำแหน่งต่างๆ ของโครงงานหลายโครงงานที่คุณกำลังพัฒนา สมมุติว่าคุณกำลังพัฒนาสามโครงงานคือ x, y และ z และคุณเขียน abc ไว้ใน x เมื่อต้องการนำไปใช้ใน y และ z คุณจึงใช้วิธีก็อปปีโค้ด abc จาก x ไปแปะไว้ใน y และ z

ในเมื่อ sub abc ถูกใช้งานทั้งที่โครงงาน x, y และ z และอีกหลายๆโครงงานที่จะตามมาที่หลัง ทำไมเราไม่แยก sub abc ออกมาเป็น Library หรือ Dll ตัวหนึ่ง ที่ให้ทั้ง 3 โครงงานเรียกใช้ได้ล่ะครับ ซึ่งมันจะทำให้เราแก้โค้ดครั้งเดียวโดยให้ผลกับทุกๆโครงงานและไม่ต้อง inherit จาก x ไป y และจาก y ไป z ด้วยครับ

Max++

จำนวนข้อความ : 4
Join date : 24/01/2010

ขึ้นไปข้างบน Go down

OOP ดียังไงครับ Empty ดีเอลเอลอเวจี

ตั้งหัวข้อ  Admin 25th January 2010, 11:45 am

ที่คุณตั้งข้อสังเกตุมานี้ถูกต้อง ผมเองก็ใช้วิธีนี้กันมาเป็นสิบปี แต่ในที่สุดก็ต้องถอดใจ เพราะ DLL สร้างปัญหาให้มากกว่าที่มันแก้ เป็นสถานะการที่โหดร้ายจนถูกขนานนามว่า DLL Hell (ดีเอลเอลอเวจี) ผมจะไม่อธิบายรายละเอียด แต่สรุปว่าประเด็นปัญหาหลักๆ ของ DLL คือ ปัญหาเรื่องเวอร์ชัน, Stomping, registering, share in memory module และความลำเค็ญในการแจกจ่าย

อ่านรายละเอียดได้ที่นี่ http://en.wikipedia.org/wiki/DLL_hell

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

OOP ดียังไงครับ Empty Re: OOP ดียังไงครับ

ตั้งหัวข้อ  Max++ 25th January 2010, 1:40 pm

ขอบคุณมากนะครับอาจารย์ที่ช่วยเครียร์ประเด็นต่างๆให้ผมได้เข้าใจ
อีกประเด็นนึงที่ผมยังสงสัยอยู่ครับ
คืออย่างนี้ครับ
จากที่ผมเคยเรียนให้อาจารย์ได้ทราบว่าผมเขียน WinApp ด้วย MFC มาก่อนที่จะศึกษา C# และโค้ดในโครงงานผมแทบทุกตัวบางส่วนก็ไปดาวโหลดคลาสสำเร็จรูปจำพวกทำให้ส่วน User interface สวยงาม ที่เค้าทำไว้แล้วจากเว็บที่เค้าเปิดให้ดาวโหลด เช่น Codeproject, Codeguru มาใช้ ซึ่งแต่ละตัวที่ดาวโหลดมานั้นก็จะประกอบด้วยไฟล์ 2 ไฟล์เป็นอย่างน้อยคือ .h, .cpp หากโปรเจคใดเอามาใช้เยอะหน่อยไฟล์ที่อยู่ในโครงงานนั้นก็มากตามกันไปและบ่อยครั้งที่เอาคลาสที่มีเมธอดอยู่ 20-50 เมธอดมาใช้แต่พอเรียกใช้จริงๆกลับใช้ไม่ถึง 5 เมธอด ปัญหาคือส่วนที่ไม่ได้ใช้งานมากเกินไป พอเปิดไฟล์โปรเจคขึ้นมาทีเห็นมีคลาสอยู่ในโปรเจค 10-20 คลาส(ดูเหมือนอลังการงานสร้าง)แต่เป็นคลาสที่เกี่ยวข้องจริงๆในการทำงานอยู่แค่ 3 คลาส (mainframe, Document, View) กด Rebuild Project แต่ละทีรอนานเป็นนาทีครับ
อย่างที่ผมเรียนให้อาจารย์ทราบครับว่าผมไม่เคย inherit คลาสเหล่านี้เลยเป็นแต่เพียงสร้างออบเจ็คและเรียกใช้เมธอดเท่านั้น ซึ่งหากผม inherit คลาสเหล่านี้ออกมาอีกคงเยอะกว่านี้อีกเท่าตัวเป็นแน่ครับ

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

คำถามคือ เรามีวิธีการจัดการปัญหานี้ยังไงครับ

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

Max++

จำนวนข้อความ : 4
Join date : 24/01/2010

ขึ้นไปข้างบน Go down

OOP ดียังไงครับ Empty วิธีเขียนโค้ดตามปรกติในโลก CLR

ตั้งหัวข้อ  Admin 25th January 2010, 3:04 pm

การเขียนโค้ดแบบ OOP ใน MFC จะมีกรรมวิธีแตกต่างจาก OOP ใน โลก .NET manage code การพัฒนาโปรแกรมใน MFC จะมีปัญหาอย่างที่คุณว่ามา ส่วนวิธีพัฒนาแบบ manage code จะใช้วิธีทำเบสคลาสและคลาสต่างๆ ที่ใช้ประจำให้เป็น DLL แบบ .NET Assembly แล้วเรียกใช้คลาสที่ต้องการจาก DLL โดยการอ้างถึง name space ด้วย using ไดเรคตีฟ อาจจะเรียกใช้เพื่อสร้างออพเจ็กต์โดยตรงหรือจะนำไปสืบคุณสมบัติก็ได้

โปรดทราบว่า DLL แบบ .NET Assembly ไม่เหมือน DLL แบบ WIN32 เพราะไม่มีปัญหาเรือ่ง DLL Hell เวลาที่คุณใช้คำสั่ง using system ฯลฯ ก็คือการทำงานแบบนี้ อ่านเรื่อง using ไดเรคตีฟเพิ่มได้ที่ http://msdn.microsoft.com/en-us/library/sf0df423%28VS.71%29.aspx

การเรียกใช้คลาส (หรือไทป์ต่างๆ) จาก DLL แบบ .NET Assembly ช่วยให้คุณไม่จำเป็นต้อง include ซอร์สโค้ดของเบสคลาสและคลาสต่างๆ ที่ใช้ประจำเข้าไว้ภายในโปรเจ็กต์ใหม่ การคอมไพล์จะเร็วเพราะไม่ต้องคอมไพล์ไทป์ต่างๆ ใน DLL ซ้ำอีก อ่านเรื่อง .NET Assembly เพิ่มเติมได้ที่ http://en.wikipedia.org/wiki/.NET_assembly

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

OOP ดียังไงครับ Empty Re: OOP ดียังไงครับ

ตั้งหัวข้อ  Max++ 25th January 2010, 3:38 pm

เครียร์ทุกประเด็น ขอบคุณอาจารย์มากนะครับ

Max++

จำนวนข้อความ : 4
Join date : 24/01/2010

ขึ้นไปข้างบน Go down

ขึ้นไปข้างบน


 
Permissions in this forum:
คุณไม่สามารถพิมพ์ตอบ