“ การทำให้เป็นมาตรฐาน” เชิงวัตถุ


28

ในการเขียนโปรแกรมฐานข้อมูลมีเทคนิคที่เรียกว่า "การทำให้เป็นมาตรฐาน" ที่คุณทำกับข้อมูลที่คุณต้องการจัดเก็บ

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

แก้ไข: หากต้องการขยาย / ทำให้กระจ่างการปรับสภาพฐานข้อมูลเป็นมากกว่าชุดของหลักการเพื่อลดความซ้ำซ้อน จริง ๆ แล้วมีขั้นตอนและขั้นตอนที่คุณต้องผ่านและอย่างน้อยก็มีมาตรการที่เป็นกลางที่จะบอกคุณว่าคุณอยู่ในขั้นใดการออกแบบวัตถุมีหลักการของตัวเองและมีแนวคิดเกี่ยวกับกลิ่น แต่มีวิธีทำสิ่งที่คล้ายกัน ว่าคุณอยู่ใน XX-form0,1,2 ... ฯลฯ ... และวิธีการที่จะย้ายไปยังระดับ "ปกติ" ถัดไปมากที่สุด?


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

2
@Steven A. Lowe: คุณอยู่ที่ไหนเมื่อห้าปีที่แล้วตอนที่ฉันตัดสินใจเลือกหัวข้อวิทยานิพนธ์ของฉัน ;)

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

คำถามที่น่าสนใจมากที่ฉันพบ

5
ฉันคิดว่าการ Refactoring นั้นครอบคลุมทั้ง OOP และวิธีการเขียนโปรแกรมอื่น ๆ
JohnFx

คำตอบ:


27

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

ในคำอื่น ๆ มีใครพยายามใช้เทคนิคการฟื้นฟูฐานข้อมูลกับ OOP? ไม่เพราะ OOP มีวิธีแก้ไขปัญหาที่ใช้ร่วมกันแล้วซึ่งการทำให้มาตรฐานกลับคืนสู่ฐานข้อมูลเชิงสัมพันธ์


+1 ดีกว่าสิ่งที่ฉันพยายามจะเขียน!
Michael K

นั่นเป็นหลักการไม่ใช่เทคนิค คุณจะใช้หลักการเหล่านั้นเพื่อ "ทำให้ปกติ" การออกแบบวัตถุ
Edward Strange

3
การนอร์มัลไลซ์ฐานข้อมูลก็มีหลักการเช่นกัน ในทั้งสองกรณีมีรูปแบบ (หรือเทคนิค) ที่อธิบายวิธีการตัดสินใจเกี่ยวกับหลักการเหล่านี้ ดูหนังสือของ Martin Fowler เกี่ยวกับการปรับโครงสร้างและหนังสือของ Kent Beck เกี่ยวกับรูปแบบ ความแตกต่างคือการออกแบบฐานข้อมูลเป็นโดเมนที่มีขนาดเล็กและซับซ้อนน้อยกว่าซึ่งง่ายต่อการหาปริมาณและเปลี่ยนเป็นชุดของกฎที่ง่าย
Rein Henrichs

5
@Crazy Eddie: คุณจะทำอย่างไรกับฐานข้อมูลเชิงสัมพันธ์? คุณค้นหาอินสแตนซ์ที่มีการละเมิดหลักการและแก้ไขให้ถูกต้อง ถ้าคุณเห็นคลาสที่มีสามงานคุณเขียนมันเป็นสามคลาส หากคุณกำลังมองหาคำกริยาเช่น "normalize" อาจจะเป็น "refactor" ของมันแม้ว่ามันจะไม่เจาะจงเท่าไรนัก
Jeremy

1
@Rein: การออกแบบฐานข้อมูลนั้นไม่เล็กหรือซับซ้อนน้อยกว่า OOP แต่มันมีข้อดีอย่างหนึ่ง: มันเริ่มจากพื้นฐานทางทฤษฎีและโมเดลทางคณิตศาสตร์ที่แข็งแกร่ง OOP มีการพัฒนาฮิวริสติกมากมาย แต่ก็ยังไม่มีระเบียบแบบแผนสมบูรณ์
Steven A. Lowe

18

ใช่ฉันมี

ฉันเงียบไปในหัวข้อนี้มาเป็นเวลานาน ได้เวลาพูดออกมา

  • มีใครพยายามใช้แนวคิดนี้กับการออกแบบวัตถุหรือไม่

ใช่. ฉันทำงานเกี่ยวกับการทำให้วัตถุเป็นมาตรฐานเป็นระเบียบ (และด้วยเหตุนี้ทฤษฎีเชิงวัตถุต้นแบบ) มานานกว่า 20 ปี

  • คุณเป็นอย่างไรบ้าง

โดยตระหนักว่าข้อมูลและรหัสสามารถใช้แทนกันได้อย่างน้อยก็ในทางทฤษฎี ซึ่งหมายความว่าหลักการของการทำให้เป็นมาตรฐานและการดำเนินการเชิงสัมพันธ์สามารถนำไปใช้กับรหัสเช่นเดียวกับข้อมูล

  • มันทำงานอย่างไร

มันใช้งานได้ค่อนข้างดี - ฉันเชื่อว่าความเข้าใจที่ได้รับมานั้นเป็น "อาวุธลับ" ของความสามารถในการออกแบบการวิเคราะห์และการปรับโครงสร้างของฉัน

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

แต่ฉันได้ข้อสรุปว่าทุกสิ่งที่เกิดขึ้นในชีวิตของฉันนั้นสำคัญกว่าสนุกกว่าและ / หรือทำกำไรได้มากกว่าฉันจะไม่มีเวลาทำวิจัยให้เสร็จ เคย นอกจากนี้ยังมีความเป็นไปได้ที่สำคัญที่ฉันไม่มีพื้นฐานทางทฤษฎีที่จำเป็นสำหรับ CS เพื่อทำงานให้สำเร็จโดยลำพัง

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

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

