Size: a a a

2020 December 01

KB

Kit Bayun in Delphi & Lazarus
Что-то я не понимаю... зачем скидка на Free edition?
источник

SB

Sergey Bodrov in Delphi & Lazarus
Kit Bayun
Что-то я не понимаю... зачем скидка на Free edition?
В два раза бесплатнее?
источник

SB

Sergey Bodrov in Delphi & Lazarus
Сергей Пятыгин
Поделитесь опытом по отделению представления от модели.

Вот конкретный пример:
Есть два юнита=модели (классы с наследниками).
1. u_systemmagnetic

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_systemmagnetic.pas#L1

2. u_noload

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_noload.pas#L1

Есть юнит представление u_main

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L1

Есть контроллер, в виде класса-потока TMainThread в u_main.

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L42

Не могу понять, является это полным разделением модель-представление-контроллер или нет.
С одной стороны, u_systemmagnetic и u_noload полностью независимы, не содержат в implementation uses с u_main и могут быть подвергнуты ЮнитТестированию.
С другой стороны, контроллер находиться в одном юните с представлением и представление содержит в interface uses ссылки на u_systemmagnetic и u_noload.
А если контроллера вынести в отдельный юнит (u_main в uses будет содержать некий u_thread, а  u_thread в uses будет содержать u_systemmagnetic и u_noload), то как ему передать данные из представления, ведь в новом юните ему будут не видны классы представления (и опять возникнет вопрос который возник ранее-где освободить классы данных переданные в контролер из представления)?

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L139
В u_main.pas зачем-то сделан TMainThread = class(TThread), который читает данные из формы. Не надо так делать. Основной поток - это и есть сами формы.
источник

KB

Kit Bayun in Delphi & Lazarus
А вообще, кто-то пользовался этим волшебником "Delphi Code Analysis Wizard"? Ну прогнал он проект, показал количество строк кода, количество еще чего-то там, а толку с него?
источник

KB

Kit Bayun in Delphi & Lazarus
посмотрел цену enterprise версии - $1500 , чем он такой волшебный, что он так дорого стоит?
источник

SB

Sergey Bodrov in Delphi & Lazarus
Сергей Пятыгин
Поделитесь опытом по отделению представления от модели.

Вот конкретный пример:
Есть два юнита=модели (классы с наследниками).
1. u_systemmagnetic

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_systemmagnetic.pas#L1

2. u_noload

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_noload.pas#L1

Есть юнит представление u_main

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L1

Есть контроллер, в виде класса-потока TMainThread в u_main.

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L42

Не могу понять, является это полным разделением модель-представление-контроллер или нет.
С одной стороны, u_systemmagnetic и u_noload полностью независимы, не содержат в implementation uses с u_main и могут быть подвергнуты ЮнитТестированию.
С другой стороны, контроллер находиться в одном юните с представлением и представление содержит в interface uses ссылки на u_systemmagnetic и u_noload.
А если контроллера вынести в отдельный юнит (u_main в uses будет содержать некий u_thread, а  u_thread в uses будет содержать u_systemmagnetic и u_noload), то как ему передать данные из представления, ведь в новом юните ему будут не видны классы представления (и опять возникнет вопрос который возник ранее-где освободить классы данных переданные в контролер из представления)?

https://github.com/PyatyginSY/NoLoad/blob/01ff3ac55371bb9906ff7979ff4f1c12013fee14/u_main.pas#L139
Еще после каждого IniFile.WriteString выполняется Application.ProcessMessages; От этого тормозов только прибавится. Лучше в TIniFile включить кеширование или сразу использовать TMemIniFile. Тогда запись нескольких тысяч параметров займет доли секунды.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
C ассертами все просто и понятно, они ловят аномалии и некорректные параметры. Могут через месяц успешной работы поймать какую-нибудь аномалию железа или ОС. А тесты так могут?
дык, ты ставишь другую цель перед таким тестированием
из того, что ты говоришь, следуует,  что ты тестируешь "ОС или железо ))

а я говорю про тестирование поведения программы
источник

SB

Sergey Bodrov in Delphi & Lazarus
Kit Bayun
посмотрел цену enterprise версии - $1500 , чем он такой волшебный, что он так дорого стоит?
Видимо, для галер, код гребцов-джуниоров проверять.
источник

СП

