คำตอบที่ยาวและช้าของฉันยังไม่สมบูรณ์ แต่เป็นคำอธิบายที่ดีว่าทำไมฉันถึงเกลียดรูปแบบนี้ความคิดเห็นและแม้แต่อารมณ์บางอย่าง:
1) เวอร์ชันสั้น: Active Record สร้าง " ชั้นบาง ๆ " ของ "การผูกที่แน่นหนา " ระหว่างฐานข้อมูลและรหัสแอปพลิเคชัน ซึ่งแก้ปัญหาได้อย่างไม่มีเหตุผลไม่มีปัญหาใด ๆ ไม่มีปัญหาเลย IMHO ไม่ได้ให้ค่าใด ๆ ยกเว้นน้ำตาลทางไวยากรณ์สำหรับโปรแกรมเมอร์ (ซึ่งอาจใช้ "ไวยากรณ์ของวัตถุ" เพื่อเข้าถึงข้อมูลบางส่วนซึ่งมีอยู่ในฐานข้อมูลเชิงสัมพันธ์) ความพยายามในการสร้างความสะดวกสบายให้กับโปรแกรมเมอร์ควร (IMHO ... ) ควรลงทุนในเครื่องมือการเข้าถึงฐานข้อมูลระดับต่ำเช่นวิธีการที่เรียบง่ายเรียบง่ายhash_map get_record( string id_value, string table_name, string id_column_name="id" )
และคล้ายคลึงกัน (แน่นอนว่าแนวคิดและความสง่างามแตกต่างกันอย่างมากกับ ภาษาที่ใช้)
2) เวอร์ชันยาว: ในโครงการที่ขับเคลื่อนด้วยฐานข้อมูลใด ๆ ที่ฉันมี "การควบคุมแนวความคิด" ของสิ่งต่างๆฉันหลีกเลี่ยง AR และเป็นเรื่องดี ฉันมักจะสร้างสถาปัตยกรรมแบบเลเยอร์ (ไม่ช้าก็เร็วคุณจะแบ่งซอฟต์แวร์ของคุณเป็นเลเยอร์อย่างน้อยก็ในโครงการขนาดกลางถึงขนาดใหญ่):
A1) ฐานข้อมูลเองตารางความสัมพันธ์แม้กระทั่งตรรกะบางอย่างหาก DBMS อนุญาต (MySQL ก็โตแล้วด้วย)
A2) บ่อยครั้งที่มีมากกว่าที่เก็บข้อมูล: ระบบไฟล์ (blobs ในฐานข้อมูลไม่ใช่การตัดสินใจที่ดีเสมอไป ... ), ระบบเดิม (ลองนึกภาพตัวเองว่า "จะเข้าถึง" ได้อย่างไรมีหลายประเภทที่เป็นไปได้ .. แต่นั่นคือ ไม่ใช่ประเด็น ... )
B) ชั้นการเข้าถึงฐานข้อมูล (ในระดับนี้วิธีการของเครื่องมือผู้ช่วยในการเข้าถึงข้อมูลในฐานข้อมูลนั้นเป็นที่น่ายินดีเป็นอย่างยิ่ง แต่ AR ไม่ได้ให้ค่าใด ๆ ที่นี่ยกเว้นน้ำตาลที่มีปฏิกิริยาบางอย่าง)
c) ชั้นวัตถุแอปพลิเคชัน: "วัตถุแอปพลิเคชัน" บางครั้งก็เป็นแถวธรรมดาของตารางในฐานข้อมูล แต่ส่วนใหญ่มักเป็นวัตถุผสมและมีตรรกะที่สูงกว่าดังนั้นการลงทุนเวลาในวัตถุ AR ในระดับนี้จึงไร้ประโยชน์โดยสิ้นเชิง เสียเวลาของผู้เขียนโค้ดอันมีค่าเนื่องจาก "มูลค่าที่แท้จริง" "ตรรกะที่สูงขึ้น" ของวัตถุเหล่านั้นจำเป็นต้องนำมาใช้กับวัตถุ AR อยู่แล้ว - มีและไม่มี AR! และตัวอย่างเช่นเหตุใดคุณจึงต้องการมีนามธรรมของ "วัตถุรายการบันทึก" รหัสลอจิกของแอปเขียนไว้ แต่ควรมีความสามารถในการอัปเดตหรือลบได้หรือไม่ ฟังดูงี่เง่าและApp::Log("I am a log message")
ใช้งานง่ายกว่าขนาดle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. และตัวอย่างเช่น: การใช้ "วัตถุรายการบันทึก" ในมุมมองบันทึกในแอปพลิเคชันของคุณจะใช้ได้กับ 100, 1,000 หรือแม้แต่ 10,000 บรรทัดบันทึก แต่ไม่ช้าก็เร็วคุณจะต้องปรับให้เหมาะสม - และฉันเดิมพันในกรณีส่วนใหญ่คุณจะ ใช้คำสั่ง SQL SELECT ที่สวยงามขนาดเล็กในตรรกะของแอปของคุณ (ซึ่งทำลายแนวคิด AR โดยสิ้นเชิง .. ) แทนที่จะรวมคำสั่งเล็ก ๆ นั้นไว้ในกรอบความคิด AR แบบคงที่ที่มีการตัดโค้ดจำนวนมากและซ่อนไว้ เวลาที่คุณเสียไปกับการเขียนและ / หรือสร้างโค้ด AR อาจได้รับการลงทุนในอินเทอร์เฟซที่ชาญฉลาดมากขึ้นสำหรับการอ่านรายการบันทึก (หลายวิธีหลายวิธีท้องฟ้ามีขีด จำกัด ) Coders ควรกล้าที่จะคิดค้นนามธรรมใหม่ ๆเพื่อให้ตระหนักถึงตรรกะของแอปพลิเคชันที่เหมาะสมกับแอปพลิเคชันที่ต้องการและไม่นำรูปแบบโง่ ๆ มาใช้ซ้ำฟังดูดีตั้งแต่แรกเห็น!
ง) ตรรกะของแอปพลิเคชัน - ใช้ตรรกะของการโต้ตอบวัตถุและการสร้างการลบและการแสดงรายการ (!) ของวัตถุลอจิกของแอปพลิเคชัน (ไม่งานเหล่านั้นไม่ควรยึดติดกับวัตถุตรรกะของแอปพลิเคชันเอง: แผ่นกระดาษบนโต๊ะของคุณบอกหรือไม่ คุณชื่อและที่ตั้งของแผ่นงานอื่น ๆ ทั้งหมดในสำนักงานของคุณหรือไม่ลืมวิธีการ "คงที่" ในการแสดงรายการวัตถุนั่นเป็นเรื่องที่โง่เขลาการประนีประนอมที่ไม่ดีที่สร้างขึ้นเพื่อให้วิธีคิดของมนุษย์เข้ากันได้กับ -] การคิด AR)
จ) อินเทอร์เฟซผู้ใช้ - สิ่งที่ฉันจะเขียนในบรรทัดต่อไปนี้เป็นเรื่องที่เป็นส่วนตัวมาก แต่จากประสบการณ์ของฉันโครงการที่สร้างบน AR มักละเลยส่วน UI ของแอปพลิเคชัน - เสียเวลาไปกับการสร้างนามธรรมที่คลุมเครือ . ในท้ายที่สุดแอปพลิเคชันดังกล่าวเสียเวลากับผู้เขียนโค้ดเป็นจำนวนมากและรู้สึกเหมือนเป็นแอปพลิเคชันจาก coders สำหรับ coders ซึ่งมีความโน้มเอียงด้านเทคโนโลยีทั้งภายในและภายนอก คนเขียนโค้ดรู้สึกดี (ในที่สุดก็ทำงานหนักทุกอย่างเสร็จและถูกต้องตามคอนเซ็ปต์บนกระดาษ ... ) และลูกค้า "ต้องเรียนรู้ว่ามันต้องเป็นแบบนั้น" เพราะนั่นคือ "มืออาชีพ" .. โอเคขอโทษฉันพูดนอกเรื่อง ;-)
เป็นที่ยอมรับว่าทั้งหมดนี้เป็นเรื่องส่วนตัว แต่เป็นประสบการณ์ของฉัน (ยกเว้น Ruby on Rails อาจแตกต่างออกไปและฉันไม่มีประสบการณ์ในทางปฏิบัติกับแนวทางนั้น)
ในโครงการที่ต้องเสียเงินฉันมักได้ยินความต้องการที่จะเริ่มต้นด้วยการสร้างออบเจ็กต์ "บันทึกที่ใช้งานอยู่" บางอย่างเพื่อเป็นส่วนประกอบสำหรับตรรกะของแอปพลิเคชันระดับที่สูงขึ้น จากประสบการณ์ของฉันสิ่งนี้มักจะเห็นได้ชัดเป็นข้ออ้างบางประการสำหรับลูกค้า (บริษัท พัฒนาซอฟต์แวร์ในกรณีส่วนใหญ่) ไม่มีแนวคิดที่ดีมุมมองที่กว้างขวางภาพรวมของผลิตภัณฑ์ในที่สุด ลูกค้าเหล่านั้นคิดในกรอบที่เข้มงวด ("ในโครงการเมื่อสิบปีที่แล้วมันใช้งานได้ดี .. ") พวกเขาอาจแยกเอนทิตีออกพวกเขาอาจกำหนดความสัมพันธ์ของเอนทิตีพวกเขาอาจทำลายความสัมพันธ์ของข้อมูลและกำหนดตรรกะพื้นฐานของแอปพลิเคชัน แต่แล้วพวกเขาก็หยุด และส่งมอบให้คุณและคิดว่านั่นคือทั้งหมดที่คุณต้องการ ... พวกเขามักจะขาดแนวคิดที่สมบูรณ์เกี่ยวกับตรรกะของแอปพลิเคชันส่วนต่อประสานผู้ใช้ความสามารถในการใช้งานและอื่น ๆ ... พวกเขาขาดมุมมองที่กว้างขวางและพวกเขาขาดความรักต่อ รายละเอียดและพวกเขาต้องการให้คุณทำตามวิธี AR นั้นเพราะ .. ทำไมมันถึงได้ผลในโปรเจ็กต์นั้นเมื่อหลายปีก่อนมันทำให้ผู้คนไม่ว่างและเงียบ? ฉันไม่รู้ แต่ "รายละเอียด" แยกผู้ชายออกจากเด็กผู้ชายหรือ .. สโลแกนโฆษณาเดิมเป็นอย่างไร? ;-)
หลังจากผ่านไปหลายปี (ประสบการณ์การพัฒนาที่ใช้งานอยู่เป็นเวลา 10 ปี) เมื่อใดก็ตามที่ลูกค้าพูดถึง "รูปแบบการบันทึกที่ใช้งานอยู่" เสียงกระดิ่งของฉันจะดังขึ้น ฉันเรียนรู้ที่จะพยายามทำให้พวกเขากลับไปสู่ช่วงความคิดที่สำคัญปล่อยให้พวกเขาคิดทบทวนลองแสดงจุดอ่อนของแนวคิดหรือเพียงแค่หลีกเลี่ยงพวกเขาเลยหากพวกเขาไม่เข้าใจ (ในที่สุดคุณก็รู้ว่าลูกค้าที่ยังไม่รู้จัก รู้ว่ามันต้องการอะไรบางทีอาจจะคิดว่ามันรู้ แต่ไม่ได้หรือพยายามที่จะทำให้แนวคิดภายนอกทำงานให้ฉันได้ฟรีทำให้ฉันเสียเวลาอันมีค่าวันสัปดาห์และเดือนที่มีค่ามากมายการมีชีวิตอยู่นั้นสั้นเกินไป ... )
สุดท้าย: ทั้งหมดนี้คือสาเหตุที่ฉันเกลียด "รูปแบบการบันทึกที่ใช้งานอยู่" โง่ ๆ และฉันก็ทำและจะหลีกเลี่ยงทุกครั้งที่ทำได้
แก้ไข : ฉันจะเรียกสิ่งนี้ว่า No-Pattern ไม่สามารถแก้ปัญหาใด ๆ ได้ (รูปแบบไม่ได้มีไว้เพื่อสร้างน้ำตาลที่เป็นประโยค) มันสร้างปัญหามากมาย: ต้นตอของปัญหาทั้งหมด (กล่าวไว้ในคำตอบมากมายที่นี่ .. ) คือมันซ่อน SQL เก่าที่พัฒนามาอย่างดีและทรงพลังไว้เบื้องหลังอินเทอร์เฟซที่กำหนดรูปแบบได้ จำกัด มาก
รูปแบบนี้แทนที่ความยืดหยุ่นด้วยน้ำตาลซินแทติก!
ลองคิดดูว่า AR แก้ปัญหาอะไรให้คุณได้บ้าง?