Конкурс на умение работать с Exception
От: 0K Ниоткуда  
Дата: 17.08.10 11:59
Оценка: 4 (1) -7 :))) :))) :)
В общем, подискутировав немного на тему 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 для продвинутого пользователя (т.е. детали).

Оценивать работы можно здесь: http://rsdn.ru/poll/2663.aspx
Автор: Shmj
Дата: 17.08.10
Вопрос: Детали http://rsdn.ru/forum/dotnet/3922345.flat.aspx


А в голосовании указывайте ник и рядом номер версии. Подавать заявки можно несколько раз (разные версии). Результаты голосования будут доступны 1 сентября.

Победитель получает общественное признание и оценку "супер" всех участников конкурса.

PS
Прошу заметить, что это ни какой-нибудь бессмысленный этюд. Эта задача максимально приближена к реальной жизненной потребности.
=сначала спроси у GPT=
Re: Конкурс на умение работать с Exception
От: GarryIV  
Дата: 17.08.10 12:12
Оценка: 1 (1) +12 -1
Здравствуйте, 0K, Вы писали:

0K>В общем, подискутировав немного на тему Exception'ов -- мое любопытство к теме только увеличилось. К сожалению темы быстро перерождаются во флейм, участники быстро перестают слушать друг-друга.


0K>По этому я решил подойти к вопросу с практической точки зрения: поменьше слов, побольше кода.


0K>Прошу заметить, что это ни какой-нибудь бессмысленный этюд. Эта задача максимально приближена к реальной жизненной потребности.


Во, блин, тебе неймется
WBR, Igor Evgrafov
Re[2]: Конкурс на умение работать с Exception
От: 0K Ниоткуда  
Дата: 17.08.10 12:21
Оценка: :)
Здравствуйте, GarryIV, Вы писали:

GIV>Во, блин, тебе неймется


Кто не согласен -- аргументируйте!

Создал такую практическую тему, т.к. когда говорили абстрактно -- каждый говорил на своей волне.

Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен).
=сначала спроси у GPT=
Re: Подсказка
От: 0K Ниоткуда  
Дата: 17.08.10 12:35
Оценка: :)
Здравствуйте, 0K, Вы писали:

0K>Оставить в виде консольного приложения для упрощения и наглядности.


Всю логику работы целесообразно вынести в отдельный класс, дабы можно было легко изменить тип приложения с консольного на Win или WPF.
=сначала спроси у GPT=
Re[3]: Конкурс на умение работать с Exception
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.08.10 12:41
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, GarryIV, Вы писали:


GIV>>Во, блин, тебе неймется


0K>Кто не согласен -- аргументируйте!


0K>Создал такую практическую тему, т.к. когда говорили абстрактно -- каждый говорил на своей волне.


0K>Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен).

... и бесполезн.

1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями
2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут
Re: Конкурс на умение работать с Exception
От: Neco  
Дата: 17.08.10 12:49
Оценка:
Здравствуйте, 0K, Вы писали:

0K>После запуска программы пользователь должен ввести название счетчика. Программа должна получить текущий номер из файла счетчика, отобразить его пользователю и записать в файл инкремент. Оставить в виде консольного приложения для упрощения и наглядности.

0K>Программа должна быть не демо, а реальной.
доп. вопросы:
1. что ожидается в случае ошибок? повторный ввод, выход из программы с кодом ошибки и т.п.
2. как должен задаваться уровень детализации ошибок? через командную строку, через консоль, через конфиг?

я б в такой программке вообще бы ничего не ловил — пусть себе фигачит портянку с исключением в консоль.
всю ночь не ем, весь день не сплю — устаю
Re[4]: Конкурс на умение работать с Exception
От: 0K Ниоткуда  
Дата: 17.08.10 12:52
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями


И много здесь частных случаев? Приведите несколько примеров, дабы стало понятно, попробую уточнить.

G>2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут


Никто не мешает вам абстрагироваться от файлов. При запуске программы пользователь вводит не имя файла, а имя счетчика. Оно может не совпадать с именем файла.
=сначала спроси у GPT=
Re[2]: Конкурс на умение работать с Exception
От: 0K Ниоткуда  
Дата: 17.08.10 12:59
Оценка:
Здравствуйте, Neco, Вы писали:

N>доп. вопросы:

N>1. что ожидается в случае ошибок? повторный ввод, выход из программы с кодом ошибки и т.п.

Ожидается максимальное удобно для среднестатистического пользователя. Вот ключ. А то попривыкли мозги отключать. А как удобнее -- думайте сами. Конечно, удобнее не закрывать программу а дать возможность ввести правильные данные.

Не забывайте, хороший код можно использовать повторно (к примеру в Win-приложении).

N>2. как должен задаваться уровень детализации ошибок? через командную строку, через консоль, через конфиг?


Это не принципиально. Для простоты можно выводить 2 строчки. В Win-приложении детали можно было бы скрывать и отображать по нажатию на кнопку. В консоли можно просто 2 строчки: одна простая, другая с техническими деталями.

N>я б в такой программке вообще бы ничего не ловил — пусть себе фигачит портянку с исключением в консоль.


1. Ее будут использовать и совсем неопытные пользователи?
2. Нужен код, который легко перенести в Win/WPF-приложение.
=сначала спроси у GPT=
Re[4]: Конкурс на умение работать с Exception
От: Dog  
Дата: 17.08.10 12:59
Оценка:
0K>>Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен).
G>... и бесполезн.
G>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями
G>2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут
KISS
Re[5]: Конкурс на умение работать с Exception
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.08.10 13:01
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, gandjustas, Вы писали:


G>>1)Ты не указал юзкейсы для этого кода, а значит его можно бесконечно усложнять всякими частными случаями


0K>И много здесь частных случаев? Приведите несколько примеров, дабы стало понятно, попробую уточнить.


1)Нету файла
2)Нету каталога
3)Неверные символы в пути
4)Нету доступа на чтение к файлу
5)Нету доступа на запись к файлу
6)Нету доступа на запись в каталог при создании файла
7)Формат пути при вводе (тысячи их)
8)В файле записано не число
9)Целочисленное переполнение

Это далеко не полный перечень.

G>>2)Для такой задачи работа с файлами — неверный уровень абстракции. Подробнее тут


0K>Никто не мешает вам абстрагироваться от файлов. При запуске программы пользователь вводит не имя файла, а имя счетчика. Оно может не совпадать с именем файла.

Прекрасно, тогда я буду использовать Settings и код станет до смешного простым.
Re[3]: Конкурс на умение работать с Exception
От: Dog  
Дата: 17.08.10 13:02
Оценка: :)
N>>я б в такой программке вообще бы ничего не ловил — пусть себе фигачит портянку с исключением в консоль.
0K>1. Ее будут использовать и совсем неопытные пользователи?
0K>2. Нужен код, который легко перенести в Win/WPF-приложение.
Я так чувствую, что сообщению к 100 требования вырисуются, а пока можно даже не читать
Re[6]: Конкурс на умение работать с Exception
От: 0K Ниоткуда  
Дата: 17.08.10 13:15
Оценка:
Здравствуйте, 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 и код станет до смешного простым.

Не для этой задачи (демонстрация работы с исключениями). Попробуйте написать самостоятельно.
=сначала спроси у GPT=
Re: Конкурс на умение работать с Exception
От: мыщъх США http://nezumi-lab.org
Дата: 17.08.10 13:21
Оценка: +1
Здравствуйте, 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.
Re[7]: Конкурс на умение работать с Exception
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.08.10 13:33
Оценка: +1
Здравствуйте, 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 как раз самый адекватный инструмент.
Re[2]: Конкурс на умение работать с Exception
От: 0K Ниоткуда  
Дата: 17.08.10 13:38
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>давайте все-таки согласимся, что механизм исключений, решая одни проблемы, порождает другие. серебрянной пули нет, увы.


