Jika Anda bekerja dalam bahasa yang mendukungnya, saya akan memberikan metode Simpan yang mengambil Stream. Dengan begitu, pengguna dapat menyimpan data di mana pun ia inginkan.
Butuh 20 detik lebih lama untuk menulis daripada menyimpan hanya ke file, tetapi mudah dipahami oleh seorang programmer, dan di situs panggilan itu sangat jelas apa yang sebenarnya terjadi.
Cara Anda menggambarkannya (sebuah objek yang membaca input, dan output ke file lain) sebaliknya tampak aneh. Apa tujuan membangun objek yang melakukan segalanya selama konstruksi?
Apakah Anda akan menyebutnya seperti ini?
var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;
Untuk implementasi yang wajar dari SaveFileWeirdClass, saya berharap tidak ada efek samping dari hanya membuatnya. Membaca file - baik-baik saja. Membuat file? Tidak.
Bagi saya tampaknya lebih jelas seperti ini:
var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;
using(Stream stream = new FileStream(filePath))
stuff.Save(stream);
Jika Anda ingin melakukannya di kelas, buat selama inisialisasi. Menunda langkah itu melakukan dua hal buruk: Pertama, itu menambahkan langkah ekstra, eksplisit untuk pemanggil, yang tidak akan membuat objek di tempat pertama kecuali mereka bermaksud menggunakannya untuk menghasilkan output. Kedua, ia menambahkan setidaknya dua poin di mana kode di kelas harus membuat keputusan tentang apakah file terbuka atau tidak dan menangani kondisi itu: sekali ketika Anda pergi untuk menulis output dan sekali selama penghancuran ketika Anda pergi untuk menutupnya. Yang pertama berarti Anda harus melakukan pemeriksaan itu pada setiap penulisan, yang bisa jadi sia-sia jika Anda melakukan banyak hal.
Secara pribadi, saya akan melakukan keduanya dan memilih untuk membuat pemanggil file pra-dibuka menangani ke konstruktor. Membuat file di dalam kelas menghalangi pemberian penelepon opsi untuk melakukan hal-hal seperti mengatur izin atau, jika menulis ke perangkat, melakukan inisialisasi khusus perangkat. Jika Anda ingin memiliki versi
FooConverter
kelas Anda yang beroperasi pada file dan mengerjakan pekerjaan kasar, bungkuslah dalam aFooFileConverter
.sumber
Secara eksplisit.
Anda ingin memastikan bahwa Anda tidak bergantung pada aturan efek samping yang cerdas yang dapat merusak rilis mendatang atau pada arsitektur yang tidak umum. Tentu saja, Anda harus memiliki file default yang dapat ditimpa pengguna jika mereka mau.
sumber
Selain argumen lain untuk metode eksplisit: Jika Anda melakukan pekerjaan di konstruktor, maka Anda memaksa setiap pengguna kelas Anda untuk melakukan penanganan pengecualian hanya untuk membuat objek. Ini dapat menyebabkan banyak kode boilerplate.
Lihat /programming/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exception untuk diskusi tentang hal itu.
sumber