Re[8]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.10.08 08:30
Оценка: 16 (2) +5
Здравствуйте, ironwit, Вы писали:

AVK>>И если этот метод использует хоть DateTime.Now, хоть TimeService — проектировщика расстрэлять.


I>почему?


Потому что и то и другое увеличивает увязанность кода на контекст без особой на то необходимости. К примеру, если нам понадобится рассчитать возраст задним числом, в обеи вариантах будет приплызд. Разве что, теоретически, можно сделать специальный TimeService, но, согласись, выглядеть сие будет ну совсем уж черти как.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[15]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.10.08 15:21
Оценка: +4 -1
Здравствуйте, Sshur, Вы писали:

S>Ну это уже тема для холивара на тему использовать ли TDD, или нет.


Опять ты чего то за меня додумываешь. Я совсем не против TDD, я против бездумного сувания ее во все дыры. А то наворотят вот такого юноши с горящими глазами, а когда пытаешься объяснить, что тыдыда тыдыдой, а голову никто не отменял, начинается цитирование лозунгов и отсылание к книжкам учится Истине.

S> В данном случае, имхо, написание тестов оправдано.


В данном, если речь именно про то, что в блоге — нет.

S> Тут чрезмерное усложнение дизайна наверно меньшее зло, чем как попало написанный код и без тестов.


Наоборот — намного большее. Тесты — не панацея. Еще раз. Тесты — не панацея. А излишне запутанный и усложненный дизайн — это самое плохое, что может случится с кодом. Все остальное поправимо. Даже тупой копипейст без каких либо намеков дизайна и полное отсутствие модульных тестов — намного лучше.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re: То ли лыжи не едут ...
От: Константин Л. Франция  
Дата: 28.10.08 12:15
Оценка: -2 :))
Здравствуйте, AndrewVK, Вы писали:

AVK>Наткнулся тут на запись в блоге. Было бы интересно услышать, кто что думает об этом коде.


а это типичный пример всей ущербности tdd и иже с ними.
Re[13]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.10.08 14:59
Оценка: +2 -2
Здравствуйте, Sshur, Вы писали:

S>Но если такой код уже есть, то единственным способом его протестировать будет подменить получение текущего времени, а так же методы выполнения


Во, вот об этом я там в комментах и писал. Телега впереди лошади. Задача "получить надежный код" подменяется задачей "написать тесты". А ведь исправление дизайна, при прочих равных, намного эффективнее написания теста. А уж если для тестов начинают дизайн портить (там рядом, в том же блоге, есть еще про тестирование статических методов) ...
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[6]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 09:04
Оценка: 2 (2) +1
Здравствуйте, Константин Л., Вы писали:

L>>>>хотелось бы уточнить, tdd или тестов как таковых?

КЛ>>>скажем так, манеры тесты ставить впереди лошади
A>>При постановки тестов впереди лошади ты скорее получишь вариант Re[6]: То ли лыжи не едут ...
Автор: AndrewVK
Дата: 28.10.08
, чем вариант в статье.

КЛ>с чего бы это?
Потому что ты так же будешь думать об удобстве тестирования, а не только об удобстве реализации.

Давай представим ход мыслей в обоих случаях.

-- нужно написать метод зависящий от текущей даты
TDD:
-- пишем сначала тест
-- сразу тупик: а как нам подставить вместо текущего, время нужное для тестов?
-- вариантов два: параметр и сервис времени
-- подумал немножко и решил, что сервис это геморой не в пример больший, чем параметр, поэтому выбираем параметр
-- ...

Тесты после (много после) реализации:
-- сразу же заюзал DateTime.Now (даже ни одной мысли не шелохнулось)
-- реализовал метод
-- .. // прошло время
-- стал прикручивать тесты
-- получил тот же тупик
-- параметр прикручивать муторно (нужно менять хз сколько пользователей метода)
-- приходит гениальная идея про сервис времени (в данной ситуации она действительна гениальна, даже есть чем гордиться // я не шучу)
-- ...
Re[3]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.10.08 13:38
Оценка: +3
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Cyberax, Вы писали:


C>>Код как код.


AVK>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?


Cчитаю, что нормально заменять на сервис все, чем неудобно управлять при тестировании. Работа с текущей датой и временем — то самое, когда дешевле изолировать, чем менять системное время.

Есть другие примеры:
Environment.ProcessorCount,
System.Net.Dns.*
...
Re[6]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.10.08 16:33
Оценка: +3
Здравствуйте, samius, Вы писали:

S>Допустим, есть метод, вычисляющий возраст клиента.


И если этот метод использует хоть DateTime.Now, хоть TimeService — проектировщика расстрэлять.

S>Какой дизайн должен быть у метода, вычисляющего текущий возраст клиента


В параметрах должна передаваться дата, на которую надо рассчитать возраст. Объяснять, почему?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[13]: То ли лыжи не едут ...
От: WolfHound  
Дата: 29.10.08 19:02
Оценка: 3 (2)
Здравствуйте, Кодт, Вы писали:

К>Затем, чтобы не тащить это окошко сквозь все функции (членом класса, а тем паче — ещё одним аргументом).

А зачем вобще таскать окошко?
Что будешь делать если этот код понадобится запустить в пакетном режиме на линуховом сервере у которого даже видюхи нет?

К>Очевидно, что правильный путь — это заранее побеспокоиться о таких сквозняках, и пооткрывать в нужных местах нужные форточки.

К>Вот только объём рефакторинга...
А сразу надо правильно делать.
Вот я (вернее по моему заказу) на текущей работе сделали демона который только и умеет что IoC.
Теперь все радуются.
Ибо демоны собираются из меленьких компонентов конфигами на раз.
И все без единого статика.

Более того некоторые компоненты про которые думали что больше одного экземпляра точно не будет таки оказывались в множественном числе.
Хорошо что статики не использовали...

К>Плюс накладные расходы. Потому что дополнительный параметр в функцию — и она из fastcall превращается в stdcall; дополнительный член в объект — плюс 4-8 байтов на нос, плюс хвосты блоков памяти, плюс копирование и присваивание.

Фигасе аргумент.
Кого это вобще волнует в коде обвязки?

К>Не, понятно, что статики — это дорога к спагетти. Но всё же, чистыми руками неудобно рыть землю.

Садишься в чистенький экскаватор и начинаешь рыть землю чистыми руками.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 25.10.08 12:14
Оценка: 1 (1) +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Наткнулся тут на запись в блоге. Было бы интересно услышать, кто что думает об этом коде.

Код как код. Если в проекте уже есть DI, то он будет не нужен — просто будем инжектить TimeService и всё.

Я ещё немного другой способ использовал, но он немного Java-specific:
public class Something
{
   protected Date getCurrentTime()
   {
       return new Date();
   }
   ...
}

public class UnitTests
{
   void testSomething()
   {
       final Date testDate=...;
       Something forTest=new Something()
       {
           @Override protected Date getCurrentTime()
           {
              return testDate;
           }
       };

       ...
   }
}
Sapienti sat!
Re[5]: То ли лыжи не едут ...
От: mazurkin http://mazurkin.info
Дата: 28.10.08 13:28
Оценка: -1 :)
То есть цель всего этого — возможность легкого формирования некой
"Матрицы" вокруг нашей программы-"Нео" — когда мы моками конфигурируем
для нашего основного кода полную иллюзию его полноценного существования
и функционирования под нашим полным тотальным контролем в виде тестов.
Posted via RSDN NNTP Server 2.1 beta
Re[11]: То ли лыжи не едут ...
От: Ziaw Россия  
Дата: 29.10.08 13:40
Оценка: +1 :)
Здравствуйте, Aikin, Вы писали:

A>Здравствуйте, Ziaw, Вы писали:


Z>> таймер.ПриСтарте += () => { плита.Включить(); };

Z>> таймер.ПриОстановке += () => { плита.Выключить(); };
A>Да, этот вариант получше будет чем мой.

Не знаю ) Просмотр кода натолкнул на мысль создать есктншен метод для таймера

public void ОтсчитатьВремя(this Таймер таймер, Action приСтарте, Action приОстановке)
{
    таймер.ПриСтарте += приСтарте;
    таймер.ПриОстановке += приОстановке;
    таймер.Старт();
    таймер.ДождатьсяОстановки();
    таймер.ПриСтарте -= приСтарте;
    таймер.ПриОстановке -= приОстановке;
}
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[9]: То ли лыжи не едут ...
От: Ziaw Россия  
Дата: 29.10.08 13:20
Оценка: 6 (1)
Здравствуйте, Sshur, Вы писали:

Имхо, для тестирования и сопровождения будет дешевле код типа:

        public Яичница СделатьЯичницу(IEnumerable<Яйцо> яйца, Миксер миксер, Плита плита)
        {
            var разбитыеЯйца = РазбитьЯйца(яйца);
            // фабричный метод может инжектиться, главное сейчас он изолирован и код не придется переписывать
            var взбитыеЯйца = Взбить(миксер, разбитыеЯйца, СоздатьТаймер(1)); 
            return Поджарить(плита, взбитыеЯйца, СоздатьТаймер(10));
        }

        private void Поджарить(Плита плита, IEnumerable<ВзбитоеЯйцо> яйца, Таймер таймер)
        {
            плита.Налить(яйца);
            таймер.ПриСтарте += () => { плита.Включить(); };
            таймер.ПриОстановке += () => { плита.Выключить(); };
            таймер.Старт();
            таймер.ДождатьсяОстановки();
        }
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[11]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 13:27
Оценка: 6 (1)
Здравствуйте, Sshur, Вы писали:

S>А если подумать чуть-чуть, и представить как может выглядеть TestCase для этого случая? И что надо будет поменять в коде, чтобы его можно было тестировать?

Sshur, я дико извиняюсь, но "на глаз" testability у метода нулевая. Единственное что можно проверить это что метод закончил свое выполнение вовремя.
Чтобы протестировать метод его нужно конкретно изменить: прошивать его "считывателями" промежуточных результатов и опять же тот самый TimeService


Но проще всего его полностью переписать.
В что-то типа:
public void СделатьЯичницу(ITimer timer)
{
timer.CallMethodIn(() => {ЗакончитьВзбивать(); НачатьЖарить();}, Timespan.FromSeconds(60));
timer.CallMethodIn(() => {ЗакончитьЖарить();}, Timespan.FromSeconds(660));

РазбитьЯйца(); 
НачатьВзбивать();

timer.WaitAllCals();
}
Re[9]: То ли лыжи не едут ...
От: Константин Л. Франция  
Дата: 29.10.08 10:52
Оценка: 1 (1)
Здравствуйте, Aikin, Вы писали:

