Haruskah pembuatan objek secara implisit atau eksplisit membuat file?

9

Saya membuat objek yang tujuan utamanya adalah membaca dalam file dari satu format dan membuat yang lain dari format yang berbeda.

Apakah yang terbaik untuk membuat file output secara implisit selama inisialisasi objek atau memiliki metode publik yang memberikan pengguna pilihan ketika file ini akan dibuat?

PDStat
sumber

Jawaban:

12

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);
Maks
sumber
1
Ini bagus. Pilihan lain yang serupa adalah hanya mengimplementasikan objek yang mengimplementasikan aliran apa pun yang dimiliki aplikasi dan memperlakukannya seperti yang Anda lakukan pada aliran lainnya.
Steven Evers
3

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 FooConverterkelas Anda yang beroperasi pada file dan mengerjakan pekerjaan kasar, bungkuslah dalam a FooFileConverter.

Blrfl
sumber
2

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.

Sardathrion - menentang penyalahgunaan SE
sumber