เราจะใส่รหัส“ ถามโลก” เมื่อเราแยกการคำนวณจากผลข้างเคียงได้อย่างไร


10

ตามหลักการแบ่งแยกคำสั่งรวมถึงการคิดในข้อมูลและDDD ด้วยการนำเสนอClojureหนึ่งควรแยกผลข้างเคียง (แก้ไขโลก) จากการคำนวณและการตัดสินใจเพื่อให้ง่ายต่อการเข้าใจและทดสอบทั้งสองส่วน

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


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

1
@MarjanVenema นี่เป็นตัวเลือกเดียวที่มาในใจของฉันเช่นกัน เพียงแค่จากมุมมองทางทฤษฎี: หากวิธีการนั้นไม่เช่นนั้นไม่มีผลข้างเคียง, เรียกการเรียกกลับที่มีผลข้างเคียงมันจะกลายเป็นผลข้างเคียง อาจเป็นปัญหาของฉันที่นี่คือฉันคิดว่าการคำนวณการแยกจากผลข้างเคียงต้องมีการคำนวณที่จะอ้างอิงโปร่งใส แม้ว่ามันจะไม่จำเป็นจริง
Alexey

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

คำตอบ:


1

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

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

ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นซึ่งมีร่างกายที่บริสุทธิ์มีความบริสุทธิ์ที่บริสุทธิ์: http://books.google.co.th/books?id=Yb8azEfnDYgC&pg=PA143#v=onepage&q&f=false

ฉันได้เขียนเกี่ยวกับเรื่องนี้การเรียกใช้ฟังก์ชันประเภทนี้เป็นฟังก์ชันที่อาจบริสุทธิ์: http://adamjonrichardson.com/2014/01/13/potential-pure-functions/

หากคุณรวมฟังก์ชั่นที่อาจบริสุทธิ์เข้ากับฟังก์ชั่น fall-through (ซึ่งขาดการสร้างแบบแยกย่อยและทำน้อยที่สุด) ชุดที่ฉันเรียกชุดแยกคุณสามารถแยกผลข้างเคียงได้อย่างมีประสิทธิภาพและสร้างรหัสที่ทดสอบได้มาก: http: // adamjonrichardson.com/2014/01/15/isolating-side-effects-using-isolation-sets/


0

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

class database_querier
    feature -- queries
        was_previous_query_ok : boolean is
            do
                Result = …
            end

        previous_query_result : string is 
            requires
                was_previous_query_ok
            do
                Result = query_result
            end

    feature -- commands
        query_db (…) is
            do
                …
                query_result = bla
            end

    feature {none} --data
        query_result : string

1
ชอบเห็นไอเฟลออกมาในป่า
SBI

@sbi มันเป็นรหัสหลอก :-)
ctrl-alt-delor

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