Вы же вроде бы на C пишите? Там вообще нет исключений -- только коды возврата. Так что о чем речь
=сначала спроси у GPT=
Re: Конкурс на умение работать с Exception
От: LF  
Дата: 17.08.10 13:39
Оценка: 16 (2)
От нечего делать написал, пинайте
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var w = new Worker();
            w.Error += w_Error;
            w.Info += w_Info;
            w.Run();
            Console.ReadKey();
        }

        static void w_Info(string obj)
        {
            Console.WriteLine(obj);
        }

        static void w_Error(string obj)
        {
            var oldColor = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(obj);
            Console.ForegroundColor = oldColor;
        }
    }

    public class Worker
    {
        public event Action<string> Error = delegate { };

        public event Action<string> Info = delegate { };

        public void Run()
        {
            try
            {
                InternalRun();
            }
            catch (Exception ex)
            {
                WriteToLog(ex);
                Error(string.Format("Упс, не предвиденная ошибка: {0}. Обратитесь в службу поддержки.", ex.Message));
            }
        }

        protected void WriteToFile(string fileName, int count)
        {
            if (!CheckAccessForFile(fileName, FileIOPermissionAccess.Write))
            {
                Info("Запись в файл не возможна.");
                return;
            }
            File.WriteAllText(fileName, count.ToString());
        }

        protected virtual string ReadFileName()
        {
            Console.WriteLine("Введите имя счетчика и нажмите ENTER:");

            var fileName = Console.ReadLine();
            return Path.Combine(Environment.CurrentDirectory, fileName + "");
        }

        private void InternalRun()
        {
            bool goodFile;
            string fileName;
            do
            {
                goodFile = true;
                fileName = ReadFileName();
                if (!FileNameIsCorrect(fileName))
                {
                    Info("Имя файла не корректно, повторите ввод.");
                    goodFile = false;
                    continue;
                }

                if (!File.Exists(fileName))
                {
                    var fs =File.Create(fileName);
                    fs.Close();
                }

                if (!CheckAccessForFile(fileName, FileIOPermissionAccess.Read))
                {
                    Info("Прочитать файл невозможно.");
                    goodFile = false;
                    continue;
                }
            } while (!goodFile);

            var text = File.ReadAllText(fileName);

            int count;
            if (!int.TryParse(text, out count))
            {
                Info("Счет записан не корректно. Значение выставлено в 0");
                count = 0;
            }

            Info(string.Format("Значение счетчика: {0}", count));

            count++;

            WriteToFile(fileName, count);
        }

        private static bool CheckAccessForFile(string fileName, FileIOPermissionAccess fileIoPermissionAccess)
        {
            var f2 = new FileIOPermission(fileIoPermissionAccess, fileName);
            var bOk = true;
            try
            {
                f2.Demand();
            }
            catch (SecurityException)
            {
                bOk = false;
            }
            return bOk;
        }

        private static void WriteToLog(Exception exception)
        {
            //Console.WriteLine(exception.ToString());
        }

        private static bool FileNameIsCorrect(string fileName)
        {
            var bOk = false;
            try
            {
                new FileInfo(fileName);
                bOk = true;
            }
            catch (ArgumentException)
            {
            }
            catch (PathTooLongException)
            {
            }
            catch (NotSupportedException)
            {
            }
            return bOk;
        }
    }
}
Re[8]: Конкурс на умение работать с Exception
От: 0K Ниоткуда  
Дата: 17.08.10 13:45
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Код твой неадекватен просто потому что нету задач для которых он используется. То есть его можно банально не писать.


Понятно, что кое-что пришлось упростить для наглядности. Установить некие рамки: использовать именно работу с файлами и прямую запись данных в файл. Можно усложнить так, чтобы Settings было использовать не выгодно -- но потеряется наглядность.
=сначала спроси у GPT=
Re[3]: Конкурс на умение работать с Exception
От: microcod США www.tehnoromantik.net
Дата: 17.08.10 13:50
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, GarryIV, Вы писали:


GIV>>Во, блин, тебе неймется


0K>Кто не согласен -- аргументируйте!


0K>Создал такую практическую тему, т.к. когда говорили абстрактно -- каждый говорил на своей волне.


0K>Тема нужная. На самом деле если все-таки найдутся смельчаки и приведут практические примеры (я лично планирую поучаствовать) -- вы увидите как раздуется этот простейший код (и насколько он на самом деле сложен).


Вот как у спецов.



Файл вполне доступен, только видимо слишком большой для программы. Ничего не "разжёвывается".
Программа — мысли спрессованные в код.
Re[9]: Конкурс на умение работать с Exception
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.08.10 13:59
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, gandjustas, Вы писали:


G>>Код твой неадекватен просто потому что нету задач для которых он используется. То есть его можно банально не писать.


0K>Понятно, что кое-что пришлось упростить для наглядности.

Ты все равно ничего не сказал о задачах, решаемых кодом.

0K>Установить некие рамки: использовать именно работу с файлами и прямую запись данных в файл.

А это как раз детали реализации, мешающие другим писать.

0K>Можно усложнить так, чтобы Settings было использовать не выгодно -- но потеряется наглядность.

Да не надо усложнять, просто приведи описание задачи, а не код, который её якобы решает. Код тебе тут напишут моментально.
Re[2]: Конкурс на умение работать с Exception
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.08.10 14:29
Оценка:
Здравствуйте, LF, Вы писали:

LF>От нечего делать написал, пинайте

1)WriteToFile не выкидывает эксепшн в случае неудачи
2)Не проверяется ACL, а только разрешения CAS
3)Не обрабатываются абсолютные пути
4)Не обрабатывается отсутствие каталога

И еще много всего.

ЗЫ. Не тот уровень абстракции, чтобы такие задачи решать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.