A>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, Aikin, Вы писали:


КЛ>>[]


КЛ>>есть третий вариант — сразу передаем параметр

A>Зачем усложнять себе жизнь? По какой причине ты сразу передашь параметры? Какие плюсы в этом подходе? Будут ли они превышать неудобства связанные с обязательной передачей параметра в метод?
A>В общем я требую обоснования такого решения.

Это generic solution, еще обоснования нужны?

A>

A>C другой стороны ты отошел от контекста разговора:
A>

A>>При постановки тестов впереди лошади ты скорее получишь вариант Re[6]: То ли лыжи не едут ... , чем вариант в статье.
A>с чего бы это?

A>На этот вопрос я ответил?

Да, но неудовлетворительно
То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.10.08 11:57
Оценка: +1
Наткнулся тут на запись в блоге. Было бы интересно услышать, кто что думает об этом коде.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[3]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 25.10.08 12:35
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

C>>Код как код.

AVK>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?
Да. Например, мне нужно тестировать логику, зависящую от текущего времени. Как ты предлагаешь иначе это делать?
Sapienti sat!
Re[5]: То ли лыжи не едут ...
От: WolfHound  
Дата: 27.10.08 21:05
Оценка: +1
Здравствуйте, samius, Вы писали:

WH>>Более того лично я чем больше думаю тем сильнее склоняюсь к мысли что "функции" типа DateTime.Now, File.Open,... вобще должны быть запрещены на уровне системы типов. Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...

S>немного не ясно, запретить все статическое, или все что сложно подменить?
См выделеное.
Статические они же свободные функции пусть себе живут.
Константы тоже никому не мешают. При наличии неизменяемых типов данных константы могут быть весьма кучерявыми.

А вот статические переменные должны умереть. Сам факт их наличия разрушает многие доказательства.

S>Тогда будет очень кстати встроенный IoC контейнер. Да и мокогенератор в vsts не помешает.

Это детали.
Я говорю о фундаменте.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: То ли лыжи не едут ...
От: Константин Л. Франция  
Дата: 28.10.08 12:18
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>А для тестов я вообще не понимаю, зачем городить такую конструкцию. Получается, что тестирование проводится в условиях, заведомо не похожих на реальные. Спрашивается, а на фига? Планирование процессов таким образом не меняется, гонки так не выкусишь, чего тогда огород городить?


AVK>Вот именно! Но, судя по всему, мы с тобой в меньшинстве. И вот эта легкость, с которой идут на навороты дизайна для решения небольшой тактической задачи, вместо того, чтобы задуматься, почему и для чего, меня и удивляет. Создается ощущение, что лыжи у меня таки не едут.


да нет, я еще тут

меня тут, например, недавно заставляли простейшие линк-запросы в отдельные методы пихать, тк их можно _протестить_. я битый час объяснял, что тогда нахрена нам линк? Мне отвечали следующее — "чтобы пользовать его в этих отдельных методах"
Re[8]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 10:13
Оценка: :)
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Aikin, Вы писали:


КЛ>[]


КЛ>есть третий вариант — сразу передаем параметр

Зачем усложнять себе жизнь? По какой причине ты сразу передашь параметры? Какие плюсы в этом подходе? Будут ли они превышать неудобства связанные с обязательной передачей параметра в метод?
В общем я требую обоснования такого решения.



C другой стороны ты отошел от контекста разговора:

A>При постановки тестов впереди лошади ты скорее получишь вариант Re[6]: То ли лыжи не едут ... , чем вариант в статье.
с чего бы это?

На этот вопрос я ответил?
Re[15]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 30.10.08 16:44
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Да и DI в GUI-приложениях не так удобен.


Чем же?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[6]: То ли лыжи не едут ...
От: iHateLogins  
Дата: 30.06.09 03:52
Оценка: +1
M>То есть цель всего этого — возможность легкого формирования некой
M>"Матрицы" вокруг нашей программы-"Нео"

А потом приходит Заказчик и даёт всем люлей
Re[2]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.10.08 12:19
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Код как код.


Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?

C> Если в проекте уже есть DI, то он будет не нужен — просто будем инжектить TimeService и всё.


Давай DI здесь обсуждать не будем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[4]: То ли лыжи не едут ...
От: Юрий Жмеренецкий ICQ 380412032
Дата: 25.10.08 12:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

AVK>>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?

C>Да. Например, мне нужно тестировать логику, зависящую от текущего времени. Как ты предлагаешь иначе это делать?

Смотря какую логику. "5 минут" — это разница между двумя датами.
Re[3]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 25.10.08 13:43
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Cyberax, Вы писали:


C>>Код как код.


AVK>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?


C>> Если в проекте уже есть DI, то он будет не нужен — просто будем инжектить TimeService и всё.


AVK>Давай DI здесь обсуждать не будем.


А можно небольшой оффтоп — что это за DI и какие сервисы имеются в виду? Вполне нормально, если логика использует текущее время, сделать какой-нить доп. интерфейс, возвращаюший его, и вместо DateTime.Now вызывать TimeService.Now, и сделать MockTimeService, который в тестах вернет то что надо
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[4]: То ли лыжи не едут ...
От: Lloyd Россия  
Дата: 25.10.08 14:43
Оценка:
Здравствуйте, Sshur, Вы писали:

C>>> Если в проекте уже есть DI, то он будет не нужен — просто будем инжектить TimeService и всё.


AVK>>Давай DI здесь обсуждать не будем.


S>А можно небольшой оффтоп — что это за DI и какие сервисы имеются в виду?


Dependency injection
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[3]: То ли лыжи не едут ...
От: WolfHound  
Дата: 27.10.08 20:23
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?

Да.
Более того лично я чем больше думаю тем сильнее склоняюсь к мысли что "функции" типа DateTime.Now, File.Open,... вобще должны быть запрещены на уровне системы типов. Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...
Это сразу позволяет делать много интересных вещей типа доказанного отсутствия гонок, непробиваемой системы безопасности без костылей типа CAS и много еще чего.
Без IoC не попишешь но оно того стоит.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.10.08 20:34
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, AndrewVK, Вы писали:


AVK>>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?

WH>Да.
WH>Более того лично я чем больше думаю тем сильнее склоняюсь к мысли что "функции" типа DateTime.Now, File.Open,... вобще должны быть запрещены на уровне системы типов. Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...
немного не ясно, запретить все статическое, или все что сложно подменить?

WH>Это сразу позволяет делать много интересных вещей типа доказанного отсутствия гонок, непробиваемой системы безопасности без костылей типа CAS и много еще чего.

WH>Без IoC не попишешь но оно того стоит.
Тогда будет очень кстати встроенный IoC контейнер. Да и мокогенератор в vsts не помешает.
Re[6]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.10.08 21:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, samius, Вы писали:


WH>>>Более того лично я чем больше думаю тем сильнее склоняюсь к мысли что "функции" типа DateTime.Now, File.Open,... вобще должны быть запрещены на уровне системы типов. Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...

S>>немного не ясно, запретить все статическое, или все что сложно подменить?
WH>См выделеное.
WH>Статические они же свободные функции пусть себе живут.
Но класс File и не имеет статических переменных, во всяком случае изменяемых. Чем же тогда плохи функции Open()? FileStream, которому делегируют Open — тоже не содержит статических изменяемых переменных.
Re[7]: То ли лыжи не едут ...
От: WolfHound  
Дата: 27.10.08 21:35
Оценка:
Здравствуйте, samius, Вы писали:

S>Но класс File и не имеет статических переменных, во всяком случае изменяемых. Чем же тогда плохи функции Open()? FileStream, которому делегируют Open — тоже не содержит статических изменяемых переменных.

Видишь суслика?
А он есть.
(С)

Эти функции используют CreateFile которая в свою очередь сама использует некий глобальный контекст.
Вот этот глобальный контекст и есть статические переменные.
Те он есть зло.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: То ли лыжи не едут ...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 27.10.08 23:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Наткнулся тут на запись в блоге. Было бы интересно услышать, кто что думает об этом коде.


Всякая сложная проблема имеет простое неправильное решение.

Прежде всего, контроль времени существования — это функция не управляемого объекта, а управляющего агрегата. Соответственно, для ручной отладки короткоживущих объектов, скорее всего, достаточно перенастроить агрегат так, чтобы он удалял объекты не через 5 секунд, а спустя большее время. А для тестов я вообще не понимаю, зачем городить такую конструкцию. Получается, что тестирование проводится в условиях, заведомо не похожих на реальные. Спрашивается, а на фига? Планирование процессов таким образом не меняется, гонки так не выкусишь, чего тогда огород городить?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: То ли лыжи не едут ...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 27.10.08 23:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Эти функции используют CreateFile которая в свою очередь сама использует некий глобальный контекст.

WH>Вот этот глобальный контекст и есть статические переменные.
WH>Те он есть зло.

Ну тогда содержимое файла — не меньшее зло. Оно ж тоже, считай, статически распределяется.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.10.08 09:12
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>А для тестов я вообще не понимаю, зачем городить такую конструкцию. Получается, что тестирование проводится в условиях, заведомо не похожих на реальные. Спрашивается, а на фига? Планирование процессов таким образом не меняется, гонки так не выкусишь, чего тогда огород городить?


Вот именно! Но, судя по всему, мы с тобой в меньшинстве. И вот эта легкость, с которой идут на навороты дизайна для решения небольшой тактической задачи, вместо того, чтобы задуматься, почему и для чего, меня и удивляет. Создается ощущение, что лыжи у меня таки не едут.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 28.10.08 09:46
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Прежде всего, контроль времени существования — это функция не управляемого объекта, а управляющего агрегата. Соответственно, для ручной отладки короткоживущих объектов, скорее всего, достаточно перенастроить агрегат так, чтобы он удалял объекты не через 5 секунд, а спустя большее время. А для тестов я вообще не понимаю, зачем городить такую конструкцию. Получается, что тестирование проводится в условиях, заведомо не похожих на реальные. Спрашивается, а на фига? Планирование процессов таким образом не меняется, гонки так не выкусишь, чего тогда огород городить?


Ну во-первых, управляющий агрегат тоже может потребоваться тестировать. И ему может потребоваться подменить функции, возвращающие текущее время.

Тестируется логика работы — скажем, сначала надо создать объект А, потом по прошествии N секунд создать B, потом убить их обоих. Для систем, управляющих какими-нибудь объектами в зависимости от времени, это актуально. Логика может быть достаточно сложная, и если в неё вносятся изменения, то её надо как-то тестировать. Это не для того, чтобы тестировать устойчивость многопоточных приложений, а для тестирования бизнес-логики, зависящей от времени.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[3]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.10.08 13:04
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>А для тестов я вообще не понимаю, зачем городить такую конструкцию. Получается, что тестирование проводится в условиях, заведомо не похожих на реальные. Спрашивается, а на фига? Планирование процессов таким образом не меняется, гонки так не выкусишь, чего тогда огород городить?


