Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเรียนรู้ความหลากหลายใน Ruby on Rails:คู่มือปฏิบัติ

หากคุณเคยใช้เวลาสร้างโปรแกรมเชิงวัตถุ (OOP) คุณคงเคยใช้ความหลากหลายในแอปพลิเคชันของคุณ หรืออย่างน้อยที่สุดก็เคยได้ยินคำนี้

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

บทความนี้จะช่วยให้คุณเข้าใจถึงความหลากหลายมากขึ้น โดยเฉพาะใน Ruby on Rails เพื่อให้บรรลุเป้าหมายนี้ เราจะเจาะลึกไปที่:

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

เริ่มกันเลย!

ความหลากหลายในโลกแห่งความเป็นจริง

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

ในโลกแห่งความเป็นจริง ตัวอย่างพื้นฐานของคำจำกัดความนี้อาจเป็นผู้หญิงที่เป็นเจ้าหน้าที่ตำรวจ น้องสาว ลูกของใครบางคน แม่ของใครบางคน ฯลฯ แต่ละบทบาทจะกำหนดพฤติกรรมของเธอและมีส่วนช่วยในตัวตนที่เธอเป็น

ความหลากหลายและพันธุศาสตร์

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

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

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

โมโนมอร์ฟิซึ่มกับความหลากหลาย

ถ้าเราหันความสนใจไปที่ monomorphism เราก็สามารถเข้าใจ polymorphism ได้มากขึ้น ยึดติดกับชีววิทยา monomorphism สามารถกำหนดได้ว่าเป็น 'สายพันธุ์ที่มีเพียงรูปแบบเดียว' ที่รักษารูปแบบเดียวกันนั้นในระหว่างขั้นตอนต่างๆ ของการพัฒนา

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

สัญญาณพฤติกรรมมักเป็นวิธีที่ง่ายที่สุดในการแยกแยะระหว่างเพศในสายพันธุ์โมโนมอร์ฟิก

เรามาให้ความสนใจกับความหลากหลายในการเขียนโปรแกรมกันโดยเฉพาะ

ความหลากหลายใน OOP

หากเราพิจารณาคำจำกัดความเริ่มต้นของความหลากหลาย - ความสามารถของวัตถุในการแสดงมากกว่าหนึ่งรูปแบบ — เราสามารถเชื่อมโยงมันกับ OOP ได้อย่างราบรื่น

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

มาดูสองตัวอย่างว่าความหลากหลายสามารถนำไปใช้ในภาษา OOP เช่น Ruby ได้อย่างไร:ผ่านการสืบทอดและการพิมพ์แบบเป็ด

ความหลากหลายและการสืบทอดใน Ruby

การสืบทอดคือการที่คลาสลูกสืบทอดคุณสมบัติของคลาสพาเรนต์

ด้านล่างนี้เป็นตัวอย่างของวิธีที่เราสามารถนำความหลากหลายไปใช้กับการสืบทอด:

 

โค้ดด้านบนมีคลาสลูกสองคลาส — 08 และ 11 — สืบทอดมาจากคลาสพาเรนต์ 27 . ตัวอย่างนี้เป็นแบบ polymorphic เนื่องจากเรากำลังเรียกเมธอด:30 — และมันออกมาหลายรูปแบบ:48 , 58 และ 63 .

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

การพิมพ์แบบเป็ดและความหลากหลายใน Ruby

ตัวอย่างที่เป็นประโยชน์มากขึ้นของความหลากหลายใน OOP คือการพิมพ์แบบเป็ด ดังที่อ้างอิงด้านล่าง

 

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

ขอย้ำอีกครั้งว่าการพิมพ์แบบเป็ดนั้นมีหลากหลายรูปแบบเมื่อเราเรียกเมธอด — 81 — และสร้างเอาต์พุตที่มีหลายรูปแบบ:90 , 103 , 112 และ 127 . แน่นอนว่าการพิมพ์แบบเป็ดและความหลากหลายไม่จำเป็นในการสร้างผลลัพธ์นี้ อย่างไรก็ตาม การใช้โค้ดที่สะอาดและสมเหตุสมผลนั้นมีประโยชน์มาก

ความหลากหลายใน Ruby on Rails

Polymorphism ทำงานได้ดีใน Ruby on Rails ในฐานะการเชื่อมโยง Active Record หากโมเดลทำสิ่งเดียวกันโดยพื้นฐานแล้ว เราก็สามารถเปลี่ยนให้เป็นโมเดลเดียวเพื่อสร้างความสัมพันธ์แบบหลายมอร์ฟิกได้

โดยยึดตามธีมเครื่องดนตรี ลองพิจารณาแอปพลิเคชันที่ผู้ใช้สามารถโพสต์ แสดงความคิดเห็น และวิจารณ์ตราสารได้ ตรวจสอบแผนภาพความสัมพันธ์เอนทิตี (ERD) ด้านล่าง:

การเรียนรู้ความหลากหลายใน Ruby on Rails:คู่มือปฏิบัติ

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

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

จะเป็นอย่างไรหากเราต้องการเพิ่มการเชื่อมโยงอื่น ๆ ให้กับแอปพลิเคชันของเรา? เราจะต้องเพิ่มและทำซ้ำการเชื่อมโยงที่ซ้ำกัน

