.NET светлое будующее или могила?

Просмотр 15 сообщений - с 76 по 90 (из 91 всего)
  • Автор
    Сообщения
  • #1928492
    ArchiMage
    Участник

    [quote name='Данилка'] Ты говоришь открывать поток до блока Try-Catch. Но, по моему замыслу, в моей программе все процедуры полностью должны быть заключены в блок Try.[/quote]Ты думаешь, такой замысел верен? Если да, тогда будь добр, проработай обработку ошибок так, чтобы каждая известная ошибка была тобой обработана не только без аварийного завершения программы, но и с точным описанием места и причины, где и почему произошла ошибка. Я так подозреваю, люди, описывавшие генерируемые исключения, котоыре ты ловишь, уже проработали это вопрос. Тебе осталось только ловить нужные и решать, что делать программе или предоставить это право пользователю.[quote name='Данилка'] В случае ошибки номер процедуры и описание ошибки передается в процедуру Errors, где она (ошибка0 и обрабатывается. Благодаря этому в будущем, после сбоев, мне смогут дать лог с ошибками, в которых я сразу увижу конкретное место.[/quote]Я так предполагаю, как только ты начнешь усложнять проект и разделять его на отдельные классы, тебе не поможет никакой величины блок Errors, т.к. реализация многих вещей будет инкасулирована в отдельных классах и блок Errors просто не сможет уже принять решение о том, что делать с той или иной ошибкой. У самого под носом система, спроектированная таким образом – отладка почти невозможна из-за сокрытия причины ошибки.[quote name='Данилка']Но. Если открыть поток вне этого блока, теоретически может произойти необработанное исключение. А именно – ошибка при открытии потока. Например, когда файл уже открыт.Собственно, у меня такая ошибка уже вылезала, именно по этому я и заключил ее в блок Try…[/quote]Что ты должен сделать при ошибке открытия файла? Сообщить пользователю? Ну и пусть этим занимается интерфейс – сообщит необработанное исключение метода, тем более оно достаточно хорошо описано и ты не сможешь автоматически исправить эту ситуацию. А если ошибка произойдет уже при дальнейшей обработке открытого потока, там уж сам Бог велел подумать о двух типах ошибок – обрабатываемых и нет. Отработку нехороших результатов вторых помещай в блок finally, те, что можно обработать – в блок catch, первые поднимай наверх, все равно без толку внутри класса заниматься их анализом. А если так уж охота иметь логи – регистрируй стандартный поток вывода ошибок в файл и не парься с реализацией Errors, а выводи ошибки в поток и либо продолжай, либо прекращай работу при критиках…Так, записки на коленках, остающиеся от проектирования больших систем.

    #1928495
    ArchiMage
    Участник

    [quote name='ArchiMage']Если не открылся – значит в кетче незачем закрывать[/quote]Обрати внимание – незачем, потому что не открылся. Однозначно ты внутри метода не решишь проблему с неоткрыванием файла. Выноси эксепшн вне блока try-catch и обрабатывай его выше (в интерфейсе), например предложением пользователю порешать эту проблему.

    #1928500
    zerkms
    Участник

    ArchiMage:.NET не увлекаюсь и не собираюсь в ближайшее время – просто в связи с одной из твоих фраз назрел вопрос:а как в .NET с TDD??и как в этих фреймворках для тестирования обстоят дела с генерацией моков например? (насколько знаю – в цпп в данном вопросё всё не очень гладко)

    #1928501
    Данилка
    Участник

    Нет, соль не в этом. При необходимости, у меня известные исключения обрабатываются немедленно в специальном блоке Catch (например, там где обрабатывается исключение, когда пользователь не выделил ни одной ветки дерева).Блок Errors придуман мною для того, что бы перехватывать те ошибки, которые могут возникнуть в будущем во время эксплуатации программы. Процедура Errors не призвана принять решение об обработке. Процедура Errors как раз и вызывается, когда приложение не знает, как поступить. Призвание процедуры Errors – это записать описание ошибки и номер процедуры в лог.Например, если произойдет “Арифметик оперейшн оверфлоу” – я в логе увижу и пойму, что не стоило для этой переменной назначать тип данных INT16, надо INT32…

    #1928504
     VaIerik
    Участник

    [quote name='zerkms'] ArchiMage:и как в этих фреймворках для тестирования обстоят дела с генерацией моков например? (насколько знаю – в цпп в данном вопросё всё не очень гладко) [/quote]Например, я пользуюсь TestDriven.NET, там с моками нормально. Хотя не люблю я их, гадов.

    #1928506
    zerkms
    Участник

    IntTDD без моков? хмхм… [smile ;))))]очень интересно [smile ;)] а как вы тогда тестируете взаимодействие различных объектов?(суть The Strategy Pattern и иже с ними)

    #1928507
     VaIerik
    Участник

    Непосредственным взаимодействием различных объектов. Медленно, зато надёжнее. Моки — только в крайних случаях.

    #1928513
    zerkms
    Участник

    Int:понимаю что форум не тематический [smile ;)] однако позволю откомментировать. представляй ситуацию (полностью синтетическая)класс dirLister получает список файлов с фтпшникакласс dirListerAscSortDecorator (декоратор, сортирует список файлов по алфавиту)естественно в dirListerAscSortDecorator передаём через конструктор/метод объект класса dirLister и т.о. декорируем получаемый список файлов.твой подход – для тестирования декоратора поднимать фтп сервак/ коннектиться/ получать реальный список файлов… при том что можно было элегантно сгенерировать мок и радоватьсяда ещё и учти – что при генерации мока ты дополнительно тестируешь взаимодействие тестируемого класса и мока, в то время как при реальных объектов тебе доступны лишь входные/выходные данные, и ошибки, генерируемые РЕАЛЬНЫМ dirLister которые в данном контексте совершенно ничего не значат

    #1928514
    zerkms
    Участник

    [off]форум параноидально порезал длинные слова… чего то длина этих самых “длинных” слов слишком короткаякаламбур однако [smile ;)][/off]

    #1928515
     VaIerik
    Участник

    Я не говорю, что у моков нет своих достоинств. Но у всего есть границы применимости.Данный подход хорош при относительно статическом окружении. Но представь, что ты создал мок, и все тесты отлично проходят, всё быстро и т. д. Потестировал и забыл. А через некоторое время меняется формат инфы, выдаваемой фтпшником. Но ты об этом даже не узнаешь, т. к. тесты с моками будут проходить отлично. А приложение будет падать.И в чём преимущество дополнительного тестирования взаимодействия класса с синтетическим моком? В реальности-то он всё же будет взаимодействовать с реальным объектом.

    #1928516
     VaIerik
    Участник

    [off]А я думал, что кто-то ошибся, а другие его передразнивают, повторяя написание “длинных” слов.Может статический массив? ))[/off]

    #1928518
     VaIerik
    Участник

    [quote name='zerkms']твой подход – для тестирования декоратора поднимать фтп сервак/ коннектиться/ получать реальный список файлов… при том что можно было элегантно сгенерировать мок и радоваться[/quote]Так я ж говорю, в редких случаях приходится моки использовать. Например в таком, наверное, пришлось бы. Про то, как он формат поменяет, я для примера написал.

    #1928521
    zerkms
    Участник

    смысл моков – изолировать тестовый прецедент и тестировать именно тестируемый класс, не отвлекаясь на другие мелочи. если это не так – то это не практика ТДД.к вышеописанному (надуманному но “жизненному примеру”) добавлю – в случае если формат меняется и ты вместо моков используешь реальные объекты – у тебя поломаются сразу 2 набора тестов. поломка декоратора на первый взгляд (по логике) свидетельствует о том, что декоратор работает не так как ожидается, на поверку – работает верно, однако входные данные совсем не те. это как раз ещё более нелогично. это при том – что никто и не обещал что тесты пишутся раз и навсегда – естественно изменения естественно должны затрагивать тесты.а для массовой генерации моков существуют всякие удобные паттерны а-ля The Object Mother Pattern которые тебе помогут во всём приложении подменить моки на нужные изменившиеся. так что подобную практику я бы предположил (назвал?) не совсем точным и оправданным использованием столь интересной и удобной методики (о тдд) – намекаю на микроскоп и гвозди.

    #1928522
     VaIerik
    Участник

    [quote name='zerkms']это при том – что никто и не обещал что тесты пишутся раз и навсегда – естественно изменения естественно должны затрагивать тесты.[/quote]Ну в том-то и дело. Если все изменения затрагивают тесты, вопросов нет. Но вот например я сейчас работаю в проекте, где тестов тысячи, некоторые их них написаны месяцы назад. И практически невозможно предсказать, какие тесты нужно изменить при изменениях в программе (только самые очевидные). Я просто запускаю тесты и мирюсь с тем, что падают лишние, зато неправильные точно не пройдут.А авторегенерацией моков не пользовался, наверное хорошая штука. Но вряд ли она корректно отследит, например, изменения в БД, или, в xslt, которая генерит схожие функции.

    #1929860
    zerkms
    Участник

    http://wiki.agiledev.ru/tdd/proper_mocks_usageв тему последних постов

Просмотр 15 сообщений - с 76 по 90 (из 91 всего)
  • Для ответа в этой теме необходимо авторизоваться.