AVK>Вот именно! Но, судя по всему, мы с тобой в меньшинстве. И вот эта легкость, с которой идут на навороты дизайна для решения небольшой тактической задачи, вместо того, чтобы задуматься, почему и для чего, меня и удивляет. Создается ощущение, что лыжи у меня таки не едут.


И мои лыжи теперь чего-та втормаживают...
Код, использующий DateTime.Now можно не тестировать?
Речь вообще идет о конкретном примере с жизнью объектов, или вообще о коде, который использует методы с неконтроллируемым поведением?

Как по-другому решается небольшая тактическая задача, если она решается по-другому?
Re[9]: То ли лыжи не едут ...
От: WolfHound  
Дата: 28.10.08 13:15
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Ну тогда содержимое файла — не меньшее зло. Оно ж тоже, считай, статически распределяется.

Не путай теплое с мягким.
Одно дело IO в специально отведенных местах другое дело IO везде.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: То ли лыжи не едут ...
От: mazurkin http://mazurkin.info
Дата: 28.10.08 13:24
Оценка:
WolfHound wrote:

> Более того лично я чем больше думаю тем сильнее склоняюсь к мысли что "функции" типа DateTime.Now, File.Open,... вобще должны быть запрещены на уровне системы типов. Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...

> Это сразу позволяет делать много интересных вещей типа доказанного отсутствия гонок, непробиваемой системы безопасности без костылей типа CAS и много еще чего.
> Без IoC не попишешь но оно того стоит.

Полностью поддерживаю — я бы еще вдобавок сформулировал это правило еще
и с другой стороны: весь код, получающий ресурсы или наоборот отдающий
ресурсы за пределы разрабатываемой программной системы должен быть
выделен в отдельный слой, и чем тоньше этот слой — то есть чем меньше
кода там будет, тем легче будет тестировать все остальное.

Под ресурсами я понимаю: чтения запись файловых потоков, сокеты,
дерганье разных системных функций, получение списков оборудования и все
прочее. Текущее время — такой же ресурс.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.10.08 14:40
Оценка:
Здравствуйте, samius, Вы писали:

S>Код, использующий DateTime.Now можно не тестировать?


Как бы это попроще объяснить. Код, использующий DateTime.Now должен иметь такой дизайн, чтобы не было потребности в тестировании таким манером, чтобы понадобилось подменять реальные значения суррогатом.

S>Речь вообще идет о конкретном примере с жизнью объектов, или вообще о коде, который использует методы с неконтроллируемым поведением?


Речь о конкретном примере, когда сервисами начинают подменять все подряд.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[5]: То ли лыжи не едут ...
От: WolfHound  
Дата: 28.10.08 14:40
Оценка:
Здравствуйте, mazurkin, Вы писали:

M>Полностью поддерживаю — я бы еще вдобавок сформулировал это правило еще и с другой стороны: весь код, получающий ресурсы или наоборот отдающий ресурсы за пределы разрабатываемой программной системы должен быть выделен в отдельный слой, и чем тоньше этот слой — то есть чем меньше кода там будет, тем легче будет тестировать все остальное.

Ты не понял. Я вобще не про тесты. Тестам эти правила помогут просто как побочный эффект.
Вобще говоря запрет статических переменных это достаточное условие чтобы ты не мог пуступить иначе.
Ибо без статических переменных теоритически невозможно получить ресурс не передав ссылку на него или фабрику этих ресурсов.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: То ли лыжи не едут ...
От: mazurkin http://mazurkin.info
Дата: 28.10.08 14:53
Оценка:
WolfHound wrote:

> Ты не понял. Я вобще не про тесты. Тестам эти правила помогут просто как побочный эффект.


Нифигасе побочный эффект

> Вобще говоря запрет статических переменных это достаточное условие чтобы ты не мог пуступить иначе.

> Ибо без статических переменных теоритически невозможно получить ресурс не передав ссылку на него или фабрику этих ресурсов.

В джаве нет никаких статических переменных — совсем! Только статические
методы классов — их тоже запретить?
Posted via RSDN NNTP Server 2.1 beta
Re[7]: То ли лыжи не едут ...
От: WolfHound  
Дата: 28.10.08 15:11
Оценка:
Здравствуйте, mazurkin, Вы писали:

>> Ты не понял. Я вобще не про тесты. Тестам эти правила помогут просто как побочный эффект.

M>Нифигасе побочный эффект
Именно побочный.

M>В джаве нет никаких статических переменных — совсем! Только статические методы классов — их тоже запретить?

Re[7]: То ли лыжи не едут ...
Автор: WolfHound
Дата: 28.10.08
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.10.08 15:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, samius, Вы писали:


S>>Код, использующий DateTime.Now можно не тестировать?


AVK>Как бы это попроще объяснить. Код, использующий DateTime.Now должен иметь такой дизайн, чтобы не было потребности в тестировании таким манером, чтобы понадобилось подменять реальные значения суррогатом.


Допустим, есть метод, вычисляющий возраст клиента. Фигня конечно, но предположим, что сервис продает видеодиски с возрастным ограничением, и если произойдет ошибка с возрастом на пару минут то заказчик рискует огрести иск. Это все к тому, что метод, вычисляющий возраст должен работать гарантированно точно.

Требуется проверить, как этот метод будет работать в разных нестандартных ситуациях. Сколько лет он навычисляет для человека, родившегося 29 фефраля хххх года 28 февраля уууу года, 1 марта zzzz года....

Какой дизайн должен быть у метода, вычисляющего текущий возраст клиента,

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


Следует параметризовать метод текущим временем?
Re[3]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 28.10.08 15:22
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вот именно! Но, судя по всему, мы с тобой в меньшинстве. И вот эта легкость, с которой идут на навороты дизайна для решения небольшой тактической задачи, вместо того, чтобы задуматься, почему и для чего, меня и удивляет. Создается ощущение, что лыжи у меня таки не едут.

Ну не всегда на тестовых примерах можно реальную обстановку смоделировать. Так что же, отменять тесты вообще?
Sapienti sat!
Re[4]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.10.08 16:33
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ну не всегда на тестовых примерах можно реальную обстановку смоделировать.


Не всегда.

C> Так что же, отменять тесты вообще?


Хочешь — отменяй, мне то что. Я подобного никому не советовал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: То ли лыжи не едут ...
От: Lloyd Россия  
Дата: 28.10.08 16:35
Оценка:
Здравствуйте, Константин Л., Вы писали:

AVK>>Наткнулся тут на запись в блоге. Было бы интересно услышать, кто что думает об этом коде.


КЛ>а это типичный пример всей ущербности tdd


хотелось бы уточнить, tdd или тестов как таковых?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[3]: То ли лыжи не едут ...
От: Константин Л. Франция  
Дата: 28.10.08 17:03
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Константин Л., Вы писали:


AVK>>>Наткнулся тут на запись в блоге. Было бы интересно услышать, кто что думает об этом коде.


КЛ>>а это типичный пример всей ущербности tdd


L>хотелось бы уточнить, tdd или тестов как таковых?


скажем так, манеры тесты ставить впереди лошади
Re[3]: То ли лыжи не едут ...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 28.10.08 20:15
Оценка:
Здравствуйте, Sshur, Вы писали:

ГВ>>Прежде всего, контроль времени существования — это функция не управляемого объекта, а управляющего агрегата. Соответственно, для ручной отладки короткоживущих объектов, скорее всего, достаточно перенастроить агрегат так, чтобы он удалял объекты не через 5 секунд, а спустя большее время. А для тестов я вообще не понимаю, зачем городить такую конструкцию. Получается, что тестирование проводится в условиях, заведомо не похожих на реальные. Спрашивается, а на фига? Планирование процессов таким образом не меняется, гонки так не выкусишь, чего тогда огород городить?


S>Ну во-первых, управляющий агрегат тоже может потребоваться тестировать. И ему может потребоваться подменить функции, возвращающие текущее время.


Честно сказать, это чертовки странно. На мой неквалифицрованный взгляд, такие задачи прекрасно решаются масштабными коэффициентами времени. Ну, если, конечно, взаимодействие со временем не доведено до идиотизма, типа привязки к какому-нибудь ".NoonTime()" — сиречь до употребления трививальных имён моментов врени вместо масштабируемых интервалов.

S>Тестируется логика работы — скажем, сначала надо создать объект А, потом по прошествии N секунд создать B, потом убить их обоих. Для систем, управляющих какими-нибудь объектами в зависимости от времени, это актуально. Логика может быть достаточно сложная, и если в неё вносятся изменения, то её надо как-то тестировать. Это не для того, чтобы тестировать устойчивость многопоточных приложений, а для тестирования бизнес-логики, зависящей от времени.


Всё равно не понятно. Кто мешает заменить N секунд на N*C секунд? Подменяя отсчёт времени сервисом мы добиваемся того же, но атомной бомбой по тараканам.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: То ли лыжи не едут ...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 28.10.08 20:35
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вот именно! Но, судя по всему, мы с тобой в меньшинстве. И вот эта легкость, с которой идут на навороты дизайна для решения небольшой тактической задачи, вместо того, чтобы задуматься, почему и для чего, меня и удивляет. Создается ощущение, что лыжи у меня таки не едут.


Да ладно! Всё те же анекдоты о бессмысленных абстрактных слоях, но в других ипостасях. Хорошо, что хоть компонентную модель с вебсервисом и базой данных вместо TimeService не придумали.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[7]: То ли лыжи не едут ...
От: ironwit Украина  
Дата: 29.10.08 06:14
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, samius, Вы писали:


S>>Допустим, есть метод, вычисляющий возраст клиента.


AVK>И если этот метод использует хоть DateTime.Now, хоть TimeService — проектировщика расстрэлять.


почему?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Я не умею быть злым, и не хочу быть добрым.
Re[4]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 06:26
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

S>>Тестируется логика работы — скажем, сначала надо создать объект А, потом по прошествии N секунд создать B, потом убить их обоих. Для систем, управляющих какими-нибудь объектами в зависимости от времени, это актуально. Логика может быть достаточно сложная, и если в неё вносятся изменения, то её надо как-то тестировать. Это не для того, чтобы тестировать устойчивость многопоточных приложений, а для тестирования бизнес-логики, зависящей от времени.


