วิธีการฝึกการเขียนโปรแกรมเชิงวัตถุ? [ปิด]


13

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

ตัวอย่างเช่นใน PHP มันเป็นเรื่องสำคัญที่ระบบปฏิบัติการต้องนั่งลงและคิดว่า: "ดีแค่ฝึกให้ฉันสร้างแอปพลิเคชั่นเดียวด้วยเขตการปกครองซึ่งผู้คนสามารถเพิ่มผลิตภัณฑ์ได้" มันค่อนข้างง่ายมันเป็นเรื่องของการคิดถึงอัลกอริทึมในการลงทะเบียนผู้ใช้บางคนเข้าสู่ระบบผู้ใช้และเพื่อเพิ่มผลิตภัณฑ์ การรวมสิ่งเหล่านี้เข้ากับฟีเจอร์ PHP มันเป็นวิธีที่ดีในการฝึกฝน

ตอนนี้ในการวางแนววัตถุเรามีสิ่งเพิ่มเติมมากมาย มันไม่ได้เป็นเพียงแค่การคิดเกี่ยวกับอัลกอริทึม แต่การวิเคราะห์ความต้องการที่ลึกกว่าการเขียนกรณีการใช้งานการหาไดอะแกรมระดับคุณสมบัติและวิธีการการตั้งค่าการฉีดพึ่งพาและหลายสิ่งหลายอย่าง

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

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

เพราะเหตุใดจึงเป็นวิธีที่ดีในการฝึกวางแนววัตถุ


1
ในช่วงปีแรก ๆ ที่มหาวิทยาลัยของฉันการแนะนำที่ดีเกี่ยวกับ OOP คือหนังสือ "คิดใน Java" โดย Bruce Eckel มันเป็นการอ่านที่แนะนำทั้งสำหรับการเขียนโปรแกรมมือใหม่และสำหรับผู้ที่มาจากพื้นฐานการพัฒนาขั้นตอน - บางทีมันอาจจะช่วยคุณได้
Ivaylo Slavov

3
PHP เป็นเชิงวัตถุ คุณไม่ได้ใช้มัน php.net/manual/en/language.oop5.php
Robert Harvey

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

ทำเกมเล็ก ๆ (โดยไม่ต้องมีกราฟิก) การ์ดเกมหรือคล้ายกันตั้งแต่เริ่มต้นลองใช้คลาสซ้ำในเกมเหล่านั้น stackoverflow.com/questions/1301606/…
grizwako

คำตอบ:


20

ตอนนี้ในการวางแนววัตถุเรามีสิ่งเพิ่มเติมมากมาย

ไม่คุณไม่ ...

มันไม่ได้เป็นเพียงแค่การคิดเกี่ยวกับอัลกอริทึม แต่การวิเคราะห์ความต้องการที่ลึกกว่าการเขียนกรณีการใช้งานการหาไดอะแกรมระดับคุณสมบัติและวิธีการการตั้งค่าการฉีดพึ่งพาและหลายสิ่งหลายอย่าง

ไม่มีสิ่งใดที่จำเป็นสำหรับการฝึกเขียนโปรแกรมเชิงวัตถุ

มันค่อนข้างง่ายมันเป็นเรื่องของการคิดถึงอัลกอริทึมในการลงทะเบียนผู้ใช้บางคนเข้าสู่ระบบผู้ใช้และเพื่อเพิ่มผลิตภัณฑ์

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

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

วิธีการฝึก? เช่นเดียวกับที่คุณฝึกการเขียนโปรแกรมตามขั้นตอน: เลือกปัญหาและแก้ปัญหาโดยใช้กลุ่มของคลาส คิดออกว่าดูดอย่างไรทำซ้ำกับบทเรียนที่ได้เรียนรู้


3
+1 "หาวิธีดูดอย่างไร" นั่นคือวิธีที่ฉันเขียนโค้ด: เต็มไปด้วยความละอายและความเกลียดชังตนเอง ... ต่อสู้เพื่อเรียนรู้จากโครงการก่อนหน้าเสมอ
WernerCD

1
ฉันชอบวิธีการ แทนที่จะทำเกินความยุ่งยากและพยายามเรียนรู้ทุกสิ่งในครั้งเดียวเริ่มต้นด้วยขั้นตอนที่เล็กลงและย้ำความรู้ทั้งหมดที่คุณได้รับ
superM

6

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

คำแนะนำของฉันจะเริ่มต้นการฝึกซ้อมของคุณโดยการรักษาสองสิ่งในใจ: ทดสอบขับเคลื่อนการพัฒนาและหลักการรับผิดชอบเดียว

