ควรสร้างวัตถุโดยปริยายหรือสร้างไฟล์อย่างชัดเจน?


9

ฉันกำลังสร้างวัตถุที่มีวัตถุประสงค์เพียงอย่างเดียวคือการอ่านในไฟล์รูปแบบหนึ่งและสร้างอีกรูปแบบที่แตกต่างกัน

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

คำตอบ:


12

หากคุณกำลังทำงานในภาษาที่รองรับฉันจะให้วิธีการบันทึกที่ใช้กระแสข้อมูล ด้วยวิธีนี้ผู้ใช้สามารถบันทึกข้อมูลได้ทุกที่ที่ต้องการ

ใช้เวลาในการเขียนนานกว่า 20 วินาทีกว่าการบันทึกลงในไฟล์ แต่โปรแกรมเมอร์เข้าใจได้ง่ายและที่ไซต์การโทรมันชัดเจนว่าเกิดอะไรขึ้นจริง

วิธีที่คุณอธิบาย (วัตถุที่อ่านอินพุตและส่งออกไปยังไฟล์อื่น) มิฉะนั้นดูเหมือนว่าแปลก วัตถุประสงค์ของการสร้างวัตถุที่ทำทุกอย่างในระหว่างการก่อสร้างคืออะไร?

คุณจะเรียกมันด้วยวิธีนี้ไหม

var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;

สำหรับการใช้งานที่เหมาะสมของ SaveFileWeirdClass ฉันคาดว่าไม่มีผลข้างเคียงจากการสร้างมันขึ้นมา อ่านไฟล์ - ดี กำลังสร้างไฟล์หรือไม่? เลขที่

สำหรับฉันดูเหมือนชัดเจนมากขึ้นด้วยวิธีนี้:

var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;

using(Stream stream = new FileStream(filePath))
    stuff.Save(stream);

1
ดีจัง. ตัวเลือกอื่นที่คล้ายกันคือเพียงใช้วัตถุที่ใช้สตรีมอะไรก็ตามที่ฐานของแอปพลิเคชันมีและจัดการกับมันตามที่คุณต้องการกระแสอื่น ๆ
Steven Evers

3

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

โดยส่วนตัวแล้วฉันจะไม่ทำและเลือกที่จะจัดการกับไฟล์ caller pass ที่เปิดไว้ล่วงหน้าให้กับตัวสร้าง การสร้างไฟล์ภายในคลาส precludes ทำให้ผู้โทรมีตัวเลือกในการทำสิ่งต่าง ๆ เช่นการตั้งค่าการอนุญาตหรือหากการเขียนไปยังอุปกรณ์ให้ทำการกำหนดค่าเริ่มต้นเฉพาะอุปกรณ์ หากคุณต้องการที่จะมีรุ่นของคุณชั้นที่ทำงานบนไฟล์และทำงานแสมสร้างห่อไว้ในFooConverterFooFileConverter


2

อย่างชัดเจน

คุณต้องการตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้กฎผลข้างเคียงที่ฉลาดซึ่งอาจแตกหักในรุ่นอนาคตหรือสถาปัตยกรรมผิดปกติ แน่นอนคุณควรมีไฟล์เริ่มต้นที่ผู้ใช้สามารถเขียนทับพวกเขาควรเลือก


1

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

ดู/programming/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exceptionสำหรับการสนทนารอบ ๆ

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