ตัวอย่างเช่น หากเราต้องการเพิ่ม 131 เพื่อประเมินความน่าเชื่อถือของผู้ใช้ เราจะต้องสร้างตารางแยกต่างหากพร้อมการเชื่อมโยงของตนเอง นี่จะหมายถึงการเพิ่มความสัมพันธ์ใหม่ระหว่าง 146 และ 157 โมเดล ERD จะมีลักษณะดังนี้:

การเรียนรู้ความหลากหลายใน Ruby on Rails:คู่มือปฏิบัติ

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

มาดู ERD ที่มีโมเดลการให้คะแนนเป็น polymorphic:

การเรียนรู้ความหลากหลายใน Ruby on Rails:คู่มือปฏิบัติ

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

192 และ 206 ตอนนี้รับบทบาทเดียวกันกับโมเดลการให้คะแนนที่แยกจากกันโดยแสดงให้เห็นว่าโมเดลใดที่เกี่ยวข้องกับการรีวิว

216 คอลัมน์เก็บชื่อคลาสโมเดล (228 , 230 หรือ 249 ) และ 255 เก็บ ID ที่เกี่ยวข้องของรุ่นนั้น

ตอนนี้เราสามารถใช้ทั้งสองคอลัมน์นี้เพื่อเชื่อมโยงจำนวนเต็มการให้คะแนนกับผู้ใช้ โพสต์ หรือความคิดเห็นที่เฉพาะเจาะจงผ่านการสอบถาม Active Record และ/หรือคำสั่งแบบมีเงื่อนไข คีย์ต่างประเทศ 268 ยังคงอยู่ในรูปแบบการตรวจสอบ เนื่องจากจะทำให้เราสามารถติดตามผู้ใช้ที่แสดงความคิดเห็นได้

ตอนนี้ คำว่า '-able' ในโมเดลโพลีมอร์ฟิกของเราอาจดูแปลก แต่จุดประสงค์ของมันจะชัดเจนในไม่ช้าเมื่อเราใช้เวทมนตร์ Rails

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

การนำความหลากหลายไปใช้ใน Ruby on Rails

ถึงเวลาที่จะใช้ความหลากหลายในแอปพลิเคชัน Rails! หากเรากระทำเสมือนว่าเราได้สร้าง 271 ของเราแล้ว , 285 และ 299 โมเดลต่างๆ เราสามารถเริ่มต้นผสมผสานโมเดลโพลีมอร์ฟิกของเราได้:308 .

ขั้นแรก สร้างตารางและสร้างโมเดลจากเทอร์มินัล ดังนี้:

 

สิ่งนี้จะสร้างไฟล์การโยกย้าย:

 

316 การอัปเดตไฟล์หลังจากดำเนินการย้ายข้อมูล ตัวเลือก polymorphic แปลง 322 ลงใน 334 และ 344 คอลัมน์:

 
 

จำได้ไหมเมื่อเราพูดถึงคำว่า '-able' ข้างต้น? เป็นแบบแผนการตั้งชื่อ Rails สำหรับการกำหนดความสัมพันธ์แบบ polymorphic ของเรา ทำให้เราสามารถสร้างผู้ใช้ โพสต์เครื่องมือ และความคิดเห็น 'ตรวจสอบได้'

เพื่อให้เวทย์มนตร์ Rails นี้ทำงานได้ เราต้องแน่ใจว่าโมเดลอื่นๆ ของเราเชื่อมโยงอย่างถูกต้องกับโมเดลโพลีมอร์ฟิกของเรา

 
 
 

353 , 364 และ 371 ขณะนี้สามารถตรวจสอบและให้คะแนนโมเดลได้

หากเราสร้างผู้ใช้ ความคิดเห็น และโพสต์เครื่องมืออย่างน้อยสองคนแล้ว เราก็จะสามารถสร้างและเข้าถึงบทวิจารณ์ได้หลายวิธีด้วย Active Record Queries เช่น:

 
 
 
 

มีหลายวิธีในการโต้ตอบกับ 380 ขึ้นอยู่กับข้อมูลที่คุณต้องการแสดงผล สิ่งสำคัญคือต้องแบ่งปันว่าโมเดลหลักสามารถสร้างบทวิจารณ์ได้อย่างไร ตราบใดที่บทวิจารณ์เชื่อมโยงกับผู้ใช้และโมเดลที่ตรวจสอบได้ Active Record จะเชื่อมโยง 391 โดยอัตโนมัติ และ 407 กับโมเดลที่เกี่ยวข้อง

หากไม่มีความหลากหลายในตัวอย่าง Rails ของเรา ก็จะมีตารางอีกมากมาย คอลัมน์ที่ซ้ำกันโดยไม่จำเป็น 410 และ 420 การเชื่อมโยงในแบบจำลองของเรา ความหลากหลายได้ลดความจำเป็นในการเข้าร่วมตาราง ทำให้สามารถสืบค้นและเชื่อมโยง Active Record ได้ง่ายและรวดเร็วยิ่งขึ้น

สรุป:ใช้ Polymorphism สำหรับโค้ด Ruby ที่สะอาดและเป็นตรรกะ

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

เราพิจารณาวิธีการนำความหลากหลายไปใช้ใน Ruby ผ่านการสืบทอดและการพิมพ์แบบเป็ด ก่อนที่จะเจาะลึกถึงการใช้ความหลากหลายใน Ruby on Rails โดยเฉพาะ

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

ขอให้สนุกกับการเขียนโค้ด!

ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว!