В общем, подискутировав немного на тему Exception'ов -- мое любопытство к теме только увеличилось. К сожалению темы быстро перерождаются во флейм, участники быстро перестают слушать друг-друга.
По этому я решил подойти к вопросу с практической точки зрения: поменьше слов, побольше кода.
И придумал вот такой максимально простой тест (буквально 7 строчек кода внутри функции) для выявления человека, который действительно лучше всех умеет работать с исключениями. Не на словах а на деле. Вот сам код:
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите имя счетчика и нажмите ENTER:");
string fileName = Console.ReadLine();
// Если файла не существует -- нужно создать.
// Может не быть доступа к файлу
// Имя счетчика может быть некорректным -- с этим что-то нужно сделатьstring text = File.ReadAllText(fileName);
int count = int.Parse(text);
Console.WriteLine("Значение счетчика: ", count);
count++;
// Может быть запрещена запись в файл
File.WriteAllText(fileName, count.ToString());
}
}
}
После запуска программы пользователь должен ввести название счетчика. Программа должна получить текущий номер из файла счетчика, отобразить его пользователю и записать в файл инкремент. Оставить в виде консольного приложения для упрощения и наглядности.
Программа должна быть не демо, а реальной. Т.е. считайте что вы пишите реальный проект, которым будут пользоваться тысячи людей. Все должно быть реальным, без всяких упрощений. Единственное что можно упростить для наглядности -- работу с ресурсами -- т.к. файл ресурсов не очень читабелен -- можно заменить его на класс C# с публичными полями.
Язык интерфейса можно использовать либо русский либо английский. Сообщения должны быть 2-х уровней: 1 для неопытного пользователя и 1 для продвинутого пользователя (т.е. детали).
А в голосовании указывайте ник и рядом номер версии. Подавать заявки можно несколько раз (разные версии). Результаты голосования будут доступны 1 сентября.
Победитель получает общественное признание и оценку "супер" всех участников конкурса.
PS
Прошу заметить, что это ни какой-нибудь бессмысленный этюд. Эта задача максимально приближена к реальной жизненной потребности.
Здравствуйте, 0K, Вы писали:
0K>В общем, подискутировав немного на тему Exception'ов -- мое любопытство к теме только увеличилось. К сожалению темы быстро перерождаются во флейм, участники быстро перестают слушать друг-друга.
0K>По этому я решил подойти к вопросу с практической точки зрения: поменьше слов, побольше кода.
0K>Прошу заметить, что это ни какой-нибудь бессмысленный этюд. Эта задача максимально приближена к реальной жизненной потребности.
Здравствуйте, GarryIV, Вы писали:
GIV>Во, блин, тебе неймется
Кто не согласен -- аргументируйте!
Создал такую практическую тему, т.к. когда говорили абстрактно -- каждый говорил на своей волне.
Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен).
Здравствуйте, 0K, Вы писали:
0K>Здравствуйте, GarryIV, Вы писали:
GIV>>Во, блин, тебе неймется
0K>Кто не согласен -- аргументируйте!
0K>Создал такую практическую тему, т.к. когда говорили абстрактно -- каждый говорил на своей волне.
0K>Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен).
... и бесполезн.
1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями
2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут
Здравствуйте, 0K, Вы писали:
0K>После запуска программы пользователь должен ввести название счетчика. Программа должна получить текущий номер из файла счетчика, отобразить его пользователю и записать в файл инкремент. Оставить в виде консольного приложения для упрощения и наглядности. 0K>Программа должна быть не демо, а реальной.
доп. вопросы:
1. что ожидается в случае ошибок? повторный ввод, выход из программы с кодом ошибки и т.п.
2. как должен задаваться уровень детализации ошибок? через командную строку, через консоль, через конфиг?
я б в такой программке вообще бы ничего не ловил — пусть себе фигачит портянку с исключением в консоль.
Здравствуйте, gandjustas, Вы писали:
G>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями
И много здесь частных случаев? Приведите несколько примеров, дабы стало понятно, попробую уточнить.
G>2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут
Никто не мешает вам абстрагироваться от файлов. При запуске программы пользователь вводит не имя файла, а имя счетчика. Оно может не совпадать с именем файла.
Здравствуйте, Neco, Вы писали:
N>доп. вопросы: N>1. что ожидается в случае ошибок? повторный ввод, выход из программы с кодом ошибки и т.п.
Ожидается максимальное удобно для среднестатистического пользователя. Вот ключ. А то попривыкли мозги отключать. А как удобнее -- думайте сами. Конечно, удобнее не закрывать программу а дать возможность ввести правильные данные.
Не забывайте, хороший код можно использовать повторно (к примеру в Win-приложении).
N>2. как должен задаваться уровень детализации ошибок? через командную строку, через консоль, через конфиг?
Это не принципиально. Для простоты можно выводить 2 строчки. В Win-приложении детали можно было бы скрывать и отображать по нажатию на кнопку. В консоли можно просто 2 строчки: одна простая, другая с техническими деталями.
N>я б в такой программке вообще бы ничего не ловил — пусть себе фигачит портянку с исключением в консоль.
1. Ее будут использовать и совсем неопытные пользователи?
2. Нужен код, который легко перенести в Win/WPF-приложение.
0K>>Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен). G>... и бесполезн. G>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями G>2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут
KISS
Здравствуйте, 0K, Вы писали:
0K>Здравствуйте, gandjustas, Вы писали:
G>>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями
0K>И много здесь частных случаев? Приведите несколько примеров, дабы стало понятно, попробую уточнить.
1)Нету файла
2)Нету каталога
3)Неверные символы в пути
4)Нету доступа на чтение к файлу
5)Нету доступа на запись к файлу
6)Нету доступа на запись в каталог при создании файла
7)Формат пути при вводе (тысячи их)
8)В файле записано не число
9)Целочисленное переполнение
Это далеко не полный перечень.
G>>2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут
0K>Никто не мешает вам абстрагироваться от файлов. При запуске программы пользователь вводит не имя файла, а имя счетчика. Оно может не совпадать с именем файла.
Прекрасно, тогда я буду использовать Settings и код станет до смешного простым.
N>>я б в такой программке вообще бы ничего не ловил — пусть себе фигачит портянку с исключением в консоль. 0K>1. Ее будут использовать и совсем неопытные пользователи? 0K>2. Нужен код, который легко перенести в Win/WPF-приложение.
Я так чувствую, что сообщению к 100 требования вырисуются, а пока можно даже не читать
Здравствуйте, gandjustas, Вы писали:
G>>>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями
0K>>И много здесь частных случаев? Приведите несколько примеров, дабы стало понятно, попробую уточнить.
Понятно. Вы кодер, который реальные задачи не решает. Вот если все по полочкам распишут, разжуют -- тогда смогу накодить чего-нибудь. Здесь задачка чуть сложнее: не только кодинг но и подумать нужно. Вероятно такие решает ваш босс.
Воспринимайте это как реальную жизненную задачу. Пользователь ввел имя счетчика, получил значение. В следующий раз, Когда он введет имя счетчика значение будет на 1 больше. Вот и все. Как вы реализуете детали -- ваше дело. Ключ -- для разных групп пользователей программа должна быть удобна.
G>1)Нету файла G>2)Нету каталога
Там написано: нужно создать.
G>3)Неверные символы в пути
Каком пути? Пользователь вводит не путь а имя счетчика. Имя счетчика может быть любым (или можно ограничить -- как вам удобнее).
G>4)Нету доступа на чтение к файлу G>5)Нету доступа на запись к файлу G>6)Нету доступа на запись в каталог при создании файла G>7)Формат пути при вводе (тысячи их)
Там все указано. Эти ошибки нужно обработать. Как -- ваше дело. Ключ -- удобно для пользователя (для двух групп пользователей: продвинутых и не очень).
G>8)В файле записано не число G>9)Целочисленное переполнение
Думайте о пользователе. Кто об этом должен думать?
G>Это далеко не полный перечень.
Обо всех этих деталях думайте сами. А самую удобную программу мы выберем.
0K>>Никто не мешает вам абстрагироваться от файлов. При запуске программы пользователь вводит не имя файла, а имя счетчика. Оно может не совпадать с именем файла. G>Прекрасно, тогда я буду использовать Settings и код станет до смешного простым.
Не для этой задачи (демонстрация работы с исключениями). Попробуйте написать самостоятельно.
Здравствуйте, 0K, Вы писали:
0K>По этому я решил подойти к вопросу с практической точки зрения: поменьше слов, побольше кода.
0K>И придумал вот такой максимально простой тест
...месье грозился "побольше кода", а в последнюю минуту струсил и поскипал весь код, оставив одни комментарии (левые), причем сам код к исключениям никакого отношения не имеет, потому как по хорошему 99% уйдет на тупую обработку ошибок и только 1% на механизмы сигнализации о том, что случился косяк, что нивилирует всю разницу как именно кричать о том, что у нас что-то не так.
да и потом, что может решить такой тест, даже если он корректный? допустим, механизм А делает код более наглядным, но создает прооблемы переносимости. Допустим, механизм Б делает код понятным и менее захламленным второстепенными деталаями обработки ошибок, которые вынесены совсем в другое пространство. хорошо ли это? да, хорошо, поскольку легко въехать в суть программы. нет, плохо, потому как если нужно проверить насколько корректно выполнена обработка ошибок, тут черт ногу сломит...
давайте все-таки согласимся, что механизм исключений, решая одни проблемы, порождает другие. серебрянной пули нет, увы.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, 0K, Вы писали:
0K>Здравствуйте, gandjustas, Вы писали:
G>>>>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями
0K>>>И много здесь частных случаев? Приведите несколько примеров, дабы стало понятно, попробую уточнить.
0K>Понятно. Вы кодер, который реальные задачи не решает. Вот если все по полочкам распишут, разжуют -- тогда смогу накодить чего-нибудь. Здесь задачка чуть сложнее: не только кодинг но и подумать нужно. Вероятно такие решает ваш босс.
Да не, я вообще-то ИП и у меня несколько работников
0K>Воспринимайте это как реальную жизненную задачу. Пользователь ввел имя счетчика, получил значение. В следующий раз, Когда он введет имя счетчика значение будет на 1 больше. Вот и все. Как вы реализуете детали -- ваше дело. Ключ -- для разных групп пользователей программа должна быть удобна.
G>>1)Нету файла G>>2)Нету каталога
0K>Там написано: нужно создать.
G>>3)Неверные символы в пути
0K>Каком пути? Пользователь вводит не путь а имя счетчика. Имя счетчика может быть любым (или можно ограничить -- как вам удобнее).
G>>4)Нету доступа на чтение к файлу G>>5)Нету доступа на запись к файлу G>>6)Нету доступа на запись в каталог при создании файла G>>7)Формат пути при вводе (тысячи их)
0K>Там все указано. Эти ошибки нужно обработать. Как -- ваше дело. Ключ -- удобно для пользователя (для двух групп пользователей: продвинутых и не очень).
G>>8)В файле записано не число G>>9)Целочисленное переполнение
0K>Думайте о пользователе. Кто об этом должен думать?
G>>Это далеко не полный перечень.
0K>Обо всех этих деталях думайте сами. А самую удобную программу мы выберем.
Так ты тогда приведи юзкейсы, а не код. Код тут кто угодно быстро нарисует.
0K>>>Никто не мешает вам абстрагироваться от файлов. При запуске программы пользователь вводит не имя файла, а имя счетчика. Оно может не совпадать с именем файла. G>>Прекрасно, тогда я буду использовать Settings и код станет до смешного простым.
0K>Не для этой задачи (демонстрация работы с исключениями). Попробуйте написать самостоятельно.
Ну вот весь разговор и слился. Ты привел неадекватный код и пытаешься заставить других с этим кодом работать.
Код твой неадекватен просто потому что нету задач для которых он используется. То есть его можно банально не писать.
Если же взять простую задачу: "при каждом запуске программы выводить текущее значение счетчика и увеличивать его на единицу, значение счетчика по-умолчанию принять за 0", то Settings как раз самый адекватный инструмент.
Здравствуйте, мыщъх, Вы писали:
М>давайте все-таки согласимся, что механизм исключений, решая одни проблемы, порождает другие. серебрянной пули нет, увы.
Вы же вроде бы на C пишите? Там вообще нет исключений -- только коды возврата. Так что о чем речь
Здравствуйте, gandjustas, Вы писали:
G>Код твой неадекватен просто потому что нету задач для которых он используется. То есть его можно банально не писать.
Понятно, что кое-что пришлось упростить для наглядности. Установить некие рамки: использовать именно работу с файлами и прямую запись данных в файл. Можно усложнить так, чтобы Settings было использовать не выгодно -- но потеряется наглядность.
Здравствуйте, 0K, Вы писали:
0K>Здравствуйте, GarryIV, Вы писали:
GIV>>Во, блин, тебе неймется
0K>Кто не согласен -- аргументируйте!
0K>Создал такую практическую тему, т.к. когда говорили абстрактно -- каждый говорил на своей волне.
0K>Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен).
Вот как у спецов.
Файл вполне доступен, только видимо слишком большой для программы. Ничего не "разжёвывается".
Здравствуйте, 0K, Вы писали:
0K>Здравствуйте, gandjustas, Вы писали:
G>>Код твой неадекватен просто потому что нету задач для которых он используется. То есть его можно банально не писать.
0K>Понятно, что кое-что пришлось упростить для наглядности.
Ты все равно ничего не сказал о задачах, решаемых кодом.
0K>Установить некие рамки: использовать именно работу с файлами и прямую запись данных в файл.
А это как раз детали реализации, мешающие другим писать.
0K>Можно усложнить так, чтобы Settings было использовать не выгодно -- но потеряется наглядность.
Да не надо усложнять, просто приведи описание задачи, а не код, который её якобы решает. Код тебе тут напишут моментально.
Здравствуйте, LF, Вы писали:
LF>От нечего делать написал, пинайте
1)WriteToFile не выкидывает эксепшн в случае неудачи
2)Не проверяется ACL, а только разрешения CAS
3)Не обрабатываются абсолютные пути
4)Не обрабатывается отсутствие каталога
И еще много всего.
ЗЫ. Не тот уровень абстракции, чтобы такие задачи решать.