Питання 1:
Це через повернення нового StreamReader (ім'я файлу); всередині циклу for? чи той факт, що вам не потрібна петля в цьому випадку?
Потоковий читач не має нічого спільного. Анти-модель з'являється через явний конфлікт намірів між foreachта if:
Яка мета роботи foreach?
Я припускаю, що ваша відповідь буде чимось на кшталт: "Я хочу неодноразово виконувати певний фрагмент коду"
Скільки файлів ви очікуєте обробити?
Оскільки у певній папці ви можете мати лише одне конкретне ім’я файлу (включаючи розширення), це доводить, що ваш код призначений для пошуку одного застосовного файлу.
Це також підтверджується тим, що ви повертаєте значення негайно. Вас насправді не хвилює другий матч, навіть якщо він би існував.
Є ситуації, коли це не є антидіаграмою.
- Якщо ви також шукаєте в підкаталогах (
Directory.GetFiles(".", SearchOption.AllDirectories)), то можна знайти більше одного файлу з однаковим іменем файлу (включаючи розширення)
- Якщо ви шукаєте часткові збіги імен файлів (наприклад, кожен файл, ім'я якого починається з
"Test_"або кожен "*.zip"файл).
Зауважте, що обидва ці випадки вимагають від вас фактичної обробки декількох збігів, і тому не повертаєте значення одразу.
Питання 2:
Щоб виправити другий приклад, чи можете ви повторно записати його без оператора if, а замість цього оточити StreamReader блоком спробу-лову, і якщо він кидає FileNotFoundException, ви відповідно обробляєте його в блоці захоплення?
Винятки дорогі. Вони ніколи не повинні використовуватися замість правильної логіки потоку. Винятки становлять, як їх назва говорить про виняткові обставини.
З цієї причини не слід видаляти if.
Відповідно до цієї відповіді на SoftwareEngineering.SE :
Як правило, використання винятків для контрольного потоку є анти-схемою, з помітними ситуаціями та мовою, що стосуються винятків кашлю від кашлю.
Як короткий підсумок, чому, як правило, це анти-шаблон:
- Виняток - це, по суті, складні заяви GOTO
- Програмування з винятками, таким чином, призводить до більш важкого для читання та розуміння коду
- Більшість мов мають існуючі структури управління, розроблені для вирішення ваших проблем без використання винятків
- Аргументи ефективності, як правило, суперечать сучасним компіляторам, які, як правило, оптимізуються з припущенням, що виключення не використовуються для управління потоком.
Прочитайте дискусію на Вікі Уорда, щоб отримати більш детальну інформацію.
Від того, чи потрібно вам це робити, намагайтеся впіймати, дуже залежить від вашої ситуації:
- Наскільки ймовірно, що ви збираєтеся зіткнутися з умовою гонки?
- Чи справді ви в змозі впоратися з цією ситуацією, чи ви хочете, щоб ця проблема передавалася користувачеві, оскільки ви не знаєте, як з цим впоратися.
Ніколи не є питанням "завжди користуйся цим". Щоб довести свою думку:
Окремі дослідження довели, що ви рідше травмуєтесь, якщо одягнете захисний шолом, захисні окуляри та бронежилети.
То чому ми всі не носимо це обладнання безпеки?
Проста відповідь полягає в тому, що є їх недоліки:
- Це коштує грошей
- Це робить ваш рух більш громіздким
- Його можна носити досить тепло.
Зараз ми кудись дістаємося: є плюси і мінуси . Іншими словами, носити це обладнання має сенс лише у випадках, коли професіонал переважає проти мінусів.
- Будівельні працівники набагато частіше зазнають травм під час роботи. Їм користується захисний шолом.
- З іншого боку, офісні працівники мають набагато менший шанс отримати травму. Шоломи безпеки не варто.
- Член команди SWAT набагато більше шансів отримати постріл, порівняно з офісним працівником.
Чи слід завершити виклик у спробі / ловінні? Це дуже залежить від того, чи переваги від цього перевищують витрати на його реалізацію.
Зауважте, що інші можуть стверджувати, що для її завершення потрібно лише кілька натискань клавіш, тому це очевидно слід зробити. Але це ще не весь аргумент:
- Вам потрібно вирішити, що робити, як тільки ви зловите виняток.
- Якщо по всій кодовій базі багато різних дзвінків до різних файлів, вирішення обгортати один із них, як правило, означає, що вам доведеться завершити всі ці випадки. Це може мати неабиякий вплив на кількість зусиль, необхідних для його здійснення.
- Цілком можливо, що ви навмисно хочете не обробляти виняток.
- Зауважте, що ваша програма повинна буде обробляти виняток в якийсь момент, але це не обов'язково одразу після того, як виняток було порушено.
Тож вибір за вами. Чи є користь від цього? Ви вважаєте, що це покращує додаток, а не витрачає зусилля на його реалізацію?
Оновлення - від коментаря, який я написав до іншої відповіді, оскільки я вважаю, що це також є важливим для вас:
Це дуже залежить від навколишнього контексту.
- Якщо відкриттю потокового читача передує
if(!File.Exists) File.Create(), то відсутність файлу при відкритті потокового читання дійсно є винятковою .
- Якщо ім'я файлу було вибрано зі списку існуючих файлів, його раптова відсутність знову є винятковою .
- Якщо ви працюєте з рядком, який ви ще фактично не перевіряли щодо каталогу; то відсутність файлу - цілком логічний результат, а отже, не винятковий .