Pertanyaan 1:
Apakah karena mengembalikan StreamReader (nama file) baru; di dalam for loop? atau fakta bahwa Anda tidak memerlukan loop for dalam kasus ini?
Streamreader tidak ada hubungannya dengan itu. Anti-pola muncul karena konflik niat yang jelas antara foreach
dan if
:
Apa tujuan dari foreach
?
Saya berasumsi jawaban Anda akan seperti: "Saya ingin berulang kali mengeksekusi kode tertentu"
Berapa banyak file yang Anda harapkan diproses?
Karena Anda hanya dapat memiliki satu nama file tertentu (termasuk ekstensi) di folder tertentu, ini membuktikan bahwa kode Anda dimaksudkan untuk menemukan satu file yang berlaku.
Ini juga dikonfirmasi oleh fakta bahwa Anda segera mengembalikan nilai. Anda sebenarnya tidak peduli dengan pertandingan kedua, bahkan jika itu ada.
Ada situasi di mana ini bukan anti-pola.
- Jika Anda juga mencari di subdirektori (
Directory.GetFiles(".", SearchOption.AllDirectories)
), maka dimungkinkan untuk menemukan lebih dari satu file dengan nama file yang sama (termasuk ekstensi)
- Jika Anda mencari kecocokan sebagian nama file (mis. Setiap file yang namanya dimulai dengan
"Test_"
, atau setiap "*.zip"
file.
Perhatikan bahwa kedua kasus ini mengharuskan Anda untuk benar-benar memproses beberapa pertandingan dan karenanya tidak segera mengembalikan nilai.
Pertanyaan 2:
Untuk memperbaiki contoh kedua, apakah Anda akan menulis ulang tanpa pernyataan if, dan alih-alih mengelilingi StreamReader dengan blok coba-tangkap, dan jika melempar FileNotFoundException Anda menanganinya di blok tangkap sesuai?
Pengecualian itu mahal. Mereka tidak boleh digunakan sebagai pengganti logika aliran yang tepat. Pengecualian, seperti namanya menunjukkan keadaan luar biasa .
Karena alasan itu, Anda tidak boleh menghapus if
.
Sesuai jawaban ini di SoftwareEngineering.SE :
Secara umum, penggunaan pengecualian untuk aliran kontrol adalah anti-pola, dengan pengecualian batuk khusus situasi dan bahasa.
Sebagai ringkasan singkat mengapa, pada umumnya, ini merupakan anti-pola:
- Pengecualian pada dasarnya adalah pernyataan GOTO yang canggih
- Pemrograman dengan pengecualian, oleh karena itu, menyebabkan lebih sulit untuk membaca, dan memahami kode
- Sebagian besar bahasa memiliki struktur kontrol yang dirancang untuk menyelesaikan masalah Anda tanpa menggunakan pengecualian
- Argumen untuk efisiensi cenderung diperdebatkan untuk kompiler modern, yang cenderung untuk mengoptimalkan dengan asumsi bahwa pengecualian tidak digunakan untuk aliran kontrol.
Baca diskusi di wiki Ward untuk informasi lebih mendalam.
Apakah Anda perlu membungkus ini dalam percobaan / tangkapan, sangat tergantung pada situasi Anda:
- Seberapa besar kemungkinan Anda akan menghadapi kondisi balapan?
- Apakah Anda benar-benar dapat menangani situasi ini, atau Anda ingin masalah ini meluap kepada pengguna karena Anda tidak tahu bagaimana menanganinya.
Tidak ada yang pernah menjadi masalah "selalu gunakan itu". Untuk membuktikan maksud saya:
Studi terpisah telah membuktikan bahwa Anda tidak akan terluka saat mengenakan helm pengaman, kacamata keselamatan, dan rompi anti peluru.
Jadi mengapa kita tidak memakai peralatan keselamatan ini setiap saat?
Jawaban sederhana adalah karena ada kekurangan untuk memakainya:
- Membutuhkan uang
- Itu membuat gerakan Anda lebih rumit
- Bisa jadi cukup hangat untuk memakainya.
Sekarang kita berada di suatu tempat: ada pro dan kontra . Dengan kata lain, masuk akal untuk memakai peralatan ini dalam kasus di mana pro lebih besar daripada kontra.
- Pekerja konstruksi jauh lebih mungkin menderita cedera selama pekerjaan mereka. Mereka mendapat manfaat dari helm pengaman.
- Pekerja kantor, di sisi lain, memiliki peluang yang jauh lebih rendah untuk mengalami cedera. Helm pengaman tidak sepadan.
- Seorang anggota tim SWAT lebih mungkin untuk tertembak, dibandingkan dengan pekerja kantor.
Haruskah Anda membungkus panggilan dengan mencoba / menangkap? Itu sangat tergantung pada apakah manfaat melakukan itu lebih besar daripada biaya pelaksanaannya.
Perhatikan bahwa orang lain mungkin berpendapat bahwa hanya perlu beberapa penekanan tombol untuk membungkusnya, jadi itu jelas harus dilakukan. Tapi itu bukan keseluruhan argumen:
- Anda perlu memutuskan apa yang harus dilakukan setelah Anda menangkap pengecualian.
- Jika ada banyak panggilan berbeda ke file yang berbeda di seluruh basis kode, memutuskan untuk membungkus satu dalam percobaan / tangkapan umumnya akan berarti bahwa Anda harus membungkus semua kasus ini. Ini dapat memiliki efek dramatis pada jumlah upaya yang diperlukan untuk mengimplementasikannya.
- Ini sangat mungkin bahwa Anda sengaja ingin tidak menangani pengecualian.
- Perhatikan bahwa aplikasi Anda harus menangani pengecualian di beberapa titik, tetapi itu tidak harus segera setelah pengecualian itu muncul.
Jadi pilihan ada di tangan Anda. Apakah ada manfaatnya? Apakah Anda pikir itu meningkatkan aplikasi, lebih dari upaya biaya untuk mengimplementasikannya?
Pembaruan - Dari komentar yang saya tulis ke jawaban lain, karena saya pikir itu juga merupakan pertimbangan yang relevan untuk Anda:
Ini sangat bergantung pada konteks sekitarnya.
- Jika pembukaan streamreader didahului oleh
if(!File.Exists) File.Create()
, maka tidak adanya file saat membuka streamreader memang luar biasa .
- Jika nama file dipilih dari daftar file yang ada, ketiadaan tiba-tiba sekali lagi luar biasa .
- Jika Anda bekerja dengan string yang belum benar-benar diuji terhadap direktori; maka tidak adanya file adalah hasil yang sangat logis, dan karena itu tidak luar biasa .