ฉันอยู่ในโครงการระบบกระจายเขียนด้วยภาษาจาวาที่เรามีบางคลาสที่สอดคล้องกับวัตถุในโลกธุรกิจจริงที่ซับซ้อนมาก วัตถุเหล่านี้มีวิธีการมากมายที่สอดคล้องกับการกระทำที่ผู้ใช้ (หรือตัวแทนอื่น ๆ ) อาจนำไปใช้กับวัตถุนั้น เป็นผลให้คลาสเหล่านี้ซับซ้อนมาก
วิธีการสถาปัตยกรรมทั่วไปของระบบนำไปสู่พฤติกรรมจำนวนมากที่เน้นไปที่คลาสไม่กี่คลาสและสถานการณ์การโต้ตอบที่เป็นไปได้มากมาย
ตัวอย่างและเพื่อให้สิ่งต่าง ๆ ง่ายและชัดเจนสมมติว่าหุ่นยนต์และรถยนต์เป็นชั้นเรียนในโครงการของฉัน
ดังนั้นในคลาส Robot ฉันจะมีวิธีการมากมายในรูปแบบต่อไปนี้:
- นอน(); isSleepAvaliable ();
- ตื่น (); isAwakeAvaliable ();
- เดิน (Direction); isWalkAvaliable ();
- ยิง (Direction); isShootAvaliable ();
- turnOnAlert (); isTurnOnAlertAvailable ();
- turnOffAlert (); isTurnOffAlertAvailable ();
- ชาร์จ (); isRechargeAvailable ();
- ไฟดับ(); isPowerOffAvailable ();
- stepInCar (รถยนต์); isStepInCarAvailable ();
- stepOutCar (รถยนต์); isStepOutCarAvailable ();
- selfDestruct (); isSelfDestructAvailable ();
- ตาย(); isDieAvailable ();
- isAlive (); isAwake (); isAlertOn (); getBatteryLevel (); getCurrentRidingCar (); getAmmo ();
- ...
ในคลาสรถยนต์มันจะคล้ายกัน:
- เปิด(); isTurnOnAvaliable ();
- ปิด(); isTurnOffAvaliable ();
- เดิน (Direction); isWalkAvaliable ();
- เติมน้ำมัน (); isRefuelAvailable ();
- selfDestruct (); isSelfDestructAvailable ();
- ความผิดพลาด (); isCrashAvailable ();
- isOperational (); เมดิสัน (); getFuelLevel (); getCurrentPassenger ();
- ...
แต่ละสิ่งเหล่านี้ (หุ่นยนต์และรถยนต์) ถูกนำมาใช้เป็นเครื่องสถานะซึ่งมีการกระทำบางอย่างที่เป็นไปได้ในบางรัฐและบางคนไม่ได้ การกระทำที่เปลี่ยนสถานะของวัตถุ เมธอดการดำเนินการพ่นIllegalStateException
เมื่อถูกเรียกในสถานะที่ไม่ถูกต้องและisXXXAvailable()
วิธีการแจ้งว่าการกระทำนั้นเป็นไปได้หรือไม่ แม้ว่าบางคนสามารถหักล้างได้ง่ายจากรัฐ (เช่นในสถานะสลีปมีการตื่น) แต่บางตัวก็ไม่ได้ (ในการถ่ายภาพมันจะต้องตื่นอยู่มีชีวิตอยู่มีกระสุนและไม่ขับรถ)
นอกจากนี้การโต้ตอบระหว่างวัตถุก็ซับซ้อนเช่นกัน เช่นรถสามารถถือผู้โดยสารหุ่นยนต์ได้หนึ่งคนเท่านั้นดังนั้นหากอีกคนหนึ่งพยายามเข้าร่วมข้อยกเว้นควรถูกโยนทิ้ง หากรถชนกันผู้โดยสารควรตาย หากหุ่นยนต์ตายภายในยานพาหนะเขาจะไม่สามารถก้าวออกมาแม้ว่ารถของตัวเองจะโอเค หากหุ่นยนต์อยู่ในรถยนต์เขาจะไม่สามารถเข้าไปได้อีกก่อนที่จะก้าวออกไป เป็นต้น
ผลลัพธ์ของสิ่งนี้คืออย่างที่ฉันได้กล่าวไปแล้วคลาสเหล่านี้ซับซ้อนมาก เพื่อทำให้สิ่งเลวร้ายลงมีสถานการณ์ที่เป็นไปได้หลายร้อยสถานการณ์เมื่อหุ่นยนต์และรถยนต์มีปฏิสัมพันธ์กัน นอกจากนี้ตรรกะส่วนใหญ่ไม่จำเป็นต้องเข้าถึงข้อมูลระยะไกลในระบบอื่น ผลลัพธ์คือการทดสอบหน่วยมันยากมากและเรามีปัญหาการทดสอบมากมายทำให้เกิดปัญหาอีกอันหนึ่งในวงจรอุบาทว์:
- การตั้งค่าการทดสอบมีความซับซ้อนมากเพราะพวกเขาจำเป็นต้องสร้างโลกที่ซับซ้อนเพื่อการออกกำลังกาย
- จำนวนการทดสอบมีมาก
- ชุดทดสอบใช้เวลาหลายชั่วโมงในการรัน
- ขอบเขตการทดสอบของเราต่ำมาก
- รหัสการทดสอบมีแนวโน้มที่จะเขียนสัปดาห์หรือเดือนหลังจากรหัสที่ทดสอบหรือไม่เคยเลย
- การทดสอบจำนวนมากแตกเช่นกันส่วนใหญ่เป็นเพราะข้อกำหนดของรหัสที่ทดสอบเปลี่ยนไป
- สถานการณ์บางอย่างซับซ้อนดังนั้นพวกเขาล้มเหลวในการหมดเวลาในระหว่างการตั้งค่า (เรากำหนดค่าการหมดเวลาในการทดสอบแต่ละครั้งในกรณีที่เลวร้ายที่สุดนาน 2 นาทีและแม้เวลานี้นานพวกเขาหมดเวลาเรามั่นใจว่ามันไม่ใช่
- บักหลุดเข้าสู่สภาพแวดล้อมการผลิตเป็นประจำ
สถานการณ์สมมติของหุ่นยนต์และรถยนต์นั้นเป็นการลดความซับซ้อนของสิ่งที่เรามีในความเป็นจริง เห็นได้ชัดว่าสถานการณ์นี้ไม่สามารถจัดการได้ ดังนั้นฉันขอความช่วยเหลือและข้อเสนอแนะเพื่อ: 1 ลดความซับซ้อนของชั้นเรียน; 2. ทำให้สถานการณ์การโต้ตอบระหว่างวัตถุของฉันง่ายขึ้น 3. ลดเวลาการทดสอบและจำนวนโค้ดที่จะทดสอบ
แก้ไข:
ฉันคิดว่าฉันไม่ชัดเจนเกี่ยวกับเครื่องจักรของรัฐ หุ่นยนต์เป็นเครื่องจักรกลของรัฐโดยที่สหรัฐฯ "หลับ", "ตื่น", "ชาร์จใหม่", "ตาย" ฯลฯ รถยนต์เป็นเครื่องจักรของรัฐอีกเครื่องหนึ่ง
แก้ไข 2: ในกรณีที่คุณอยากรู้ว่าระบบของฉันคืออะไรคลาสที่โต้ตอบคือสิ่งต่าง ๆ เช่น Server, IPAddress, Disk, Backup, User, SoftwareLicense เป็นต้นสถานการณ์ Robot และ Car เป็นเพียงกรณีที่ฉันพบ นั่นจะง่ายพอที่จะอธิบายปัญหาของฉัน