ГВ>Всё равно не понятно. Кто мешает заменить N секунд на N*C секунд? Подменяя отсчёт времени сервисом мы добиваемся того же, но атомной бомбой по тараканам.



гм, если вы например пишете программу для приготовления яичницы в перспективном кухонном комбайне, где сначала надо кинуть яйца, потом взбивать их 30 секунд, потом выложить на сковороду и жарить 5 минут, то как будет выглядеть и сама программа и тесты? От этого много чего зависит. И потом, что вы понимаете под словом "сервис"? Это просто интерфейс в терминах C#, который будет реализован классом, возвращающим реальное время в "боевых" условиях, и заглушкой в тестовых. Где тут атомная бомба?
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[7]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 06:29
Оценка:
Здравствуйте, AndrewVK, Вы писали:

S>>Какой дизайн должен быть у метода, вычисляющего текущий возраст клиента


AVK>В параметрах должна передаваться дата, на которую надо рассчитать возраст. Объяснять, почему?


А это то же самое. Я, на самом деле, отвечая, что не вижу тут ничего плохого, никогда у себя не делал спец. прослойку для расчета даты, а передавал нужную дату как параметр. Более того, так как я больше занимаюсь БД и в частности логикой в БД, то часто использую для создания логики UDF. Тамв ызовы GetDate() (аналог DateTime.Now на TSQL) и прочих недетерминированных функций просто запрещены. Сначала передаешь текущее время как параметр в такую процедуру и материшь разработчиков языка, но потом понимаешь, что так лучше.

Если передается текущая дата — то это можно сказать тривиальный случай того самого сервиса. Если больше ничего не надо, то и ладно, а если нужно будет получать несколько таких глобальных величин, то почему бы не объединить несколько этих величин в один интерфейс?
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[8]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.08 06:52
Оценка:
Здравствуйте, ironwit, Вы писали:

I>Здравствуйте, AndrewVK, Вы писали:


AVK>>Здравствуйте, samius, Вы писали:


S>>>Допустим, есть метод, вычисляющий возраст клиента.


AVK>>И если этот метод использует хоть DateTime.Now, хоть TimeService — проектировщика расстрэлять.


I>почему?

за DateTime.Now — понятно почему. За TimeService — пока не очень.

В том, что параметризация метода временем, на которое нужно вычислить возраст, избавляет от необходимости иметь TimeService — я согласен с AndrewVK. Но это может некоторым образом напрячь потребителя метода GetAge(DateTime) и заставит его в свою очередь обратиться к DateTime.Now. Благо, что потребитель никаких вычислений с полученным значением не делает и проверить то что он передает нужное значение в метод GetAge(DateTime) довольно легко.
Как вариант можно создать перегруженный метод
??? GetAge() { return GetAge(DateTime.Now); }


А если требуется метод GetMagicNumber, требующий текущее время, число процессоров, список MAC адресов и анализы любимого хомяка пользователя, то создание сервиса не будет уже атомной бомбой?

Есть ли какие-то формальные критерии, когда приемлемо создавать сервис, а когда нет? (К здравому смыслу просьба не аппелировать)

Вопрос ко всем
Re[5]: То ли лыжи не едут ...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 29.10.08 07:24
Оценка:
Здравствуйте, Sshur, Вы писали:

ГВ>>Всё равно не понятно. Кто мешает заменить N секунд на N*C секунд? Подменяя отсчёт времени сервисом мы добиваемся того же, но атомной бомбой по тараканам.


S>гм, если вы например пишете программу для приготовления яичницы в перспективном кухонном комбайне, где сначала надо кинуть яйца, потом взбивать их 30 секунд, потом выложить на сковороду и жарить 5 минут, то как будет выглядеть и сама программа и тесты? От этого много чего зависит.


Тесты точно будут пригоревшими. Давай не будем писать программу для сферического комбайна в вакууме. На RSDN их и так полно. Если ты хочешь привести пример, где предложенное решение с подменой Time-сервиса удобно и оправдано — приводи.

S>И потом, что вы понимаете под словом "сервис"? Это просто интерфейс в терминах C#, который будет реализован классом, возвращающим реальное время в "боевых" условиях, и заглушкой в тестовых. Где тут атомная бомба?


Я представляю в данном случае под словом "сервис" ровно то, что представляется под ним по ссылке в топикстарте.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 08:09
Оценка:
Здравствуйте, Константин Л., Вы писали:

L>>хотелось бы уточнить, tdd или тестов как таковых?

КЛ>скажем так, манеры тесты ставить впереди лошади
При постановки тестов впереди лошади ты скорее получишь вариант Re[6]: То ли лыжи не едут ...
Автор: AndrewVK
Дата: 28.10.08
, чем вариант в статье.
Как раз замена DateTime.Now на что-то конролируемое возникнет именно при попытке написать тесты к уже существующему коду. Так как заменять все DateTime.Now на TimeService проще, чем адаптировать все случаи использования класса.
Re[8]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.10.08 08:30
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Если передается текущая дата — то это можно сказать тривиальный случай того самого сервиса. Если больше ничего не надо, то и ладно, а если нужно будет получать несколько таких глобальных величин, то почему бы не объединить несколько этих величин в один интерфейс?


Если, если ... Не знаю, я говорил лишь про конкретный случай. И проблему я вижу именно что в конкретном случае, а не в общем и целом.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[5]: То ли лыжи не едут ...
От: Константин Л. Франция  
Дата: 29.10.08 08:38
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Здравствуйте, Константин Л., Вы писали:


L>>>хотелось бы уточнить, tdd или тестов как таковых?

КЛ>>скажем так, манеры тесты ставить впереди лошади
A>При постановки тестов впереди лошади ты скорее получишь вариант Re[6]: То ли лыжи не едут ...
Автор: AndrewVK
Дата: 28.10.08
, чем вариант в статье.


с чего бы это?

A>Как раз замена DateTime.Now на что-то конролируемое возникнет именно при попытке написать тесты к уже существующему коду. Так как заменять все DateTime.Now на TimeService проще, чем адаптировать все случаи использования класса.


может быть, но как тут сказал AVK, дату надо передавать параметром, и тесты тут ни при чем
Re[7]: То ли лыжи не едут ...
От: Константин Л. Франция  
Дата: 29.10.08 10:04
Оценка:
Здравствуйте, Aikin, Вы писали:

[]

есть третий вариант — сразу передаем параметр
Re[10]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 11:03
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>>>есть третий вариант — сразу передаем параметр

A>>Зачем усложнять себе жизнь? По какой причине ты сразу передашь параметры? Какие плюсы в этом подходе? Будут ли они превышать неудобства связанные с обязательной передачей параметра в метод?
A>>В общем я требую обоснования такого решения.

КЛ>Это generic solution, еще обоснования нужны?

Ну конечно. Если бы это был действительно generic solution, то сего топика вообще не было бы.
Re[9]: То ли лыжи не едут ...
От: Ziaw Россия  
Дата: 29.10.08 11:07
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Зачем усложнять себе жизнь? По какой причине ты сразу передашь параметры?


AVK уже ответил
Автор: AndrewVK
Дата: 29.10.08


Это должно делаться по умолчанию, завязка алгоритма на любой контекст черевата серьезным гемороем в дальнейшем.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[10]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 11:49
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Aikin, Вы писали:


A>>Зачем усложнять себе жизнь? По какой причине ты сразу передашь параметры?

Z>AVK уже ответил
Автор: AndrewVK
Дата: 29.10.08


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

Согласен. Принцип хороший. Но не все же такие умные
Re[5]: То ли лыжи не едут ...
От: seregaa Ниоткуда http://blogtani.ru
Дата: 29.10.08 12:07
Оценка:
Здравствуйте, Sshur, Вы писали:

S>гм, если вы например пишете программу для приготовления яичницы в перспективном кухонном комбайне, где сначала надо кинуть яйца, потом взбивать их 30 секунд, потом выложить на сковороду и жарить 5 минут, то как будет выглядеть и сама программа и тесты? От этого много чего зависит. И потом, что вы понимаете под словом "сервис"? Это просто интерфейс в терминах C#, который будет реализован классом, возвращающим реальное время в "боевых" условиях, и заглушкой в тестовых. Где тут атомная бомба?


А как в этом случае будет выглядеть сервис врмени? Сколько их будет всего? Один и для взбивания и для поджаривания? Как он узнает, что в первом случае нужно вернуть Now.Add(30) а во втором Now.Add(300)? Писать несколько сервисов? — не слишком ли много их получится? Написать один сервис, возвращающий Now*10 (ускоренное в 10 раз время)? А если придется протестировать рецепт, требующий 5-ти дневного вымачивания мяса в маринаде?
Я пока не вижу, как тут может помочь решение с сервисом времени.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[6]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 12:35
Оценка:
Здравствуйте, seregaa, Вы писали:

S>Здравствуйте, Sshur, Вы писали:


S>>гм, если вы например пишете программу для приготовления яичницы в перспективном кухонном комбайне, где сначала надо кинуть яйца, потом взбивать их 30 секунд, потом выложить на сковороду и жарить 5 минут, то как будет выглядеть и сама программа и тесты? От этого много чего зависит. И потом, что вы понимаете под словом "сервис"? Это просто интерфейс в терминах C#, который будет реализован классом, возвращающим реальное время в "боевых" условиях, и заглушкой в тестовых. Где тут атомная бомба?


S>А как в этом случае будет выглядеть сервис врмени? Сколько их будет всего? Один и для взбивания и для поджаривания? Как он узнает, что в первом случае нужно вернуть Now.Add(30) а во втором Now.Add(300)? Писать несколько сервисов? — не слишком ли много их получится? Написать один сервис, возвращающий Now*10 (ускоренное в 10 раз время)? А если придется протестировать рецепт, требующий 5-ти дневного вымачивания мяса в маринаде?

S>Я пока не вижу, как тут может помочь решение с сервисом времени.


Как, сервис возврщает текущее время. От него больше ничего не требуется. Это если реализовывать алгоритм в виде бесконечного цикла, который срабатывает с определенной частотой и проверяет, не прошло ли нужное время и в зависимости от этого вызывает какие-то другие методы. Хотя, на мой взгляд, это лучше реализовывать через таймеры, и тут для тестов уже надо будет делать таймер, ускоренный в N раз. Умножение же текущего времени (Now * 10) — это вообще какая-то глупость
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[7]: То ли лыжи не едут ...
От: seregaa Ниоткуда http://blogtani.ru
Дата: 29.10.08 12:40
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Как, сервис возврщает текущее время. От него больше ничего не требуется. Это если реализовывать алгоритм в виде бесконечного цикла, который срабатывает с определенной частотой и проверяет, не прошло ли нужное время и в зависимости от этого вызывает какие-то другие методы. Хотя, на мой взгляд, это лучше реализовывать через таймеры, и тут для тестов уже надо будет делать таймер, ускоренный в N раз. Умножение же текущего времени (Now * 10) — это вообще какая-то глупость