จากนั้นเริ่มต้นอย่างที่คุณทำกับ PHP / C: คิดหาสิ่งที่คุณต้องการและนำสิ่งเหล่านี้มาใช้ อย่างไรก็ตามโปรดจำไว้ว่าคุณต้องเริ่มต้นจากการทดสอบ (ซึ่งบังคับให้คุณกำหนดอินเทอร์เฟซที่เหมาะสมมิฉะนั้นความสามารถในการทดสอบจะเกิดขึ้นในทันที) และ TDD นั้นหมายถึงวงจรสีแดง - เขียว - refactor พูดอีกอย่างก็คือคุณมีฟังก์ชั่นนิดหน่อยและเมื่อมันทำงานคุณต้องปรับโครงสร้างเพื่อให้ได้ OO-design ที่เหมาะสมถ้าคุณไม่ได้ทำตั้งแต่แรก (ซึ่งคุณจะไม่ทำ)

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

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


1
โดยพื้นฐานแล้วคุณกำลังพูดว่า "เรียนรู้ TDD และ GOF"
Robert Harvey

3

หากคุณเพิ่งเริ่มต้นใน OOP คุณสามารถสร้างความสนุกสนานให้ตัวเองและ "ฝึกฝน" ออฟไลน์โดยดูที่ระบบโลกแห่งความจริงและพิจารณาว่าวัตถุคืออะไรและความสัมพันธ์ระหว่างพวกเขาคืออะไรและวิธีการ / อินเตอร์เฟสที่พวกเขาอาจสนับสนุนและ วิธีที่คุณจะแสดงในลำดับชั้นของคลาสและเป็นชุดของวัตถุอินสแตนซ์และความสัมพันธ์ของความเป็นเจ้าของวัตถุจะเป็นอย่างไรและอื่น ๆ (หมายเหตุ: ฉันไม่ได้พูดถึงคำว่า "อัลกอริทึม" ข้างต้นเลย) วาดไดอะแกรมจำนวนมาก (เรียนรู้ UML เล็กน้อยหรือคล้ายกัน) ก่อนที่คุณจะนึกถึงการเขียนโค้ดอะไรก็ได้

สิ่งนี้จะช่วยให้คุณพัฒนาความรู้สึกที่ดียิ่งขึ้นของความสัมพันธ์ระหว่างIS-A และ HAS-Aซึ่งอาจเป็นการจำแนกที่สำคัญที่สุดเพียงอย่างเดียวในการออกแบบ OOP ใด ๆ (และถึงแม้ว่ามันจะยังคงเป็นสิ่งที่โปรแกรมเมอร์ OOP ) ถ้าคุณเชี่ยวชาญ IS-A / HAS-A ก็มีIS-IMPLEMENTED-IN-TERMS-OF (ซึ่งฉันเคยเห็นมาแล้วว่าเป็น IS-KIND-OF-A: ^)

ทริปต่อไปที่ซุปเปอร์มาร์เก็ตอย่างจริงจังลองจินตนาการว่ามีคนให้งานเขียน OOP จำลองสถานที่ของคุณ ...


หากคุณกำลังเขียนซอฟต์แวร์เพื่อช่วยนักชีววิทยาในการติดตามเสือที่ติดแท็กด้วยวิทยุความจริงที่ว่าเสือเป็นสัตว์และมีลายไม่สำคัญและจะไม่ปรากฏในซอฟต์แวร์ แต่ถ้าคุณคิดถึงเสือในนามธรรมและในแง่ของความเป็นและมี - นั่นคือสิ่งที่คุณได้รับ
Michael Shaw

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

1

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

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


0

มาเพิ่มคำศัพท์การวิเคราะห์เชิงวัตถุและการออกแบบเชิงวัตถุตามที่Peter Coad ทำในปี 1990

ร่วมกันสร้างวินัยทางวิศวกรรมซอฟต์แวร์ OOADที่สามารถ (ทำถูกต้อง) สนับสนุนโปรแกรมเมอร์ที่จุดของการเขียนและการทดสอบรหัส การเขียนโปรแกรมเชิงวัตถุสามารถมีระดับความละเอียดที่เหมาะสมใช้ทักษะภาษาการเขียนโปรแกรมเพื่อตอบสนองวัตถุประสงค์การทำงานและข้อกำหนดการออกแบบที่ระบุในระดับโครงการ

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

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


0

"ดีแค่ฝึกให้ฉันสร้างแอปพลิเคชั่นเดียวด้วยพื้นที่การดูแลซึ่งผู้คนสามารถเพิ่มผลิตภัณฑ์ได้" มันค่อนข้างง่ายมันเป็นเรื่องของการคิดถึงอัลกอริทึมในการลงทะเบียนผู้ใช้บางคนเข้าสู่ระบบผู้ใช้และเพื่อเพิ่มผลิตภัณฑ์

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.