tag:blogger.com,1999:blog-8278700074442979782.post7852360344531957862..comments2023-07-12T12:53:44.630+02:00Comments on "Поток сознания" о тестировании и программировании: Тестируем калькулятор №3. Расширяем тестовое покрытиеAlex W. Lulinhttp://www.blogger.com/profile/08400475846894229767noreply@blogger.comBlogger26125tag:blogger.com,1999:blog-8278700074442979782.post-33561851901444567762014-02-28T18:32:43.765+03:002014-02-28T18:32:43.765+03:00>Ввод (Fractional a, Num a) => a -> IO ()...>Ввод (Fractional a, Num a) => a -> IO (), вывод (Fractional a, Num a) => IO a.<br /><br />Можно просто a -> IO () и IO a. Так даже абстрактнее. =)Son of a gunnoreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-65943743513022476092014-02-28T18:29:55.105+03:002014-02-28T18:29:55.105+03:00>Интерфейс - это механизм
Я тоже самое написал...>Интерфейс - это механизм<br /><br />Я тоже самое написал, читайте внимательнее. Дальнейшие рассуждения не имеют смысла.<br /><br />>Классический индикатор зауженного и формального сознания. Делаю так, как учили в школе.<br /><br />На хабре Вас не научили, что все эти Ваши игры в психологов, задорновщину и прочую угадайку, не работают? Ни на йоту же не попадаете. =)<br /><br />>Слабая попытка поймать на терминах, коллега. <br /><br />На самом деле не было никакой попытки, просто поправил. Спокойно.<br /><br />>А Вы помните, почему их так называют? Только с точки зрения компилятора (и то не любого). Проблемы инстанцирования<br /><br />Вы путаете причину и следствие. Абстрактные классы так называют прежде всего потому, что они призваны обеспечить слой абстракции.<br /><br />>Или абстрактную кнопку? :)<br /><br />Можно просто IO (), если хотите. =)<br />Ввод (Fractional a, Num a) => a -> IO (), вывод (Fractional a, Num a) => IO a.<br />Ещё глупые вопросы будут?Son of a gunnoreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-9941041554862309242014-02-28T09:39:56.120+03:002014-02-28T09:39:56.120+03:00>>и кнопку, в качестве своих параметров.
А...>>и кнопку, в качестве своих параметров. <br /><br />А какую? FMX.StdCtrls.TButton или VCL.StdCtrls.TButton?<br />Или абстрактную кнопку? :)Всеволодhttps://www.blogger.com/profile/12019078643087543460noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-65351410785659565982014-02-28T09:27:39.492+03:002014-02-28T09:27:39.492+03:00>>Интерфейс это механизм абстракции
Интерф...>>Интерфейс это механизм абстракции <br /><br />Интерфейс - это механизм. Абстракция есть некая идея, которую можно поддержать "виртуальными" и "чисто виртуальными" методами, что есть "интерфейсы" в отдельной ООП концепции. Но называть "розетку" (=интерфейс) или "разъем USB" абстракцией... Однозначно сказывается "книжное" воспитание и нежелание мыслить чуть шире, чем забито в справочной системе по конкретным тулзам.<br /><br />>>не надо пустословить.<br />Классический индикатор зауженного и формального сознания. Делаю так, как учили в школе. <br /><br />>>Не "чистым", а "чисто виртуальным" классам. <br />Слово "чистые" было взято в кавычки. Если уж следовать книжным традициям, то кавычки означают отход от жёсткой трактовки. Слабая попытка поймать на терминах, коллега. <br /><br />>>Хотя обычно их называют "абстрактные классы", что как-бы намекает. =)<br />А Вы помните, почему их так называют? Только с точки зрения компилятора (и то не любого). Проблемы инстанцирования. Где-то warning с abstraction error, где-то compilation error. Никто ни на что не намекает, есть конретные проблемы компиляции и времени исполнения в случае инстанцирования "абстрактных" классов.<br /><br />Ещё раз - есть "абстракция" как способ избежания дублирования (поддержанная наследованием и полиморфизмом).<br />Есть "абстракция" как классификационный признак при работе компилятора.<br />Есть "абстракция" как метод умозрительной трактовки сущностей. <br /><br />Редкая книга пишет сразу об этом. Чаще всего, книжка описывает лишь один из трёх пунктов. <br /><br />>>Написал бы функцию<br />Частица "бы" очень многое объясняет при трактовке мотивационной составляющей Ваших комментариев. <br />Всеволодhttps://www.blogger.com/profile/12019078643087543460noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-67820944646295195752014-02-28T00:13:21.876+03:002014-02-28T00:13:21.876+03:00:-) продолжу :-) обязательно продолжу:-) продолжу :-) обязательно продолжуAlex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-30984915114742958802014-02-28T00:05:13.474+03:002014-02-28T00:05:13.474+03:00Мне понравилось. Продолжайте, пожалуйста.Мне понравилось. Продолжайте, пожалуйста.Николай Зверевhttps://www.blogger.com/profile/08965247674233981930noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-75800285504428420552014-02-27T23:17:55.772+03:002014-02-27T23:17:55.772+03:00Я кстати отдельным постом пожалуй напишу как преоб...Я кстати отдельным постом пожалуй напишу как преобразовать этот тест в несколько иной, с использованием:<br /><br />Buttons : array [TOperation] of TButton = (Button1, Button2, Button3, Button4);<br />Ops : array [TOperation] of reference to function (a, b: double) : double = (function (a, b : bouble) : double begin result := a + b end, function (a, b : bouble) : double begin result := a - b end, function (a, b : bouble) : double begin result := a * b end, function (a, b : bouble) : double begin result := a / b end);Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-76359400584139739562014-02-27T23:12:32.149+03:002014-02-27T23:12:32.149+03:00Правда ОТДЕЛЬНОСТОЯЩАЯ функция - ничуть НЕ ЛУЧШЕ, ...Правда ОТДЕЛЬНОСТОЯЩАЯ функция - ничуть НЕ ЛУЧШЕ, функции класса. ОБА подхода - равноценны. Ничего "ужасного" ни в том, ни в другом - не вижу.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-60771399810551117892014-02-27T22:44:09.085+03:002014-02-27T22:44:09.085+03:00Одно только но. Которое я писал Роману. Я "ду...Одно только но. Которое я писал Роману. Я "думал вперёд" (что может быть и ПРЕЖДЕВРЕМЕННО) - об избавлении от нажатия на кнопки.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-92131806985620073062014-02-27T22:40:55.057+03:002014-02-27T22:40:55.057+03:00"Написал бы функцию, принимающую функцию от д..."Написал бы функцию, принимающую функцию от двух чисел и кнопку, в качестве своих параметров. Затем просто применил бы её для соответствующего набора кнопок и операторов."<br /><br />-- вот тут - согласен.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-20158262895514849422014-02-27T22:09:02.433+03:002014-02-27T22:09:02.433+03:00> Связывание "абстракции" неспосредст...> Связывание "абстракции" неспосредственно с наследованием есть результат зауженного книжками мышления. Если учиться по книжкам, то всегда будешь чуть хуже автора книжек. В какой-то момент нужно чуть расширить сознание.<br /><br />Ко мне это не относится, я не учу по книгам. Когда я говорил об абстракции, я говорил об этом: "АБСТРАКТНЫЙ тест - TOperationTest.".<br /><br />>Давайте посмотрим на пример Александра. Идёт "операционное разделение" методов по категориям классов. Здесь слово "класс" (наконец) начинает означать то, что и должно. Элемент классификации. <br /><br />Нет здесь никакой "классификации", только странная, неочивидная архитектура. Запросто можно было написать проще и гибче. По этому я и называю её "плохой".<br /><br />>Опять же - интефейсы (как другой пример). Они - не абстрактны!<br /><br />Интерфейс это механизм абстракции, не надо пустословить.<br /><br />>чистым классам в С++<br /><br />Не "чистым", а "чисто виртуальным" классам. Хотя обычно их называют "абстрактные классы", что как-бы намекает. =)<br /><br />>Как бы Вы написали это код "хорошо" ?<br /><br />Написал бы функцию, принимающую функцию от двух чисел и кнопку, в качестве своих параметров. Затем просто применил бы её для соответствующего набора кнопок и операторов.<br /><br />Пример на хаскеле: http://pastebin.com/RwkA2CTASon of a gunnoreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-43310225235803161472014-02-27T18:32:01.642+03:002014-02-27T18:32:01.642+03:00>>У меня для Вас плохие новости - в этом нас...>>У меня для Вас плохие новости - в этом наследовании нет никакой абстракции. <br /><br />Связывание "абстракции" неспосредственно с наследованием есть результат зауженного книжками мышления. Если учиться по книжкам, то всегда будешь чуть хуже автора книжек. В какой-то момент нужно чуть расширить сознание. Кстати, даже такой маститый гуру как Страуструп говорит, что "я придумал С++ так, как я его видел... но вы можете/должны применять его так, как вам удобно для решения ваших задач". <br /><br />Например: наследование есть ПРОСТО МЕХАНИЗМ РАЗДЕЛЕНИЯ КОДА. И не обязательно в контексте "абстрактное-конкретное". Все-таки "абстрактное-конкретное" отличается от "общее-частное". <br />Молоток - общее, молоток с гвоздодёром - частное. А есть еще и с обрезиненной ручкой. Все три объекта (класса) весьма конкретны, но наследование здесь бесспорно.<br /><br />Давайте посмотрим на пример Александра. Идёт "операционное разделение" методов по категориям классов. Здесь слово "класс" (наконец) начинает означать то, что и должно. Элемент классификации. <br />И классификация может быть многопараметрической, точнее может/должно быть МНОГО классификаций. Александр применил "наследование" в чистом виде как средство разделения (структуризации) кода. <br /><br />Опять же - интефейсы (как другой пример). Они - не абстрактны! Они - функционально конкретны. Что может быть функционально-конкретнее IUnknown? Но никто не протестует против "втискивание" интерфейсов в единый класс-реализацию. Согласитесь, здесь вообще нет "абстрактное-конкретное". Есть конкретный функциональный набор, разбросанный по разным I-интефейсам (чистым классам в С++), который конкретно в-реализуется в уже реальном классе (не абстрактном в плане без чисто виртуальных функций). <br /><br />И вот эта "свёртка" интерфейсов в реализационный класс и есть у Александра, только наоборот :) Т.е. правильно - сверху вниз, когда общий (но НЕ абстрактный) функционал распадается на конкретные функциональные конгломераты (объединенные общим предком). Это просто способ построить функционально-тестирующую модель в иерархическом виде. <br /><br />Вот и сказочке конец, кто не понял - F1.<br />Всеволодhttps://www.blogger.com/profile/12019078643087543460noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-51659940484798889322014-02-27T17:59:56.364+03:002014-02-27T17:59:56.364+03:00Son of a gun
Как бы Вы написали это код "хор...Son of a gun <br />Как бы Вы написали это код "хорошо" ?Ingwordhttps://www.blogger.com/profile/10969370701744032583noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-34375115332360729222014-02-26T17:31:03.599+03:002014-02-26T17:31:03.599+03:00У меня для Вас плохие новости - в этом наследовани...У меня для Вас плохие новости - в этом наследовании нет никакой абстракции. <br />Не удивлюсь, если я не знаю чего-либо, что делает этот код "хорошим", но пока для меня это выглядит как "очень плохой" код ._.Son of a gunnoreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-15151785065395346792014-02-26T00:59:51.286+03:002014-02-26T00:59:51.286+03:00"насколько я помню форму mdiChild нельзя сдел..."насколько я помню форму mdiChild нельзя сделать без главного окна, и стает вопрос как это сделать для тестирования ?"<br /><br />Это в копилку вот к чему - http://programmingmindstream.blogspot.ru/2014/02/2.html?showComment=1393364099651#c6835117592870444331<br /><br />Если форма создана ЗАКОННЫМИ СРЕДСТВАМИ приложения, то она - ТЕСТИРУЕМА.<br /><br />Если хочется что-то "эмулировать" - то можно "помудрить". Например не ставить MDIChild в Design-time, а ставить его в Run-time.<br /><br />А можно и не "мудрить", а сделать Factory Mathod или Dependency Injection.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-9029468864083286002014-02-26T00:10:18.749+03:002014-02-26T00:10:18.749+03:00насколько я помню форму mdiChild нельзя сделать бе...насколько я помню форму mdiChild нельзя сделать без главного окна, и стает вопрос как это сделать для тестирования ? Ingwordhttps://www.blogger.com/profile/10969370701744032583noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-82882558698929437932014-02-25T23:46:43.092+03:002014-02-25T23:46:43.092+03:00"Форма и тесты поднимаются в dpr на уровне за..."Форма и тесты поднимаются в dpr на уровне запуска программы. Хотелось бы отделения формы от приложения. :)"<br /><br />-- я эту проблему решаю ОТДЕЛЬНЫМ приложением ТЕСТОВЫМ, которое КОПИРУЕТ ВЕСЬ функционал "настоящего" и генерируется из UML. "Обычным" же людям, у которых нет кодогенерации для начала могу порекомендовать использование IfDef.<br /><br />Я предвидел этот вопрос, но забыл...Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-90685717060184669172014-02-25T23:17:35.074+03:002014-02-25T23:17:35.074+03:00Форма и тесты поднимаются в dpr на уровне запуска ...Форма и тесты поднимаются в dpr на уровне запуска программы. Хотелось бы отделения формы от приложения. :) Ingwordhttps://www.blogger.com/profile/10969370701744032583noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-65919587994645250402014-02-25T23:13:46.605+03:002014-02-25T23:13:46.605+03:00Извините не понял, где мы TOperationTest поднимаем...Извините не понял, где мы TOperationTest поднимаем, и MainForm собственно ? <br />Ingwordhttps://www.blogger.com/profile/10969370701744032583noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-76514397792830997822014-02-24T22:52:13.850+03:002014-02-24T22:52:13.850+03:00Ну для меня лично наследование (как впрочем и прим...Ну для меня лично наследование (как впрочем и примеси) - это чисто "техническая вещь", а не концептуальная. Мне что один класс, что десять - всё едино. Я на классы смотрю лишь как на "зоны ответственности". Надеюсь, что наследование "неофитам" мозг не порвёт.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-64248512705574443952014-02-24T14:45:08.617+03:002014-02-24T14:45:08.617+03:00Ну дело твое. Тут все абсолютно правильно, техниче...Ну дело твое. Тут все абсолютно правильно, технически упрекать не в чем. Просто мне казалось, что цель данного конкретного примера - показать простой путь. Ну чтобы неофиты могли понять суть, не отвлекаясь на технически изощренные вещи.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-23145947431223235712014-02-24T01:35:39.708+03:002014-02-24T01:35:39.708+03:00И ещё. В работе над тестами я лично предпочитаю из...И ещё. В работе над тестами я лично предпочитаю из КОНКРЕТНЫХ тестов выделять АБСТРАКТНЫЕ (параметризуемые), чтобы из них потом сделать НОВЫЕ конкретные. И так по кругу. Так "мышечная масса" тестов очень хорошо нарастает. Опять же - может быть тут это и ПРЕЖДЕВРЕМЕННО. Но есть уже просто "наработанные стереотипы" мышления.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-81784175438651930672014-02-23T22:15:01.198+03:002014-02-23T22:15:01.198+03:00Да и привык я как-то "нарезать классы тонкими...Да и привык я как-то "нарезать классы тонкими ломтями". Каждому по "маленькому кусочку ответственности".Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-12688171206874667372014-02-23T00:46:10.565+03:002014-02-23T00:46:10.565+03:00Ну плюс - "мысли забежали несколько вперёд&qu...Ну плюс - "мысли забежали несколько вперёд". Я думал о параметризации тестов. Может быть ЗРЯ. На ДАННОМ этапе.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-8278700074442979782.post-1202382101797982962014-02-23T00:40:03.034+03:002014-02-23T00:40:03.034+03:00Думаешь? Ну может быть. Я подумаю.
Просто мне лич...Думаешь? Ну может быть. Я подумаю.<br /><br />Просто мне лично так - оказалось проще написать.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.com