Сергей Пятыгин... in Delphi & Lazarus
Sergey Bodrov
В u_main.pas зачем-то сделан TMainThread = class(TThread), который читает данные из формы. Не надо так делать. Основной поток - это и есть сами формы.
В этой версии я пробовал изначально передать данные с гуи в поток через класс данных, соответственно его нужно было создать и уничтожить.  при уничтожении после запуска потока, так как поток отдельно а данные уже уничтожены была ошибка. Мне посоветовали чтение данных проводить в потоке.

Как оптимально передавать класс данных в поток?
источник

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
Видимо, для галер, код гребцов-джуниоров проверять.
где они , галеры на делфи? ))))
источник

SB

Sergey Bodrov in Delphi & Lazarus
Alexey Shumkin
дык, ты ставишь другую цель перед таким тестированием
из того, что ты говоришь, следуует,  что ты тестируешь "ОС или железо ))

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

СП

Сергей Пятыгин... in Delphi & Lazarus
Sergey Bodrov
Еще после каждого IniFile.WriteString выполняется Application.ProcessMessages; От этого тормозов только прибавится. Лучше в TIniFile включить кеширование или сразу использовать TMemIniFile. Тогда запись нескольких тысяч параметров займет доли секунды.
Это микроприложение из разряда "иди на кошках тренируйся". В основной версии именно TMemIniFile. Но  это наверное не окончательный вариант.

Вообще если есть возможность и желание, то мне хотелось бы получить побольше замечаний по "запаху" в коде.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
Поведение тестируется эмулятором приборов и сценариями (макросами) имитирующими действия пользователей (клики мышкой, ввод текста).
ну это почти вверху пирамиды тестирования  (UI тестирование ))
источник

SB

Sergey Bodrov in Delphi & Lazarus
Сергей Пятыгин
В этой версии я пробовал изначально передать данные с гуи в поток через класс данных, соответственно его нужно было создать и уничтожить.  при уничтожении после запуска потока, так как поток отдельно а данные уже уничтожены была ошибка. Мне посоветовали чтение данных проводить в потоке.

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

СП

Сергей Пятыгин... in Delphi & Lazarus
Sergey Bodrov
В поток надо передавать данные, а не классы. Класс это ссылка, указатель, он не содержит данных. Поток по этой ссылке будет обращаться к данным, находящимся где-то в общей памяти (в куче). И так же другие потоки могут к общей памяти обращаться и конфликтовать.
В принципе, в поток можно и класс передать, но при этом ставить признак блокировки, чтобы другие потоки этот класс не трогали.
Так как данных=параметров много, я для них создал специальный класс, чтобы передать одним параметром.
источник

KB

Kit Bayun in Delphi & Lazarus
Sergey Bodrov
Видимо, для галер, код гребцов-джуниоров проверять.
как правило, Дельфи использую внутри корпораций фирм, где работают 1-3 программиста над собственными внутренними продуктами. Т.е. одной копии вполне достаточно. Не видел я (почти не видел) фирм, где массово используют Дельфи для написания софта на продажу. Вот в Харькове есть Глобаллоджик, довольно огромная фирма и все, больше не видел.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Alexey Shumkin
ну это почти вверху пирамиды тестирования  (UI тестирование ))
Мне от предшественника досталась куча юнит-тестов, там кода было больше, чем в основном проекте. И хотя тесты проходили успешно, система дико тормозила и глючила. То есть, с точки зрения программиста все хорошо, а с точки зрения пользователя прога виснет или падает каждые полчаса работы. Чье мнение важнее начальству? =)
источник

I

Igor in Delphi & Lazarus
вывод: тесты тестировали не то, что нужно
источник

SB

Sergey Bodrov in Delphi & Lazarus
Сергей Пятыгин
Так как данных=параметров много, я для них создал специальный класс, чтобы передать одним параметром.
Предлагаю сделать в классе метод Assign(), который копирует все свойства экземпляра класса в другой экземпляр того же класса. В идеале внутри Assign используется CriticalSection. При создании потока, внутри Execute создавать отдельный экземпляр класса, и снаружи потока (из кнопки формы, нпример) делать Assign данных из класса данных формы в класс данных потока. Или наоборот, Assign данных из потока в форму.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Igor
вывод: тесты тестировали не то, что нужно
Нет, они все нормально тестировали, работу отдельных функций и методов. Но юнит-тесты не могут проверить работу приложения в целом.
источник