BobDalgleish ได้ตั้งข้อสังเกตแล้วว่ารูปแบบ (ต่อต้าน -) นี้เรียกว่า " ข้อมูลคนจรจัด "
จากประสบการณ์ของฉันสาเหตุที่พบบ่อยที่สุดของข้อมูลคนจรจัดที่มากเกินไปคือการมีตัวแปรสถานะที่เชื่อมโยงกันซึ่งควรถูกห่อหุ้มในวัตถุหรือโครงสร้างข้อมูล บางครั้งอาจจำเป็นต้องวางกลุ่มวัตถุเพื่อจัดระเบียบข้อมูลอย่างเหมาะสม
สำหรับตัวอย่างง่ายๆพิจารณาเกมที่มีตัวละครที่ผู้เล่นสามารถปรับแต่งที่มีคุณสมบัติเหมือนplayerName
, playerEyeColor
และอื่น ๆ แน่นอนว่าผู้เล่นยังมีตำแหน่งทางกายภาพในแผนที่เกมและคุณสมบัติอื่น ๆ เช่นพูดระดับปัจจุบันและระดับสูงสุดและอื่น ๆ
ในการวนซ้ำครั้งแรกของเกมดังกล่าวอาจเป็นทางเลือกที่เหมาะสมอย่างยิ่งที่จะทำให้คุณสมบัติเหล่านี้เป็นตัวแปรระดับโลก - หลังจากนั้นมีผู้เล่นเพียงคนเดียวและเกือบทุกอย่างในเกมเกี่ยวข้องกับผู้เล่น ดังนั้นสถานะโกลบอลของคุณอาจมีตัวแปรเช่น:
playerName = "Bob"
playerEyeColor = GREEN
playerXPosition = -8
playerYPosition = 136
playerHealth = 100
playerMaxHealth = 100
แต่ในบางจุดคุณอาจพบว่าคุณต้องเปลี่ยนการออกแบบนี้อาจเป็นเพราะคุณต้องการเพิ่มโหมดผู้เล่นหลายคนในเกม เป็นครั้งแรกที่คุณสามารถลองสร้างตัวแปรเหล่านั้นทั้งหมดในเครื่องและส่งผ่านไปยังฟังก์ชันที่ต้องการ อย่างไรก็ตามคุณอาจพบว่าการกระทำบางอย่างในเกมของคุณอาจเกี่ยวข้องกับการเรียกฟังก์ชันเช่น:
mainGameLoop()
-> processInputEvent()
-> doPlayerAction()
-> movePlayer()
-> checkCollision()
-> interactWithNPC()
-> interactWithShopkeeper()
... และinteractWithShopkeeper()
ฟังก์ชั่นนี้มีเจ้าของที่อยู่ผู้เล่นตามชื่อดังนั้นตอนนี้คุณต้องผ่านplayerName
ข้อมูลการเดินผ่านทุกฟังก์ชั่นเหล่านั้นทันที และแน่นอนถ้าเจ้าของร้านคิดว่าผู้เล่นที่มีตาสีฟ้าไร้เดียงสาและจะคิดราคาที่สูงขึ้นสำหรับพวกเขาคุณจะต้องผ่านplayerEyeColor
ฟังก์ชั่นทั้งหมดและอื่น ๆ
เหมาะสมการแก้ปัญหาในกรณีนี้เป็นหลักสูตรที่จะกำหนดวัตถุที่ผู้เล่นที่ห่อหุ้มชื่อ, สีตา, ตำแหน่ง, สุขภาพและคุณสมบัติอื่น ๆ ของตัวละครของผู้เล่น ด้วยวิธีนี้คุณจะต้องส่งผ่านวัตถุเดียวไปยังฟังก์ชั่นทั้งหมดที่เกี่ยวข้องกับเครื่องเล่น
นอกจากนี้ฟังก์ชั่นหลายอย่างข้างต้นยังสามารถทำให้เป็นวิธีการของวัตถุผู้เล่นซึ่งจะทำให้พวกเขาเข้าถึงคุณสมบัติของผู้เล่นโดยอัตโนมัติ ในทางนี้เป็นเพียงน้ำตาล syntactic ตั้งแต่เรียกวิธีการในวัตถุได้อย่างมีประสิทธิภาพผ่านวัตถุเช่นเป็นพารามิเตอร์ที่ซ่อนอยู่กับวิธีการต่อไป แต่มันจะทำให้รหัสดูชัดเจนและเป็นธรรมชาติมากขึ้นหากใช้อย่างถูกต้อง
แน่นอนว่าเกมทั่วไปจะมีสถานะ "ทั่วโลก" มากกว่าผู้เล่น; ตัวอย่างเช่นคุณเกือบจะมีแผนที่บางส่วนที่เกมดังกล่าวเกิดขึ้นและรายชื่อตัวละครที่ไม่ใช่ผู้เล่นที่เคลื่อนไหวอยู่บนแผนที่และอาจมีรายการวางอยู่บนนั้นและอื่น ๆ คุณสามารถส่งผ่านสิ่งเหล่านี้ไปรอบ ๆ เป็นวัตถุการเดินย่ำได้เช่นกัน แต่นั่นจะทำให้วิธีการของคุณขัดแย้งกัน
แต่วิธีแก้ไขคือให้วัตถุเก็บการอ้างอิงถึงวัตถุอื่นใดที่มีความสัมพันธ์แบบถาวรหรือชั่วคราวด้วย ตัวอย่างเช่นวัตถุผู้เล่น (และอาจเป็นวัตถุ NPC ด้วย) อาจจะเก็บการอ้างอิงไปยังวัตถุ "เกมโลก" ซึ่งจะมีการอ้างอิงถึงระดับปัจจุบัน / แผนที่เพื่อให้วิธีการเช่นplayer.moveTo(x, y)
ไม่จำเป็นต้อง จะได้รับแผนที่อย่างชัดเจนเป็นพารามิเตอร์
ในทำนองเดียวกันหากตัวละครผู้เล่นของเรามีสุนัขสัตว์เลี้ยงที่ติดตามพวกเขาเราจะจัดกลุ่มตัวแปรสถานะทั้งหมดที่อธิบายสุนัขเป็นวัตถุเดียวและให้ผู้อ้างอิงคัดค้านสุนัข (เพื่อให้ผู้เล่นสามารถ พูดเรียกสุนัขตามชื่อ) และในทางกลับกัน (เพื่อให้สุนัขรู้ว่าผู้เล่นอยู่ที่ไหน) และแน่นอนว่าเราอาจต้องการให้ผู้เล่นและสุนัขคัดค้านทั้งคลาสย่อยของวัตถุ "นักแสดง" ทั่วไปมากขึ้นเพื่อให้เราสามารถนำรหัสเดิมมาใช้เพื่อพูดย้ายทั้งสองรอบแผนที่
ps แม้ว่าฉันเคยใช้เกมเป็นตัวอย่าง แต่ก็มีโปรแกรมประเภทอื่นที่มีปัญหาเช่นนี้เกิดขึ้นเช่นกัน ในประสบการณ์ของฉันแม้ว่าปัญหาพื้นฐานมักจะเหมือนกันเสมอ: คุณมีตัวแปรหลายอย่างที่แยกกัน (ไม่ว่าจะเป็นในระดับท้องถิ่นหรือระดับโลก) ที่ต้องการรวมเข้าด้วยกันเป็นวัตถุที่เชื่อมโยงกันอย่างน้อยหนึ่งรายการ ไม่ว่าจะเป็นข้อมูล "คนจรจัด" บุกรุกเข้าไปในฟังก์ชั่นของคุณประกอบด้วย "ทั่วโลก" การตั้งค่าตัวเลือกหรือการสืบค้นฐานข้อมูลแคชหรือพาหะของรัฐในการจำลองเชิงตัวเลขการแก้ปัญหาคือคงเส้นคงวาในการระบุธรรมชาติบริบทว่าข้อมูลที่เป็นและทำให้ที่เป็นวัตถุ (หรืออะไรก็ตามที่ใกล้เคียงที่สุดในภาษาที่คุณเลือก)