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

เมื่อใดที่โมเดล ActiveRecord อ้วนเกินไป?

เมื่อคุณอ่านบล็อกและหนังสือของ Rails หรือดูการบรรยายในการประชุม คุณจะได้เรียนรู้มากมายเกี่ยวกับการทำให้นางแบบของคุณดูผอมลง

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

ผอม. แต่ไม่ ด้วย ผอม.

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

  • หากโค้ดบางโค้ดทำงานจากมุมมองของโมเดล ActiveRecord ก็เข้าไปอยู่ในโมเดลได้

  • หากโค้ดบางโค้ดทำงานที่ครอบคลุมหลายตาราง/อ็อบเจ็กต์ และไม่มีเจ้าของที่ชัดเจนจริงๆ โค้ดนั้นอาจเข้าไปใน Service Object

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

  • หากคุณมีตรรกะที่ต้องเตรียมการบันทึกหรืออัปเดตหลายรุ่นพร้อมกัน ก็ควรไปที่ ActiveModel Form Object

  • หากโค้ดมีไว้เพื่อแสดงหรือจัดรูปแบบโมเดลในมุมมองเป็นส่วนใหญ่ โค้ดนั้นควรไปที่ตัวช่วย Rails หรือ Presenter

นอกเหนือจากหลักเกณฑ์เหล่านี้แล้ว คุณควรใช้กฎเดียวกันกับที่คุณใช้เพื่อจัดโครงสร้างคลาสใหม่ที่มีขนาดใหญ่เกินไป แต่โดยทั่วไปแล้ว คุณไม่ควรรู้สึกแย่กับการทิ้งบางส่วน ตรรกะในโมเดล ActiveRecord ของคุณ พวกมันมีไว้เพื่อสิ่งนี้!

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

รูบี้จะทำอย่างไร

ใน Patterns of Enterprise Application Architecture รูปแบบ Active Record จะยึดจุดกึ่งกลางระหว่าง Row Data Gateway และ Data Mapper เกตเวย์ข้อมูลแถว เป็น wrapper เชิงวัตถุที่โง่เขลารอบ ๆ แถวของตาราง เหมือนกับรุ่นที่บางที่สุดในรุ่นที่เป็นไปได้ทั้งหมด ตัวแมปข้อมูล มีความซับซ้อนมากกว่า Active Records และส่วนใหญ่จะใช้เพื่อแปลงระหว่างอ็อบเจ็กต์ที่ไม่มีอะไรเลยนอกจากตรรกะทางธุรกิจและอ็อบเจ็กต์ที่ไม่มีอะไรเลยนอกจากตรรกะการคงอยู่

ดังนั้น ในบริบทของ Ruby Active Record จึงเป็นรูปแบบเริ่มต้นที่ถูกต้องอย่างแน่นอน

ทำไมฉันถึงพูดอย่างนั้น?

Ruby ออกแบบมาเพื่อให้โปรแกรมเมอร์มีความสุข เมื่อถูกบังคับให้ต้องแลกมาระหว่างความสะอาดกับความสะดวก มักจะเลือกความสะดวกเสมอ

ฉันหมายถึง Array มีมากกว่าร้อยวิธีใน API สาธารณะ มี ตัน ของวิธีการที่เป็นเพียงนามแฝงของอีกคนหนึ่ง เนื่องจากนักพัฒนาบางคนชอบเขียน .detect ไปที่ .find .

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

คุณสามารถปรับโครงสร้างใหม่ให้มีความยืดหยุ่นมากขึ้นได้ทุกเมื่อเมื่อต้องการ แต่แล้วอีกครั้ง YAGNI