การแยกคำสั่ง / แบบสอบถามนำไปใช้กับวิธีการที่สร้างวัตถุและส่งคืน ID หรือไม่


12

สมมติว่าเรามีบริการที่เรียกกระบวนการทางธุรกิจ กระบวนการนี้จะเรียกใช้ในชั้นข้อมูลเพื่อสร้างวัตถุประเภท A ในฐานข้อมูล

หลังจากนั้นเราต้องเรียกอีกครั้งในคลาสข้อมูลอีกชั้นหนึ่งเพื่อสร้างอินสแตนซ์ของประเภท B ในฐานข้อมูล เราจำเป็นต้องส่งข้อมูลบางอย่างเกี่ยวกับ A สำหรับคีย์ต่างประเทศ

ในวิธีแรกเราสร้างวัตถุ (แก้ไขสถานะ) และคืนค่าเป็น ID (แบบสอบถาม) ในวิธีการเดียว

ในวิธีที่สองเรามีสองวิธีหนึ่ง (createA) สำหรับการบันทึกและอื่น ๆ (getId) สำหรับแบบสอบถาม

    public void FirstMethod(Info info)
    {
        var id = firstRepository.createA(info);           
        secondRepository.createB(id);
    }

    public void SecondMethod(Info info)
    {
        firstRepository.createA(info);
        var key = firstRepository.getID(info);
        secondRepository.createB(key);
    }

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

คุณจะกระทบยอด CQS กับสถานการณ์ดังกล่าวได้อย่างไร

มีเพียงวิธีที่สองตาม CQS และถ้าเป็นเช่นนั้นจะดีกว่าที่จะใช้ในกรณีนี้?


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

เข้าสู่ช่วงท้ายของเกมเพื่อเสนอตัวเลือกในการใช้พารามิเตอร์ out ในทางเทคนิคมันไม่ใช่ค่าตอบแทน! ;)

คำตอบ:


13

CQS เป็นแนวทางมากกว่ากฎเด็ดขาด ดูบทความวิกิสำหรับตัวอย่างของกิจกรรมที่เป็นไปไม่ได้ภายใต้ CQS ที่เข้มงวด

อย่างไรก็ตามในกรณีนี้หากคุณต้องการรักษา CQS คุณสามารถสร้าง ID บนฝั่งไคลเอ็นต์ (เช่น GUID) หรือลูกค้าสามารถขอ ID จากระบบก่อนที่จะสร้างวัตถุใด ๆ ซึ่งรู้สึกสะอาดกว่า ฉันดีกว่าการสร้างวัตถุแล้วทำการสืบค้น (แต่จะยากกว่าการใช้คอลัมน์ข้อมูลประจำตัว)

โดยส่วนตัวแล้วฉันแค่ส่งคืน ID และเรียกว่าเป็นหนึ่งในสถานการณ์เหล่านั้นที่ CQS ไม่เหมาะสม

อีกบทความที่ดีกับตัวอย่าง: Martin Fowler


3

หากคุณทำตามวิธีการและดูเหมือนว่าจะพาคุณไปสู่เส้นทางที่ไม่ดีคุณควรประเมินใหม่

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

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


-1

เฉพาะวิธีที่สองตามหลัง CQS

ฉันคิดว่า CQS เป็นแนวทางในการส่งเสริมการเขียนโค้ดที่ดี ใช้ประโยชน์จากแนวทางการเข้ารหัสที่ดีในระหว่างการพัฒนาและหากคุณค้นพบในภายหลังว่าวิธีนี้มีรหัสที่มีความสำคัญกับทรัพยากรคุณยังสามารถปรับให้เหมาะสมได้

การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากของความชั่วร้ายทั้งหมด :)


อะไรคือสิ่งที่ดีเป็นพิเศษในวิธีที่สอง?
CheatEx

ฉันไม่ได้บอกว่าวิธีที่สองคือ 'ดี' ฉันบอกว่ามันเป็นไปตามกระบวนทัศน์ของ CQS หากคุณไม่ปฏิบัติตาม CQS ฉันคิดว่าวิธีที่สองนั้นไม่ดีสำหรับคุณ หากคุณต้องการรู้ว่าทำไมบางคนพยายามติดตาม CQS ดูhttp://en.wikipedia.org/wiki/Command-query_separation
ชีสบอกว่าหยุดยิง mod

คุณบอกว่า CQS กำลังส่งเสริมการเข้ารหัสที่ดีหากเป็นจริงเราควรสังเกต "ความดี" บางอย่างในวิธีที่สอง มันอยู่ที่ไหน?
CheatEx

เห็นได้ชัดว่าคุณไม่ได้อ่านลิงก์ที่ฉันให้ไว้ CQS จับวลี: ถามคำถามที่ไม่ควรเปลี่ยนคำตอบ ในวิธีแรกของคุณคุณมีวิธี ('createA') ซึ่งมี 'คำตอบ' แต่จะเปลี่ยนคำตอบทุกครั้งที่คุณถาม ในวิธีที่สองคุณไม่มีสิ่งนี้คือ 'ความดี' ในนั้น เพื่อความชัดเจน: ฉันไม่ใช่คนเจ้าระเบียบของ CQS ฉันไม่ทำตามทุกครั้ง
cheesus พูดว่าหยุดยิง mods
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.