การแก้ปัญหาเว็บหากคุณสามารถสร้างเอ็นจิ้นกฎซึ่งแต่ละกฎจะถูกเข้ารหัสอย่างอิสระ การปรับแต่งเพิ่มเติมสำหรับสิ่งนี้คือการสร้างภาษาเฉพาะโดเมน (DSL) เพื่อสร้างกฎอย่างไรก็ตาม DSL เพียงอย่างเดียวแทนที่ปัญหาจากรหัสฐานหนึ่ง (หลัก) ไปยังอีก (DSL) หากไม่มีโครงสร้างแล้ว DSL จะไม่ดีไปกว่าภาษาพื้นเมือง (Java, C # ฯลฯ ) ดังนั้นเราจะกลับมาหาเราหลังจากเราพบวิธีปรับปรุงโครงสร้าง
ปัญหาพื้นฐานคือคุณมีปัญหาในการสร้างแบบจำลอง เมื่อใดก็ตามที่คุณพบกับสถานการณ์แบบ combinatorial มันเป็นสัญญาณที่ชัดเจนว่าสิ่งที่เป็นนามธรรมของคุณที่อธิบายสถานการณ์นั้นหยาบเกินไป คุณน่าจะรวมองค์ประกอบที่ควรเป็นของรูปแบบที่แตกต่างกันในนิติบุคคลเดียว
หากคุณทำลายโมเดลของคุณไปเรื่อย ๆ ในที่สุดคุณจะละลายเอฟเฟกต์ combinatorial นี้โดยสมบูรณ์ อย่างไรก็ตามเมื่อใช้เส้นทางนี้มันเป็นเรื่องง่ายที่จะหลงทางในการออกแบบของคุณสร้างความยุ่งเหยิงที่ยิ่งใหญ่กว่าความสมบูรณ์แบบที่นี่ไม่จำเป็นต้องเป็นเพื่อนของคุณ
เครื่องจักรของรัฐที่มีขอบเขตและเอ็นจิ้นกฎเป็นเพียงตัวอย่างของปัญหาที่สามารถแยกย่อยและจัดการได้มากขึ้น แนวคิดหลักที่นี่คือวิธีที่ดีในการกำจัดปัญหา combinatorial เช่นนี้มักจะสร้างการออกแบบและทำซ้ำคลื่นไส้โฆษณาในระดับที่ซ้อนกันของนามธรรมจนกระทั่งระบบของคุณทำงานได้อย่างน่าพอใจ คล้ายกับวิธีการใช้เศษส่วนในการสร้างรูปแบบที่ซับซ้อน กฎยังคงเหมือนเดิมไม่ว่าคุณจะมองด้วยกล้องจุลทรรศน์หรือมองจากมุมสูง
ตัวอย่างการใช้สิ่งนี้กับโดเมนของคุณ
คุณกำลังพยายามสร้างแบบจำลองว่าวัวเคลื่อนผ่านภูมิประเทศอย่างไร แม้ว่าคำถามของคุณจะไม่มีรายละเอียด แต่ฉันเดาว่าจำนวนมากของ ifs นั้นรวมถึงส่วนการตัดสินใจเช่นif cow.isStanding then cow.canRun = true
แต่คุณจะจมลงเมื่อคุณเพิ่มรายละเอียดของภูมิประเทศเช่น ดังนั้นสำหรับทุกการกระทำที่คุณต้องการพาคุณต้องตรวจสอบทุกแง่มุมที่คุณสามารถคิดและทำซ้ำการตรวจสอบเหล่านี้สำหรับการกระทำที่เป็นไปได้ต่อไป
ก่อนอื่นเราต้องมีการออกแบบที่สามารถทำซ้ำได้ซึ่งในกรณีนี้จะเป็น FSM เพื่อจำลองสภาวะการเปลี่ยนแปลงของการจำลอง ดังนั้นสิ่งแรกที่ฉันจะทำคือการใช้ FSM อ้างอิงกำหนดอินเทอร์เฟซของรัฐการเปลี่ยนอินเทอร์เฟซและบางทีบริบทการเปลี่ยนแปลงที่สามารถมีข้อมูลที่ใช้ร่วมกันเพื่อให้สามารถใช้ได้กับอีกสองคน การใช้งาน FSM ขั้นพื้นฐานจะเปลี่ยนจากการเปลี่ยนภาพหนึ่งไปสู่อีกภาพหนึ่งโดยไม่คำนึงถึงบริบทนี่เป็นที่ที่กฎของโปรแกรมเข้ามากฎของโปรแกรมนั้นจะสรุปเงื่อนไขที่ต้องปฏิบัติให้เรียบร้อยหากการเปลี่ยนแปลงนั้นเกิดขึ้น เอ็นจินกฎที่นี่สามารถทำได้ง่ายเหมือนรายการของกฎแต่ละอันมีฟังก์ชันประเมินผลที่ส่งคืนบูลีน หากต้องการตรวจสอบว่ามีการเปลี่ยนแปลงเกิดขึ้นหรือไม่ให้ทำซ้ำรายการกฎและถ้ามีการประเมินว่าเป็นเท็จการเปลี่ยนแปลงจะไม่เกิดขึ้น การเปลี่ยนแปลงตัวเองจะมีรหัสพฤติกรรมเพื่อแก้ไขสถานะปัจจุบันของ FSM (และงานอื่น ๆ ที่เป็นไปได้)
ตอนนี้ถ้าฉันเริ่มใช้การจำลองเป็น FSM ขนาดใหญ่เดียวที่ระดับ GOD ฉันจบด้วยสถานะที่เป็นไปได้จำนวนมากการเปลี่ยนผ่าน ฯลฯ ระเบียบอื่น ๆ ดูเหมือนว่ามันจะได้รับการแก้ไข แต่จริงๆแล้วมันแพร่กระจายไปรอบ ๆ : แต่ละ IF คือ ตอนนี้กฎที่ดำเนินการทดสอบกับข้อมูลเฉพาะของบริบท (ซึ่ง ณ จุดนี้มีทุกอย่างมาก) และแต่ละเนื้อหาของ IF อยู่ที่ไหนสักแห่งในรหัสการเปลี่ยนแปลง
เข้าสู่การแตกหักของแฟร็กทัล: ขั้นตอนแรกคือการสร้าง FSM สำหรับวัวแต่ละตัวที่รัฐเป็นรัฐภายในของตัวเองของวัว มีความเป็นไปได้ที่กราฟจะไม่สมบูรณ์ตัวอย่างเช่นการแทะเล็มสามารถเข้าถึงได้จากสถานะที่ยืนอยู่เท่านั้นการเปลี่ยนแปลงอื่น ๆ จะถูกแยกออกเนื่องจากขาดจากโมเดลเท่านั้น ที่นี่คุณแยกข้อมูลได้อย่างมีประสิทธิภาพในสองรุ่นที่แตกต่างกันวัวและภูมิประเทศ แต่ละชุดมีคุณสมบัติเป็นของตัวเอง การแยกย่อยนี้จะช่วยให้คุณออกแบบเครื่องยนต์โดยรวมได้ง่ายขึ้น ตอนนี้แทนที่จะมีเอ็นจินกฎเดียวที่ตัดสินใจทั้งหมดคุณมีเอนจินกฎที่ง่ายกว่า (หนึ่งอันสำหรับแต่ละช่วงการเปลี่ยนภาพ) ที่ตัดสินใจในรายละเอียดที่เฉพาะเจาะจงมาก
เนื่องจากฉันกำลังใช้รหัสเดียวกันสำหรับ FSM อีกครั้งนี่เป็นพื้นฐานการกำหนดค่าของ FSM จำเมื่อเราพูดถึง DSL ก่อนหน้านี้? นี่คือที่ที่ DSL สามารถทำสิ่งที่ดีได้มากมายหากคุณมีกฎและการเปลี่ยนผ่านมากมายที่จะเขียน
จะลึกลงไป
ตอนนี้ GOD ไม่ต้องจัดการกับความซับซ้อนทั้งหมดในการจัดการสถานะภายในของวัวอีกต่อไป แต่เราสามารถผลักดันมันต่อไปได้ ยังมีความซับซ้อนมากมายในการจัดการภูมิประเทศเช่น นี่คือที่ที่คุณตัดสินใจว่าการแยกย่อยเพียงพอหรือไม่ ตัวอย่างเช่นใน GOD ของคุณคุณจะจัดการพลวัตภูมิประเทศ (หญ้ายาวโคลนโคลนแห้งหญ้าสั้น ฯลฯ ) เราสามารถทำซ้ำรูปแบบเดียวกันได้ ไม่มีอะไรขัดขวางคุณจากการฝังตรรกะดังกล่าวในภูมิประเทศโดยการแยกสถานะภูมิประเทศทั้งหมด (หญ้ายาวหญ้าสั้นโคลนแห้ง ฯลฯ ) ลงใน FSM ภูมิประเทศใหม่ด้วยการเปลี่ยนระหว่างรัฐและกฎง่าย ๆ ตัวอย่างเช่นในการเข้าสู่สถานะโคลนเอ็นจิ้นกฎควรตรวจสอบบริบทเพื่อค้นหาของเหลวมิฉะนั้นจะไม่สามารถทำได้ ตอนนี้พระเจ้าก็เรียบง่ายขึ้น
คุณสามารถทำให้ระบบของ FSM สมบูรณ์โดยทำให้พวกเขาเป็นอิสระและให้พวกเขาแต่ละเธรด ขั้นตอนสุดท้ายนี้ไม่จำเป็น แต่ช่วยให้คุณเปลี่ยนการโต้ตอบของระบบแบบไดนามิกโดยการปรับวิธีการมอบหมายการตัดสินใจของคุณ (เปิดตัว FSM พิเศษหรือเพียงแค่ส่งคืนสถานะที่กำหนดไว้ล่วงหน้า)
จำได้ไหมว่าเราพูดถึงการเปลี่ยนแปลงว่าสามารถทำ "งานที่เป็นไปได้อื่น ๆ " ได้อย่างไร มาสำรวจกันโดยเพิ่มความเป็นไปได้สำหรับรุ่นที่แตกต่างกัน (FSM) เพื่อสื่อสารกัน คุณสามารถกำหนดชุดของเหตุการณ์และอนุญาตให้แต่ละ FSM ลงทะเบียนฟังฟังเหตุการณ์เหล่านี้ ดังนั้นหากตัวอย่างเช่นวัวเข้าสู่ภูมิประเทศ hex ฐานสิบหกสามารถลงทะเบียนผู้ฟังสำหรับการเปลี่ยนแปลงการเปลี่ยนแปลง ที่นี่จะค่อนข้างยุ่งยากเพราะ FSM แต่ละตัวจะถูกนำไปใช้ในระดับสูงมากโดยไม่มีความรู้เกี่ยวกับโดเมนเฉพาะที่ได้รับการคุ้มครอง อย่างไรก็ตามคุณสามารถทำสิ่งนี้ได้โดยให้วัวเผยแพร่รายการของเหตุการณ์และเซลล์สามารถลงทะเบียนได้ถ้ามันเห็นเหตุการณ์ที่มันสามารถตอบสนองได้ ลำดับขั้นที่ดีของตระกูลกิจกรรมที่นี่เป็นการลงทุนที่ดี
คุณสามารถผลักดันให้ลึกลงไปอีกโดยสร้างแบบจำลองระดับสารอาหารและวัฏจักรการเจริญเติบโตของหญ้าด้วย ... คุณเดาได้ว่า ... FSM หญ้าที่ฝังอยู่ในรูปแบบของแพทช์ภูมิประเทศ
ถ้าคุณผลักดันความคิดนั้นให้มากพอพระเจ้าก็ทำสิ่งเล็ก ๆ น้อย ๆ เพราะทุกแง่มุมนั้นมีการจัดการด้วยตัวเองค่อนข้างมากทำให้เวลาในการใช้จ่ายกับสิ่งต่าง ๆ ในพระเจ้าเพิ่มขึ้น
ปะยางรถ
ดังที่ระบุไว้ข้างต้น FSM ที่นี่ไม่ใช่วิธีแก้ปัญหาเพียงวิธีการที่จะแสดงให้เห็นว่าการแก้ปัญหาดังกล่าวไม่พบในรหัสต่อคำพูด แต่วิธีที่คุณวางโมเดลปัญหาของคุณ มีวิธีแก้ไขปัญหาอื่น ๆ ที่เป็นไปได้และเป็นไปได้ดีกว่าข้อเสนอ FSM ของฉัน อย่างไรก็ตามวิธีการ "เศษส่วน" ยังคงเป็นวิธีที่ดีในการจัดการปัญหานี้ หากทำอย่างถูกต้องคุณสามารถจัดสรรระดับที่ลึกกว่าซึ่งเป็นเรื่องสำคัญในขณะที่ให้แบบจำลองที่เรียบง่ายกว่า คุณสามารถจัดคิวการเปลี่ยนแปลงและนำไปใช้เมื่อทรัพยากรมีมากขึ้น ในลำดับการกระทำอาจไม่สำคัญเลยที่จะคำนวณการถ่ายเทสารอาหารจากวัวสู่หญ้า อย่างไรก็ตามคุณสามารถบันทึกช่วงการเปลี่ยนภาพเหล่านี้และใช้การเปลี่ยนแปลงในภายหลังหรือเพียงแค่ประมาณด้วยการเดาที่มีการศึกษาโดยเพียงแค่เปลี่ยนกฎของเครื่องมือหรืออาจแทนที่การใช้งาน FSM พร้อมกับรุ่นที่ไร้เดียงสาที่ง่ายกว่าสำหรับองค์ประกอบที่ไม่อยู่ใน ความสนใจ (วัวที่ปลายอีกด้านของฟิลด์) เพื่อให้การโต้ตอบที่มีรายละเอียดมากขึ้นเพื่อรับการมุ่งเน้นและการแบ่งปันทรัพยากรที่มีขนาดใหญ่ขึ้น ทั้งหมดนี้โดยไม่ต้องทบทวนระบบทั้งหมดอีกครั้ง เนื่องจากแต่ละส่วนแยกได้ดีมันจะง่ายกว่าในการสร้างการ จำกัด การแทนที่แบบดรอปดาวน์หรือขยายความลึกของโมเดลของคุณ ด้วยการใช้การออกแบบมาตรฐานคุณสามารถสร้างสิ่งนั้นและเพิ่มการลงทุนในเครื่องมือ Ad-hoc เช่น DSL เพื่อกำหนดกฎหรือคำศัพท์มาตรฐานสำหรับเหตุการณ์เริ่มต้นที่ระดับสูงมากและเพิ่มการปรับแต่งตามต้องการ เนื่องจากแต่ละส่วนแยกได้ดีมันจะง่ายกว่าในการสร้างการ จำกัด การแทนที่แบบดรอปดาวน์หรือขยายความลึกของโมเดลของคุณ ด้วยการใช้การออกแบบมาตรฐานคุณสามารถสร้างสิ่งนั้นและเพิ่มการลงทุนในเครื่องมือ Ad-hoc เช่น DSL เพื่อกำหนดกฎหรือคำศัพท์มาตรฐานสำหรับเหตุการณ์เริ่มต้นที่ระดับสูงมากและเพิ่มการปรับแต่งตามต้องการ เนื่องจากแต่ละส่วนแยกได้ดีมันจะง่ายกว่าในการสร้างการ จำกัด การแทนที่แบบดรอปดาวน์หรือขยายความลึกของโมเดลของคุณ ด้วยการใช้การออกแบบมาตรฐานคุณสามารถสร้างสิ่งนั้นและเพิ่มการลงทุนในเครื่องมือ Ad-hoc เช่น DSL เพื่อกำหนดกฎหรือคำศัพท์มาตรฐานสำหรับเหตุการณ์เริ่มต้นที่ระดับสูงมากและเพิ่มการปรับแต่งตามต้องการ
ฉันจะให้ตัวอย่างรหัส แต่นี่คือทั้งหมดที่ฉันสามารถทำได้ตอนนี้