ฉันเขียนโค้ดจำนวนมากที่เกี่ยวข้องกับสามขั้นตอนพื้นฐาน
- รับข้อมูลจากที่อื่น
- แปลงข้อมูลนั้น
- วางข้อมูลนั้นไว้ที่ใดที่หนึ่ง
ปกติแล้วฉันจะใช้คลาสสามประเภท - โดยได้แรงบันดาลใจจากรูปแบบการออกแบบที่เกี่ยวข้อง
- โรงงาน - เพื่อสร้างวัตถุจากทรัพยากรบางอย่าง
- ผู้ไกล่เกลี่ย - เพื่อใช้โรงงานทำการเปลี่ยนแปลงจากนั้นใช้ผู้บังคับบัญชา
- ผู้บังคับบัญชา - เพื่อใส่ข้อมูลนั้นไปที่อื่น
ชั้นเรียนของฉันมักจะมีขนาดค่อนข้างเล็กมักเป็นวิธีเดียว (สาธารณะ) เช่นรับข้อมูลแปลงข้อมูลทำงานทำงานบันทึกข้อมูล สิ่งนี้นำไปสู่การเพิ่มจำนวนชั้นเรียน แต่โดยทั่วไปก็ใช้งานได้ดี
ที่ฉันต้องดิ้นรนคือเมื่อฉันมาทดสอบฉันลงเอยด้วยการทดสอบที่รัดกุม ตัวอย่างเช่น;
- โรงงาน - อ่านไฟล์จากดิสก์
- Commander - เขียนไฟล์ลงดิสก์
ฉันไม่สามารถทำการทดสอบได้หากไม่มีอันอื่น ฉันสามารถเขียนรหัส 'ทดสอบ' เพิ่มเติมเพื่อทำดิสก์อ่าน / เขียนได้ แต่จากนั้นฉันก็ทำซ้ำตัวเอง
เมื่อดูที่. Net คลาสFileจะใช้วิธีการที่แตกต่างกันโดยจะรวมความรับผิดชอบของโรงงานและผู้บังคับบัญชาเข้าด้วยกัน มันมีฟังก์ชั่นสำหรับการสร้างลบอยู่และอ่านทั้งหมดในที่เดียว
ฉันควรมองหาที่จะทำตามตัวอย่างของ. Net และการรวมกันโดยเฉพาะอย่างยิ่งเมื่อจัดการกับทรัพยากรภายนอก - คลาสของฉันด้วยกันไหม? รหัสนั้นยังคงอยู่คู่กัน แต่มันมีความตั้งใจมากกว่า - มันเกิดขึ้นที่การใช้งานดั้งเดิมมากกว่าในการทดสอบ
ปัญหาของฉันที่นี่ที่ฉันได้ใช้หลักการความรับผิดชอบเดียวค่อนข้าง overzealously? ฉันมีชั้นเรียนแยกต่างหากที่รับผิดชอบในการอ่านและเขียน เมื่อฉันสามารถมีคลาสรวมซึ่งรับผิดชอบการจัดการกับทรัพยากรเฉพาะเช่นดิสก์ระบบ
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
- โปรดทราบว่าคุณกำลังทำให้ "ความรับผิดชอบ" กับ "สิ่งที่ต้องทำ" ความรับผิดชอบเป็นเหมือน "ประเด็นที่น่าเป็นห่วง" ความรับผิดชอบของคลาสไฟล์กำลังดำเนินการกับไฟล์
File
ไลบรารีของคุณจาก C # คือสำหรับทุกสิ่งที่เรารู้ว่าFile
คลาสนั้นอาจเป็นซุ้มทำการวางไฟล์ทั้งหมดไว้ในที่เดียว - เข้าไปในชั้นเรียน แต่อาจใช้การอ่าน / เขียนที่คล้ายกัน จริงๆแล้วมีตรรกะที่ซับซ้อนมากขึ้นสำหรับการจัดการไฟล์ คลาสดังกล่าว (the File
) จะยังคงยึด SRP ไว้เพราะกระบวนการทำงานกับระบบไฟล์จะถูกแยกออกจากเลเยอร์อื่น ไม่ได้บอกว่าเป็นกรณี แต่อาจเป็นไปได้ :)