(Now * 10) — вобще-то это был псевдокод.
Дело в том, что даже в рамках одного рецепта может потребуется разное значение для N. Если замачивать нужно 5 суток, а взбивать — полминуты. В итоге код сервиса будет поддерживать сложнее основного кода.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[8]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 12:49
Оценка:
Здравствуйте, seregaa, Вы писали:

S>(Now * 10) — вобще-то это был псевдокод.

S>Дело в том, что даже в рамках одного рецепта может потребуется разное значение для N. Если замачивать нужно 5 суток, а взбивать — полминуты. В итоге код сервиса будет поддерживать сложнее основного кода.



public void СделатьЯичницу()
{
DateTime времяНачала = DateTime.Now;
int шаг = 1;
while(true)
{
 if(шаг = 1)
 {
     РазбитьЯйца();
     НачатьВзбивать();
     шаг = 2;
 }
 if((DateTime.Now-времяНачала).TotalSeconds >60 &&шаг = 2) //минуту взбиваем
 { 
    ЗакончитьВзбивать();
    НачатьЖарить();
     шаг = 3;
 }
 if((DateTime.Now-времяНачала).TotalSeconds >660 &&шаг = 2) //потом 10 минут жарим
 {
    ЗакончитьЖарить();
    break;
 }
 Thread.Sleep(1000);
}
}


Зачем тут много значений для N?
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[9]: То ли лыжи не едут ...
От: seregaa Ниоткуда http://blogtani.ru
Дата: 29.10.08 12:55
Оценка:
Здравствуйте, Sshur, Вы писали:

S>
S>public void СделатьЯичницу()
S>{
S>DateTime времяНачала = DateTime.Now;
S>int шаг = 1;
S>while(true)
S>{
S> ...
S>}
S>}
S>


S>Зачем тут много значений для N?

Я пока тут вооще ни сервиса ни N, помогающих протестировать этот метод не вижу
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[8]: То ли лыжи не едут ...
От: mazurkin http://mazurkin.info
Дата: 29.10.08 12:56
Оценка:
seregaa wrote:

> Дело в том, что даже в рамках одного рецепта может потребуется разное значение для N.


Какая разница?

Допустим вы пишите код для микроконтроллера, и у вас есть рабочий цикл
Run, который вызывается по прерыванию каждые 10 миллисекунд для
проведения операций. Допустим кто-то, где-то установил время точки
отсчета и тип операции. Пусть время измеряется в миллисекундах.

class Application {

   private Operation operation;
   private Long startTime;
   private TimeService timeService;

   public static final WASHING_DURATION = 1000*60*60*24*5;
   public static final BOILING_DURATION = 1000*30;

   public void run() {

     Long duration = timeService.getCurrentTime() - startTime;

     if ((operation = Operation.Washing) and (duration >= 
WASHING_DURATION)) {
    stopWashing();
     }

     if ((operation = Operation.Boiling) and (duration >= 
BOILING_DURATION)) {
    stopBoiling();
     }

   }

   public setTimeService(TimeService timeService) {
     this.timeService = timeService;
   }

}


Теперь для тестирования можем сделать сервис-заглушку TimeServiceStub

   application.setStartTime(10000)
   application.setOperation(Operation.Washing);

   application.run();
   // Проверяем - ничего не должно произойти

   timeServiceStub.setCurrentTime(10000);
   application.run();
   // Проверяем - ничего не должно произойти

   timeServiceStub.setCurrentTime(10000 + WASHING_DURATION);
   application.run();
   // Проверяем вот тут должно сработать
Posted via RSDN NNTP Server 2.1 beta
Re[10]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 13:00
Оценка:
Здравствуйте, seregaa, Вы писали:

S>>Зачем тут много значений для N?

S>Я пока тут вооще ни сервиса ни N, помогающих протестировать этот метод не вижу

А если подумать чуть-чуть, и представить как может выглядеть TestCase для этого случая? И что надо будет поменять в коде, чтобы его можно было тестировать?
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[4]: То ли лыжи не едут ...
От: Кодт Россия  
Дата: 29.10.08 13:21
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH> Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...


Низкий поклон от программистов под симбиан. И — из согнутого положения — сдавленные матюки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[10]: То ли лыжи не едут ...
От: Ziaw Россия  
Дата: 29.10.08 13:26
Оценка:
Здравствуйте, Ziaw, Вы писали:

немного ошибся:

      private Яичница Поджарить(Плита плита, IEnumerable<ВзбитоеЯйцо> яйца, Таймер таймер)
      {
          плита.Налить(яйца);
          таймер.ПриСтарте += () => { плита.Включить(); };
          таймер.ПриОстановке += () => { плита.Выключить(); };
          таймер.Старт();
          таймер.ДождатьсяОстановки();
          return плита.СнятьЯичницу();
      }


Для простоты примера предполагается, что Плита это специальная электоплита для яичницы.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[9]: То ли лыжи не едут ...
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 29.10.08 13:29
Оценка:
Здравствуйте, samius, Вы писали:

S>Есть ли какие-то формальные критерии, когда приемлемо создавать сервис, а когда нет? (К здравому смыслу просьба не аппелировать)


Формальные критерии для неформально определённой сущности?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[10]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 13:30
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z> таймер.ПриСтарте += () => { плита.Включить(); };

Z> таймер.ПриОстановке += () => { плита.Выключить(); };
Да, этот вариант получше будет чем мой.
Re[9]: То ли лыжи не едут ...
От: ironwit Украина  
Дата: 29.10.08 13:32
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, ironwit, Вы писали:


AVK>>>И если этот метод использует хоть DateTime.Now, хоть TimeService — проектировщика расстрэлять.


I>>почему?


AVK>Потому что и то и другое увеличивает увязанность кода на контекст без особой на то необходимости. К примеру, если нам понадобится рассчитать возраст задним числом, в обеи вариантах будет приплызд. Разве что, теоретически, можно сделать специальный TimeService, но, согласись, выглядеть сие будет ну совсем уж черти как.


угумс. дошло. я почему то подумал что вообще почему то нельзя применять указанное, так как оно каким то магическим способом мешает отладке\тестированию. Спасибо.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Я не умею быть злым, и не хочу быть добрым.
Re[12]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 13:43
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Aikin, Вы писали:


A>>Здравствуйте, Ziaw, Вы писали:


Z>>> таймер.ПриСтарте += () => { плита.Включить(); };

Z>>> таймер.ПриОстановке += () => { плита.Выключить(); };
A>>Да, этот вариант получше будет чем мой.

Z>Не знаю ) Просмотр кода натолкнул на мысль создать есктншен метод для таймера

Нет предела совершенству
Re[12]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.08 13:47
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Не знаю ) Просмотр кода натолкнул на мысль создать есктншен метод для таймера


Z>
Z>public void ОтсчитатьВремя(this Таймер таймер, Action приСтарте, Action приОстановке)
Z>{
Z>    таймер.ПриСтарте += приСтарте;
Z>    таймер.ПриОстановке += приОстановке;
Z>    таймер.Старт();
Z>    таймер.ДождатьсяОстановки();
Z>    таймер.ПриСтарте -= приСтарте;
Z>    таймер.ПриОстановке -= приОстановке;
Z>}
Z>



public void ОтсчитатьВремя(this Таймер таймер, Action приСтарте, Action приОстановке)
{
    приСтарте();
    таймер.Старт();
    таймер.ДождатьсяОстановки();
    приОстановке();
}


Только теперь вообще нужен этот таймер?
Re[13]: То ли лыжи не едут ...
От: Ziaw Россия  
Дата: 29.10.08 13:55
Оценка:
Здравствуйте, samius, Вы писали:

S>
S>public void ОтсчитатьВремя(this Таймер таймер, Action приСтарте, Action приОстановке)
S>{
S>    приСтарте();
S>    таймер.Старт();
S>    таймер.ДождатьсяОстановки();
S>    приОстановке();
S>}
S>


Можно и так, но тут мы делаем предположения о внутреннем устройстве таймера -> "между вызовом Старт() и собственно отсчетом времени
проходит пренебрежимо мало времени". Возможно это предположение верно только для текущей реализации таймера? Возможно рамки "пренебрижимо мало" могут изменитсья?

S>Только теперь вообще нужен этот таймер?


Нужен конечно. Мы отвязываем алгоритм жарки яичницы от алгоритма подсчета времени.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[12]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 14:11
Оценка:
Здравствуйте, Aikin, Вы писали:


A>Sshur, я дико извиняюсь, но "на глаз" testability у метода нулевая. Единственное что можно проверить это что метод закончил свое выполнение вовремя.

A>Чтобы протестировать метод его нужно конкретно изменить: прошивать его "считывателями" промежуточных результатов и опять же тот самый TimeService


Я там писал вначале, что сам бы выбрал вариант на таймерах. А это был пример того, что для тестирования получения всех возможных вариантов времени не надо. Но если такой код уже есть, то единственным способом его протестировать будет подменить получение текущего времени, а так же методы выполнения
действий. Кроме того, если мы не хотим тестировать, как в Windows работают многопоточные приложения (я думаю глюков в механизме переключения потоков нет ), то придется модифицировать код, вынести логику из цикла управления. Сорри,что разбитие яиц возложил на миксер, делать еще один объект быол неохота


class ЭлектроПовар
{
public void СделатьЯичницу(ITimeService ts, IМиксер миксер, IПлита плита)
{
DateTime времяНачала = ts.Now;
int шаг = 1;
while(true)
{
  if(ВыполнитьОчередноеДействие())
    break;
 Thread.Sleep(1000);
}
}

public bool ВыполнитьОчередноеДействие(int шаг, ITimeService ts, IМиксер миксер, IПлита плита)
{
 if(шаг = 1)
 {
     миксер.РазбитьЯйца();
     миксер.НачатьВзбивать();
     шаг = 2;
 }
 if((ts.Now-времяНачала).TotalSeconds >60 &&шаг = 2) //минуту взбиваем
 { 
    миксер.ЗакончитьВзбивать();
    плита.НачатьЖарить();
     шаг = 3;
 }
 if((ts.Now-времяНачала).TotalSeconds >660 &&шаг = 3) //потом 10 минут жарим
 {
    плита.ЗакончитьЖарить();
    return true;
 }
 return false;
}
}


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