สิ่งที่น่าสนใจจริงๆที่เกิดขึ้นเมื่อคุณใช้ฟื้นฟูรหัส - ที่ฉันจะยืนยันเป็นรากฐานของ refactoring

ดังนั้นตอนนี้ฉันกำลังคิดว่าสิ่งที่ดีที่สุดที่ควรทำคือออกไปพูดด้วยการขอพูดที่ DevDays 2011 ใน DC และพบว่ามีชุมชนที่ตื่นเต้นกับสิ่งนี้หรือเปล่า

นี่คือการแอบดู: การทำให้เป็นมาตรฐานเป็นกระบวนการของการทำบางสิ่งบางอย่างให้น้อยที่สุดและไม่ซ้ำซ้อน หลักการอย่าทำซ้ำตัวเอง (DRY) หลักการของการโปรแกรมเชิงวัตถุจึงเป็นการแสดงให้เห็นอย่างชัดเจนถึงเป้าหมายของการทำให้เป็นมาตรฐาน ฉันเชื่อว่าฉันสามารถแสดงให้เห็นว่าหลักการออกแบบ / การเขียนโปรแกรม / การปรับโครงสร้างวัตถุที่รู้จักกันดีทั้งหมดนั้นเป็นผลมาจากการทำให้วัตถุเป็นมาตรฐาน ฉันคิดว่าฉันสามารถแสดงให้เห็นว่ามีสิ่งที่น่าสนใจมากกว่าที่สามารถทำได้กับระบบใน Object Normal Form (ONF) มากกว่าเพียงแค่การปรับโครงสร้างใหม่


1
มีเอกสารสำคัญอีกไหม?
Steve314

4
เผยแพร่! (ได้โปรด?) (โปรดได้ไหม?) หากคุณต้องการความช่วยเหลือในการรับเอกสารตามลำดับและอื่น ๆ โปรดติดต่อฉัน
AJ01

1
@ChrisCirefice: มีความสุขยิงอีเมลถึงฉันที่ steven.lowe@nov8r.com
Steven A. Lowe

1
@ChrisCirefice: เพียงแค่ FYI ผู้สมัครระดับปริญญาเอกย้ายไปยังมหาวิทยาลัยอื่น โปรเจ็กต์ back-burner อีกครั้ง (แต่ฉันกำลังเขียนหนังสือเกี่ยวกับ DDD)
Steven A. Lowe

1
สวัสดี @ StevenA.Lowe ฉันสนใจการวิจัยของคุณจริงๆ ฉันพบกระดาษที่เข้ารหัสค่อนข้างสั้น / มีความคิดเห็นเกี่ยวกับเรื่องนี้หรือไม่? BTW คุณอาจแสดงความคิดของคุณได้อีกเล็กน้อยด้วยการเขียนโพสต์บล็อกก่อน ขอบคุณ
Wei Qiu

5

สิ่งนี้เริ่มต้นจากความเห็นของRein Henrich ซึ่งเป็นคำตอบที่ยอดเยี่ยมแต่ได้ยาวเกินไป ...

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

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

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


2
มุมมองของฉันคือหลักการเป็นแถลงการณ์เกี่ยวกับวิธีที่เหมาะที่สุดในการแก้ไขปัญหาความตึงเครียด รูปแบบเป็นฮิวริสติกสำหรับการนำหลักการไปใช้ หลักการของ IOW เป็นคำแถลงเกี่ยวกับโครงสร้างของพื้นที่ปัญหาและรูปแบบเป็นกฎสำหรับการเปลี่ยนให้เป็นพื้นที่โซลูชัน แต่ฉันจัดเรียงของถั่วคณิตศาสตร์ดังนั้นฉันคิดว่าแปลก :)
Rein Henrichs

2

วิธีการที่ดีมากกับวัตถุรูปแบบธุรกิจการออกแบบที่คล้ายกับการฟื้นฟูคือการสร้างแบบจำลอง UML ในสี

มันเป็นกลยุทธ์การออกแบบที่พบโดย Peter Coad ที่ช่วยให้นามธรรมวัตถุรูปแบบธุรกิจ

น่าเสียดายที่หนังสือ - การสร้างแบบจำลองสี Java ด้วย UML: องค์ประกอบองค์กรและกระบวนการ - ขายหมดแล้วและคุณสามารถซื้อได้แล้ว

มีบทความสองสามบทความเกี่ยวกับเทคนิคนี้ทางอินเทอร์เน็ต

หากคุณคุ้นเคยกับการออกแบบเชิงสัมพันธ์คุณจะพบว่าUML Modeling in Colorมีประโยชน์ในการให้คำแนะนำคุณ:


0

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


0

การอ้างอิงวัตถุหรือพอยน์เตอร์นั้นคล้ายกับกุญแจต่างประเทศ มันลึกมากเท่าที่ฉันเต็มใจจะคิดในเรื่องนี้ :)

ที่จริงฉันจะคิดลึก หากคุณจำลองวัตถุของคุณด้วยการทำซ้ำข้อมูล 0 และสามารถ "ค้นหา" วัตถุของคุณและทำการอัปเดตตามการตั้งค่าในวัตถุเหล่านั้นจะไม่มีการยกเลิกการเชื่อมต่อ ในความเป็นจริงคุณสามารถทำได้โดยการสร้างไลบรารี่ของผู้ใช้ Microsoft มีอยู่แล้วในเรื่องนี้ แต่ไปในทิศทางของการสร้าง LINQ-based ไวยากรณ์ส่วนหนึ่งของ C # ผ่าน "ห้องสมุดแบบสอบถาม"

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