void ТестПриготовлениеЯичницы
{
    ЭлектроПовар повар = new ЭлектроПовар();
    ITimeService ts = new TimeService();
    IПлита плита = new ТестПлита();
    IМиксер миксер = new ТестМиксер();
    
    миксер.яйцаРазбиты = false;
    миксер.включен = false;
    плита.включена = false;
    ts.dateTime = new DateTime(2008,1,1;
    Assert(ВыполнитьОчередноеДействие(1, ts,плита, миксер), false)
    Assert(миксер.включен, true);
    Assert(миксер.яйцаРазбиты, true);
    Assert(плита.включена, false);
    ts.AddSeconds(59);//через 59 секунд все еще взбивается
    Assert(ВыполнитьОчередноеДействие(2, ts,плита, миксер), false)
    Assert(миксер.включен, true);
    Assert(плита.включена, false);
    ts.AddSeconds(2);//тут миксер должен перестать работать, должна включиться плита
    Assert(ВыполнитьОчередноеДействие(2, ts,плита, миксер), false)
    Assert(миксер.включен, false);
    Assert(плита.включена, true);
    ts.AddSeconds(600);//а тут уже все прекращается
    Assert(ВыполнитьОчередноеДействие(2, ts,плита, миксер),true)
    Assert(ВыполнитьОчередноеДействие(2, ts,плита, миксер), false)
    Assert(миксер.включен, false);
    Assert(плита.включена, false);

}



А вот тестовое окружение для этого добра


interface  ITimeService
{
  DateTime Now{get;}
}

interface  IМиксер 
{
void РазбитьЯйца();
void НачатьВзбивать();
void ЗакончитьВзбивать();
}

interface IПлита
{
   void  плита.НачатьЖарить();
   void плита.ЗакончитьЖарить();
}

class MockTimeSevice:ITimeService
{
  private DateTime dateTime;

  DateTime Now
  {
     return dateTime;
  }

  public SetDateTime (DateTime newTime)
  {
    dateTime = newTime; 
  }

  public AddSeconds (int seconds)
  {
    dateTime.AddSeconds(seconds);
  }
}

class ТестМиксер:IМиксер
{
  public bool яйцаРазбиты = false;
  void РазбитьЯйца() {     яйцаРазбиты = true;  }
  public bool включен = false;
  void НачатьВзбивать() { включен = true;};
  void ЗакончитьВзбивать(){ включен = false;};
}

class ТестПлита:IПлита
{
  public bool включен = false;
  void НачатьВзбивать() { включен = true;};
  void ЗакончитьВзбивать(){ включен = false;};
}
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[14]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.08 14:11
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, samius, Вы писали:


S>>
S>>public void ОтсчитатьВремя(this Таймер таймер, Action приСтарте, Action приОстановке)
S>>{
S>>    приСтарте();
S>>    таймер.Старт();
S>>    таймер.ДождатьсяОстановки();
S>>    приОстановке();
S>>}
S>>


Z>Можно и так, но тут мы делаем предположения о внутреннем устройстве таймера -> "между вызовом Старт() и собственно отсчетом времени проходит пренебрежимо мало времени". Возможно это предположение верно только для текущей реализации таймера? Возможно рамки "пренебрижимо мало" могут изменитсья?

Какие бы ни были рамки, вызов метода ДождатьсяОстановки() по всей видимости блокирующий.

S>>Только теперь вообще нужен этот таймер?


Z>Нужен конечно. Мы отвязываем алгоритм жарки яичницы от алгоритма подсчета времени.


А так?
public void ОтсчитатьВремя(TimeSpan timeSpan, Action приСтарте, Action приОстановке)
{
    приСтарте();
    Thread.Sleep(timeSpan);
    приОстановке();
}
Re[9]: То ли лыжи не едут ...
От: seregaa Ниоткуда http://blogtani.ru
Дата: 29.10.08 14:21
Оценка:
Здравствуйте, mazurkin, Вы писали:

M>Теперь для тестирования можем сделать сервис-заглушку TimeServiceStub


M>
M>   application.setStartTime(10000)
M>   application.setOperation(Operation.Washing);

M>   application.run();
M>   // Проверяем - ничего не должно произойти

M>   timeServiceStub.setCurrentTime(10000);
M>   application.run();
M>   // Проверяем - ничего не должно произойти

M>   timeServiceStub.setCurrentTime(10000 + WASHING_DURATION);
M>   application.run();
M>   // Проверяем вот тут должно сработать
M>


Для начала непонятно, почему WASHING_DURATION — не настраиваемый параметр.
Тест можно повторить без сервиса времени — не меняя ни символа в тестируемом классе:
M>
M>   ...
M>   application.setStartTime(Now - WASHING_DURATION);
M>   application.run();
M>   // Проверяем вот тут должно сработать
M>
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[13]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.08 14:24
Оценка:
Здравствуйте, Sshur, Вы писали:

S>

S>void ТестПриготовлениеЯичницы
S>{
[]
S>}
S>


Ужос. А если бы в алгоритме были циклы?
Re[15]: То ли лыжи не едут ...
От: Ziaw Россия  
Дата: 29.10.08 14:25
Оценка:
Здравствуйте, samius, Вы писали:

S>А так?


Т.е. всетаки класс алгоритма умеет сам считать время? Или это экстеншн для TimeSpan?
В первом случае мы получаем дублирование кода отсчета времени в разных алгоритмах, во втором все перелести статической привязки (описаны в обоснованиях создания синглтона).
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[5]: То ли лыжи не едут ...
От: WolfHound  
Дата: 29.10.08 14:26
Оценка:
Здравствуйте, Кодт, Вы писали:

WH>> Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...

К>Низкий поклон от программистов под симбиан. И — из согнутого положения — сдавленные матюки.
Я не понял это сарказм или как?
Что там симбиановци натворили?
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 29.10.08 14:29
Оценка:
Здравствуйте, WolfHound, Вы писали:

К>>Низкий поклон от программистов под симбиан. И — из согнутого положения — сдавленные матюки.

WH>Я не понял это сарказм или как?
WH>Что там симбиановци натворили?
Ликвидировали статические переменные
Sapienti sat!
Re[14]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 14:30
Оценка:
Здравствуйте, samius, Вы писали:

S>Ужос. А если бы в алгоритме были циклы?


Конечный автомат — ему без разницы, сколько там циклов. Хоть один и бесконечный. Но это не относится к обсуждению
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[13]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 14:36
Оценка:
Здравствуйте, Sshur, Вы писали:

Начнем с того, что: ну и колбасу ты накрутил с бесконечным циклом и "ВыполнитьОчередноеДействие". Ну е-мае. Это же ничетаемо!

S>void ТестПриготовлениеЯичницы

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

S>{
S>    ts.dateTime = new DateTime(2008,1,1;
S>    Assert(ВыполнитьОчередноеДействие(1, ts,плита, миксер), false)
S>    Assert(миксер.включен, true);
S>    Assert(миксер.яйцаРазбиты, true);
S>    Assert(плита.включена, false);
S>    ts.AddSeconds(59);//через 59 секунд все еще взбивается
S>    Assert(ВыполнитьОчередноеДействие(2, ts,плита, миксер), false)
S>    Assert(миксер.включен, true);
S>    Assert(плита.включена, false);
S>}
S>

Очень вероятно получить проваленный тест на выделенных строчках из за того, что 4 строчки выше будут выполняться больше 1 сек.
Re[10]: То ли лыжи не едут ...
От: mazurkin http://mazurkin.info
Дата: 29.10.08 14:37
Оценка:
seregaa wrote:

> Для начала непонятно, почему WASHING_DURATION — не настраиваемый параметр.


Для простоты

> Тест можно повторить без сервиса времени — не меняя ни символа в тестируемом классе:

> M> application.setStartTime(Now — WASHING_DURATION);

А если счет идет на единицы миллисекунд, а между этим setStartTime и
вычислением времени внутри будет достаточно большое количество
выполняемого кода? Или если виртуальная машина в которой идет тест решит
собрать мусор в этот момент? Или операционная система на которой идет
тест решит отсвопиться?
Posted via RSDN NNTP Server 2.1 beta
Re[16]: То ли лыжи не едут ...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.08 14:39
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, samius, Вы писали:


S>>А так?


Z>Т.е. всетаки класс алгоритма умеет сам считать время? Или это экстеншн для TimeSpan?

Z>В первом случае мы получаем дублирование кода отсчета времени в разных алгоритмах, во втором все перелести статической привязки (описаны в обоснованиях создания синглтона).
Речь о Thread.Sleep()?
Просмотрел весь синглтон, там ни слова о статической привязке. Может речь об антипаттернах?
Re[7]: То ли лыжи не едут ...
От: WolfHound  
Дата: 29.10.08 14:44
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ликвидировали статические переменные

И что случилось?
Я уже несколько лет статики не использовал за ненадобностью.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: То ли лыжи не едут ...
От: seregaa Ниоткуда http://blogtani.ru
Дата: 29.10.08 14:48
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Здравствуйте, Aikin, Вы писали:



A>>Sshur, я дико извиняюсь, но "на глаз" testability у метода нулевая. Единственное что можно проверить это что метод закончил свое выполнение вовремя.

A>>Чтобы протестировать метод его нужно конкретно изменить: прошивать его "считывателями" промежуточных результатов и опять же тот самый TimeService


S>Я там писал вначале, что сам бы выбрал вариант на таймерах. А это был пример того, что для тестирования получения всех возможных вариантов времени не надо. Но если такой код уже есть, то единственным способом его протестировать будет подменить получение текущего времени, а так же методы выполнения

S>действий. Кроме того, если мы не хотим тестировать, как в Windows работают многопоточные приложения (я думаю глюков в механизме переключения потоков нет ), то придется модифицировать код, вынести логику из цикла управления. Сорри,что разбитие яиц возложил на миксер, делать еще один объект быол неохота

А если типа такого:

S>
S>class ЭлектроПовар
S>{
S>public void Приготовить(IRecipe recipe)
S>{
S>   ...
S>}
S>}
S>


S>
S>void ТестПриготовлениеЯичницы
S>{
S>    ЭлектроПовар повар = new ЭлектроПовар();
S>    IБлюдо яичница = повар.Приготовить(new Рецепт(Яйцо.Разбить, яйцо).Затем(Миксер.Взбить, 30).Затем(Плита.Поджарить, 300));
S>}

S>


при тестировании можно создавать одноходовые рецепты и задавать произвольные промежутки времени.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[17]: То ли лыжи не едут ...
От: Ziaw Россия  
Дата: 29.10.08 14:49
Оценка:
Здравствуйте, samius, Вы писали:

S>Речь о Thread.Sleep()?


Речь о твоей реализации ОтсчитатьВремя(), где она расположена?
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[8]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 29.10.08 15:05
Оценка:
Здравствуйте, WolfHound, Вы писали:

C>>Ликвидировали статические переменные

WH>И что случилось?
WH>Я уже несколько лет статики не использовал за ненадобностью.
Оказывается, что СОВСЕМ без них тоже плохо бывает.
Sapienti sat!
Re[14]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 15:06
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Здравствуйте, Sshur, Вы писали:


A>Начнем с того, что: ну и колбасу ты накрутил с бесконечным циклом и "ВыполнитьОчередноеДействие". Ну е-мае. Это же ничетаемо!


Гм, что именно нечитаемо? По моему тут как раз с читаемостью все нормально. Каждая функция легко охватывается одним взглядом.


S>>void ТестПриготовлениеЯичницы

A>А теперь, тйамсервис можно заменить на обычный таймер. Ведь все что нам нужно -- возможность отмерять время, а не узнавать сколько сейчас времени (время на моей микроволновке сбивается каждый раз когда вынимаешь вилку из розетки, но на таймер это никак не влияет).

Напоминаю, я это писал не для того чтобы показать, как лучше написать, а чтобы проиллюстрировать возможность тестирования алгоритма, когда TimeService умеет возвращать только текущее время. Оппонент помнится говорил, что в случае использования TimeService его реализация будет сложнее, чем тестируемый алгоритм.


A>
S>>{
S>>    ts.dateTime = new DateTime(2008,1,1;
S>>    Assert(ВыполнитьОчередноеДействие(1, ts,плита, миксер), false)
S>>    Assert(миксер.включен, true);
S>>    Assert(миксер.яйцаРазбиты, true);
S>>    Assert(плита.включена, false);
S>>    ts.AddSeconds(59);//через 59 секунд все еще взбивается
A>S>    Assert(ВыполнитьОчередноеДействие(2, ts,плита, миксер), false)
S>>    Assert(миксер.включен, true);
S>>    Assert(плита.включена, false);
S>>}
S>>

A>Очень вероятно получить проваленный тест на выделенных строчках из за того, что 4 строчки выше будут выполняться больше 1 сек.

Тут абсолютно все равно, сколько будет выполняться каждая строчка. Хоть час.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[14]: То ли лыжи не едут ...
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 29.10.08 15:12
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Sshur, Вы писали:


S>>Но если такой код уже есть, то единственным способом его протестировать будет подменить получение текущего времени, а так же методы выполнения


AVK>Во, вот об этом я там в комментах и писал. Телега впереди лошади. Задача "получить надежный код" подменяется задачей "написать тесты". А ведь исправление дизайна, при прочих равных, намного эффективнее написания теста. А уж если для тестов начинают дизайн портить (там рядом, в том же блоге, есть еще про тестирование статических методов) ...


Ну это уже тема для холивара на тему использовать ли TDD, или нет. В данном случае, имхо, написание тестов оправдано. ТО, что с тестами дизайн можно сделать хуже или лучше, несомненно. Кстати, если стоит только задача "получить надежный код", то тесты не нужны. Они нужны чтобы можно было получить "надежный модифицируемый код". Тут чрезмерное усложнение дизайна наверно меньшее зло, чем как попало написанный код и без тестов.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[15]: То ли лыжи не едут ...
От: Aikin Беларусь kavaleu.ru
Дата: 29.10.08 15:17
Оценка:
Здравствуйте, Sshur, Вы писали:

A>>Начнем с того, что: ну и колбасу ты накрутил с бесконечным циклом и "ВыполнитьОчередноеДействие". Ну е-мае. Это же ничетаемо!

S>Гм, что именно нечитаемо? По моему тут как раз с читаемостью все нормально. Каждая функция легко охватывается одним взглядом.
Да фигня какая-то с шагами, проверками и "вечным циклом". Ну да не будем об этом. Тебе нормально -- хорошо.

S>Тут абсолютно все равно, сколько будет выполняться каждая строчка. Хоть час.

Да, признаться, затупил



S>Напоминаю, я это писал не для того чтобы показать, как лучше написать, а чтобы проиллюстрировать возможность тестирования алгоритма, когда TimeService умеет возвращать только текущее время. Оппонент помнится говорил, что в случае использования TimeService его реализация будет сложнее, чем тестируемый алгоритм.

Вот смотри: ты каждый раз передаешь в метод ts (от которого нужен только Now) и времяНачала (которое ты забыл передать) и вычисляешь от них "(ts.Now-времяНачала).TotalSeconds" все, больше ни для чего их не используешь.
Может сразу заменить на единственный параметр secondsElapsedFromStart и забить на всякие сервисы? Нафига он вообще нужен?
Re[6]: То ли лыжи не едут ...
От: Кодт Россия  
Дата: 29.10.08 15:27
Оценка:
Здравствуйте, WolfHound, Вы писали:
К>>Низкий поклон от программистов под симбиан. И — из согнутого положения — сдавленные матюки.
WH>Я не понял это сарказм или как?
WH>Что там симбиановци натворили?

Это сарказм В симбиане нет статических переменных, поэтому все нужные синглетоны протаскиваются по ссылкам.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[9]: То ли лыжи не едут ...
От: WolfHound  
Дата: 29.10.08 15:38
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Оказывается, что СОВСЕМ без них тоже плохо бывает.

Например?
Я знаю только одно оправдание: Интероп со сторонней библиотекой который без статиков не сделать.
Если статики запрещены платформой то такие библиотеки на этой платформе никогда не появятся.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: То ли лыжи не едут ...
От: WolfHound  
Дата: 29.10.08 15:38
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это сарказм В симбиане нет статических переменных, поэтому все нужные синглетоны протаскиваются по ссылкам.

IoC применять не пробовал?
Dependency injection на плюсах сделать трудновато, а вот dependency lookup работает замечательно.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: То ли лыжи не едут ...
От: seregaa Ниоткуда http://blogtani.ru
Дата: 29.10.08 15:47
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Напоминаю, я это писал не для того чтобы показать, как лучше написать, а чтобы проиллюстрировать возможность тестирования алгоритма, когда TimeService умеет возвращать только текущее время. Оппонент помнится говорил, что в случае использования TimeService его реализация будет сложнее, чем тестируемый алгоритм.


Угу, если бы не было возможности выполнять метод по частям, то реализация сервиса была бы нетривиальной.
Ты фактически ввел в метод несколько точек входа и выхода — если это сделано только для удобства тестирования, то имхо это даже хуже навороченного сервиса времени.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[11]: То ли лыжи не едут ...
От: seregaa Ниоткуда http://blogtani.ru
Дата: 29.10.08 15:56
Оценка:
Здравствуйте, mazurkin, Вы писали:

M>вычислением времени внутри будет достаточно большое количество ...

если счет идет на миллисекунды то да, стоит задуматься о специальных механизмах тестирования и контроля.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[8]: То ли лыжи не едут ...
От: Кодт Россия  
Дата: 29.10.08 16:29
Оценка:
Здравствуйте, WolfHound, Вы писали:

К>>Это сарказм В симбиане нет статических переменных, поэтому все нужные синглетоны протаскиваются по ссылкам.

WH>IoC применять не пробовал?
WH>Dependency injection на плюсах сделать трудновато, а вот dependency lookup работает замечательно.

Слава богу, под симбиан пишет только мой коллега! И именно от него я наслушался вотзефаков.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[9]: То ли лыжи не едут ...
От: WolfHound  
Дата: 29.10.08 16:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Слава богу, под симбиан пишет только мой коллега! И именно от него я наслушался вотзефаков.

На сколько я понимаю в симбиане много других вотзефаков.
А отсутствие статиков момент сугубо положительный.
Если твой коллега имеет другое мнение по поводу статиков давай его сюда.
Пусть попробует аргументировать.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 29.10.08 16:53
Оценка:
Здравствуйте, WolfHound, Вы писали:

C>>Оказывается, что СОВСЕМ без них тоже плохо бывает.

WH>Например?
Например, у меня статик используется в коде обработки ошибок. Чтоб узнать какое окно делать parent'ом для диалога отправки stacktrace'а и имя пользователя, который программу опять сломал. Мелочь, а неудобно без неё.
Sapienti sat!
Re[11]: То ли лыжи не едут ...
От: WolfHound  
Дата: 29.10.08 17:10
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Например, у меня статик используется в коде обработки ошибок. Чтоб узнать какое окно делать parent'ом для диалога отправки stacktrace'а и имя пользователя, который программу опять сломал. Мелочь, а неудобно без неё.

И зачем тут статики?
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: То ли лыжи не едут ...
От: Кодт Россия  
Дата: 29.10.08 18:30
Оценка:
Здравствуйте, WolfHound, Вы писали:

C>>Например, у меня статик используется в коде обработки ошибок. Чтоб узнать какое окно делать parent'ом для диалога отправки stacktrace'а и имя пользователя, который программу опять сломал. Мелочь, а неудобно без неё.

WH>И зачем тут статики?

Затем, чтобы не тащить это окошко сквозь все функции (членом класса, а тем паче — ещё одним аргументом).
Очевидно, что правильный путь — это заранее побеспокоиться о таких сквозняках, и пооткрывать в нужных местах нужные форточки.
Вот только объём рефакторинга...
Плюс накладные расходы. Потому что дополнительный параметр в функцию — и она из fastcall превращается в stdcall; дополнительный член в объект — плюс 4-8 байтов на нос, плюс хвосты блоков памяти, плюс копирование и присваивание.

Не, понятно, что статики — это дорога к спагетти. Но всё же, чистыми руками неудобно рыть землю.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[14]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 29.10.08 22:12
Оценка:
Здравствуйте, WolfHound, Вы писали:

К>>Затем, чтобы не тащить это окошко сквозь все функции (членом класса, а тем паче — ещё одним аргументом).

WH>А зачем вобще таскать окошко?
WH>Что будешь делать если этот код понадобится запустить в пакетном режиме на линуховом сервере у которого даже видюхи нет?
А это как раз к коду отношения не имеет. Т.е. если метод calculateEmployeeSalary() на сервере бросит исключение, то будет корректно откачена тразнакция, а исключение записано в лог. На клиенте сработает ловец исключений в цикле событий GUI-потока, который вызовет уже мой код отсылка stacktrace'а.

Ещё стандартный пример:
public class SomeClass
{
     private static final Logger logger=Logger.getLog(SomeClass.class);
  
     void someMethod()
     {
           log.debug("Some message");
     }
}

//В файле log4j.properties:
# Turn on debug messages for SomeClass
log4j.com.somepackage.SomeClass=DEBUG


Естественно, доводить до синглтонов с бизнес логикой такое нельзя. Но и совсем без статиков — тоже плохо.
Sapienti sat!
Re[12]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 29.10.08 22:13
Оценка:
Здравствуйте, WolfHound, Вы писали:

C>>Например, у меня статик используется в коде обработки ошибок. Чтоб узнать какое окно делать parent'ом для диалога отправки stacktrace'а и имя пользователя, который программу опять сломал. Мелочь, а неудобно без неё.

WH>И зачем тут статики?
А как ты ещё передашь эти данные?
Sapienti sat!
Re[13]: То ли лыжи не едут ...
От: Аноним  
Дата: 30.10.08 03:37
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, WolfHound, Вы писали:


C>>>Например, у меня статик используется в коде обработки ошибок. Чтоб узнать какое окно делать parent'ом для диалога отправки stacktrace'а и имя пользователя, который программу опять сломал. Мелочь, а неудобно без неё.

WH>>И зачем тут статики?
C>А как ты ещё передашь эти данные?

InteractionPoint ip = (context/provider/etc)->GetInteractionPoint();
ip->ShowError(e);

InteractionPoint в context/provider/etc кладет тот, у кого есть хендл окошка/кому нужна модальность и т.п.
Re[10]: То ли лыжи не едут ...
От: NikeByNike Россия  
Дата: 30.10.08 09:31
Оценка:
Здравствуйте, WolfHound, Вы писали:

К>>Слава богу, под симбиан пишет только мой коллега! И именно от него я наслушался вотзефаков.

WH>На сколько я понимаю в симбиане много других вотзефаков.
WH>А отсутствие статиков момент сугубо положительный.
Есть там статики, самые разные
Раньше их использование было затруднено, поэтому исторически сложилось мнение, что их нет.
Нужно разобрать угил.
Re[5]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 30.10.08 15:53
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Код, использующий DateTime.Now должен иметь такой дизайн, чтобы не было потребности в тестировании таким манером, чтобы понадобилось подменять реальные значения суррогатом.


+1: криво написанный код приводит к ещё более кривым костылям при тестировании. В порыве пректирования забыли о более простых вещах.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[6]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.10.08 16:25
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR> В порыве пректирования забыли о более простых вещах.


Хуже, в порыве тестирования, если я правильно понял.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[14]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 30.10.08 16:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>InteractionPoint в context/provider/etc кладет тот, у кого есть хендл окошка/кому нужна модальность и т.п.

Это требует:
1) Передавать её параметром в большинство функций.
2) Заранее подумать о ней.

Да и DI в GUI-приложениях не так удобен.
Sapienti sat!
Re[7]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 30.10.08 16:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

_FR>> В порыве пректирования забыли о более простых вещах.


AVK>Хуже, в порыве тестирования, если я правильно понял.


Выдумывание сервисов — это уже проектирование: и не суть, для тестов оно надо или нет

Главное вот не понимают: либо в алгоритме\модуле дата должна приходить снаружи, либо _ничего_ кроме DateTime.Now там быть не должно.

Кстати, я бы кстати, спросил шире: а где (в каких участках кода или архитектуры) вообще допустимо использовать DateTime.Now? В подлежащей тестированию логике Да ни в жизнь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[16]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 30.10.08 16:48
Оценка:
Здравствуйте, _FRED_, Вы писали:

C>>Да и DI в GUI-приложениях не так удобен.

_FR> Чем же?
Почти всегда созданием иерархии контролов занимается GUI-фреймворк, он же устанавливает и их свойства и позволяет их графически редактировать.
Sapienti sat!
Re[17]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 30.10.08 17:02
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>Да и DI в GUI-приложениях не так удобен.

_FR>> Чем же?
C>Почти всегда созданием иерархии контролов занимается GUI-фреймворк, он же устанавливает и их свойства и позволяет их графически редактировать.

Понятно. Но ведь можно инжектить уже и сконструированные объекты, причём по-разному в дизайн-тайм и в ран-тайм. Да, будет лишний шаг, но не кривой и не сложный.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[4]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 30.10.08 17:15
Оценка:
Здравствуйте, WolfHound, Вы писали:

AVK>>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?

WH>Да.
WH>Более того лично я чем больше думаю тем сильнее склоняюсь к мысли что "функции" типа DateTime.Now, File.Open,... вобще должны быть запрещены на уровне системы типов. Просто запрещаем статические переменные, и так как данные "функции" невозможно реализовать без статических переменных...

А как быть, например, с DependencyProperty?

Во-вторых, это ведёт к тому, что DI дожен уже быть в самой стандартной библиотеке, так как будет нужен и стандартным классам, например, TransactionScope или SqlCollection.

Гхм, может оно и не плохо. А есть уже среды, которые так реализованы (c DI как базовым механизмом)?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[18]: То ли лыжи не едут ...
От: Cyberax Марс  
Дата: 30.10.08 17:25
Оценка:
Здравствуйте, _FRED_, Вы писали:

C>>Почти всегда созданием иерархии контролов занимается GUI-фреймворк, он же устанавливает и их свойства и позволяет их графически редактировать.

_FR>Понятно. Но ведь можно инжектить уже и сконструированные объекты, причём по-разному в дизайн-тайм и в ран-тайм. Да, будет лишний шаг, но не кривой и не сложный.
А смысл? GUI-фреймворки неплохо справляются с этим. А делать DI ради DI я просто смысла не вижу.
Sapienti sat!
Re[5]: То ли лыжи не едут ...
От: WolfHound  
Дата: 30.10.08 18:05
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А как быть, например, с DependencyProperty?

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

Все что нужно это задизайнить DependencyProperty неизменяемым.

_FR>Во-вторых, это ведёт к тому, что DI дожен уже быть в самой стандартной библиотеке, так как будет нужен и стандартным классам, например, TransactionScope или SqlCollection.

Ну напишут разработчики стандартной библиотеки IoC контейнер и все.

_FR>Гхм, может оно и не плохо. А есть уже среды, которые так реализованы (c DI как базовым механизмом)?

ХЗ.
Но если пытатся делать безопасность на всю катушку то по другому не получится никак.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 30.10.08 19:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

_FR>>А как быть, например, с DependencyProperty?

WH>

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

WH>Все что нужно это задизайнить DependencyProperty неизменяемым.

Ага, если отказаться от изменяемых статических данных, то +100.

_FR>>Во-вторых, это ведёт к тому, что DI дожен уже быть в самой стандартной библиотеке, так как будет нужен и стандартным классам, например, TransactionScope или SqlCollection.

WH>Ну напишут разработчики стандартной библиотеки IoC контейнер и все.

Если сейчас уже несколько контейнеров на слуху, то "один стандартный" многим не понравится, придётся "скрещивать" и т.п. Или несколько контейнеров разной природы могут органично существовать в рамках одного проекта? Есть у кого опыт?
Help will always be given at Hogwarts to those who ask for it.
Re[8]: То ли лыжи не едут ...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.10.08 21:51
Оценка:
Здравствуйте, _FRED_, Вы писали:

AVK>>Хуже, в порыве тестирования, если я правильно понял.


_FR>Выдумывание сервисов — это уже проектирование: и не суть, для тестов оно надо или нет


Тут главное обоснование — не делаем нормальную архитектуру, потому что код трогать сильно нельзя, но, поскольку затестить не получается, ломаем по месту не оглядываясь на архитектуру в целом.
Там рядом еще такой пост есть, все на ту же тему.

_FR>Кстати, я бы кстати, спросил шире: а где (в каких участках кода или архитектуры) вообще допустимо использовать DateTime.Now? В подлежащей тестированию логике Да ни в жизнь.


Ну, это уже второй вопрос. Главное, на что я хотел обратить внимание — с какой легкостью начинает наворачиваться дизайн по месту, не задумываясь о последствиях для рабочего кода.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[19]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 31.10.08 06:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>Почти всегда созданием иерархии контролов занимается GUI-фреймворк, он же устанавливает и их свойства и позволяет их графически редактировать.

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

Что ты имеешь в виду под "этим"? Мы говорим о инжекции зависимостей. Какой GUI-фреймворк "неплохо справляются с этим"?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[9]: То ли лыжи не едут ...
От: _FRED_ Черногория
Дата: 31.10.08 06:39
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>>>Хуже, в порыве тестирования, если я правильно понял.

_FR>>Выдумывание сервисов — это уже проектирование: и не суть, для тестов оно надо или нет
AVK>Тут главное обоснование — не делаем нормальную архитектуру, потому что код трогать сильно нельзя, но, поскольку затестить не получается, ломаем по месту не оглядываясь на архитектуру в целом.

Мне кажется, что раз назрела необходимость нормально оттестировать, то "код трогать сильно" необходимо. Тут как раз "половинчатые" решения себе дороже.

AVK>Там рядом еще такой пост есть, все на ту же тему.


Да, то же самое: переписать нормально не может, но кастылей понафтыкаем
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re: То ли лыжи не едут ...
От: vdimas Россия  
Дата: 10.11.08 09:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Наткнулся тут на запись в блоге. Было бы интересно услышать, кто что думает об этом коде.


Ошибка проектирования, что же еще. Это как в том нашем давнем споре про паттерны, где я привёл пример, когда люди вместо решения конкретной задачи пытались просто нагородить известные им паттерны, на том лишь основании, что паттерны — это круто.

По ссылке кому-то вот хотелось DI, хотя ответ содержится в постановке задачи. Если возникло требование подавать "текущее время" извне, дык его надо и подавать извне. И сразу же станет очевидным следующее решение (уже указанное Геной), кто и что должен контроллировать относительно времени жизни.

Мне лично топик показался интересным именно из-за DateTime.Now, ибо он — популярный источник странных ошибок. У нас в проекте DateTime.Now дай бог в одном-двух местах максимум вызывается, в другие места передаётся как параметр/контекст (и подобных проблем с тестированием не возникает, разумеется).
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[4]: То ли лыжи не едут ...
От: dimgel Россия https://github.com/dimgel
Дата: 14.11.08 00:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

AVK>>Т.е. ты считаешь нормальным заменять DateTime.Now на сервис?

C>Да. Например, мне нужно тестировать логику, зависящую от текущего времени. Как ты предлагаешь иначе это делать?

+1, но я не понял, почему в там все методы static? Разве не удобнее сделать интерфейс ICurrentTime и получать реализацию (CurrentTime vs CurrentTimeStub) от какого-нибудь провайдера?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.