|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
|
Применение рефакторинга для увеличения тестируемости кода13.02.2016, 09:54. Показов 1347. Ответов 7
Мои цели:
1) Высокая читаемость кода 2) Легкость тестирования кода (юнит тесты, интеграционные тесты, приемочные тесты) 3) Высокая модульность кода 4) Возможность повторного использования кода Конкретная задача (может быть использована для людей, которые предпочитают показывать на примере): Кликните здесь для просмотра всего текста
Необходимо скопировать набор файлов из одной папки в другую.
На этапе компиляции известны: Имена всех файлов, путь до папки из которой копируют, путь до папки куда копируют. Дополнительные требования: графический интерфейс должен отображать имя копируемого в данный момент файла. Объем оперативной памяти меньше чем размер копируемых файлов, копировать файлы нужно небольшими порциями, размер порции известен на этапе компиляции. Прогресс копирования конкретного файла должен отображаться в виде прогресс бара на графическом интерфейсе. Реализация общения с файловой системой, а так же графический интерфейс реализуются с использованием Qt-4.8 Далее предположим, что данная задача или подобная ей реализована в виде одного god-like класса, этот класс содержит 500-2000 строк кода. В нем заданы все константы, осуществлена наиболее примитивная декомпозиция на методы. Класс не содержит кода по отображению GUI - эта логика вынесена в другой модуль с которым идет общение через интерфейс (или через сигналы Qt). Код является полной противоположностью поставленных целей. Необходимо покрыть его тестами на 70-100 процентов. Вопросы: Какой из типов швов следует применять по умолчанию, при решении о увеличении модульности/тестируемости некоторого god-like класса? (Швы по Майклу Физерсу) Каким образом Вы производили бы декомпозицию задачи и до какой степени разделения (от чего зависела бы эта степень) ? В каком случае Вы применяли бы рефакторинг извлечение класса и в каком - дополнительно, извлечение интерфейса? По каким признакам Вы определили бы, что в дополнительном выделении классов отсутствует необходимость? Как при этом Вы предпочли бы управлять памятью и на каком уровне инвертировать зависимости? (DIP из SOLID) В чем моя проблема: Кликните здесь для просмотра всего текста
Ловлю себя на мысли, что не знаю где следует остановиться. В попытке максимального покрытия кода тестами сталкиваюсь с тем, что проще всего тестировать, если в каждый из взаимодействующих классов через конструкторы внедряются все зависимости, с которыми ему предстоит работать. Но это порождает достаточно большой набор базовых интерфейсов, например по представленной задаче абстракции которые я смог выделить: Файловая система, файл, объект ввода-вывода, абстракция копирования по частям, абстракция копирования из файла в файл, абстракция копирования множества зарегистрированных путей в одну заданную папку, интерфейс вывода прогресса, интерфейс вывода имени копируемого файла и т.д. Я такой сепарации практически нигде не видел, поэтому и задаюсь вопросом как другие программисты применяют рефакторинги и к чему они приходят в итоге.
0
|
|
| 13.02.2016, 09:54 | |
|
Ответы с готовыми решениями:
7
Загрузка элементов класса откуда-то для увеличения читабельности кода Возможно ли применение сетей Петри для улучшения качества кода и реверс инжинеринга?
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|||||
| 13.02.2016, 13:15 | |||||
|
1) кол-во времени, потраченное на изменение 2) кол-во профита, от это изменения полученного. Из всех возможных выбираем изменение с максимальным соотношением профит/время, производим его. Повторяем по желанию до тех пор, пока не останутся только те изменения, профит от которых не окупает потраченное время.
0
|
|||||
|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
||
| 13.02.2016, 14:33 [ТС] | ||
|
ct0r, в данном конкретном случае причина начала рефакторинга никак не связана ни с самим легаси кодом, ни с тем, какие бизнес проблемы он решает в данный момент и сможет решать после проведения рефакторинга. Целью данной активности в конечном счете является как раз приобретение необходимых навыков/подходов при решении подобных задач в реальных условиях. В общем случае ставится задача получения опыта в проведении рефакторингов без (или с минимальным количеством) ошибок в условиях большого объема кода не покрытого тестами, приобретения навыков тестирования для предотвращения регрессии кода при внесении изменений (связанных с изменениями в бизнес-правилах). А так же освоения методологии разработки через тестирования.
100 процентов покрытия - выбраны как идеальный случай, к которому я стремлюсь, 70 процентов как случай достаточного покрытия, предполагающий тестирование бизнес логики, и критических сегментов кода без необходимости тестировать не используемые при решаемой задаче возможности, либо код связывания элементов логики в единое целое (которое может быть перекрыто статическим анализом, корректной компиляцией, приемочным тестированием и т.д.)
Если Вам хотелось услышать примеры обоснования первопричин проведения рефакторингов и покрытия тестами, по приведенной задаче, я могу синтезировать пару, тройку. Относительно глобальной ситуации: 1) менеджмент по итогам прошедшего года пришел к выводу, что группа программистов не справляется с поставленными задачами в срок и качество продукта ниже заявленного, новый тех. лид. проекта принимает решение о последовательном изменении методологии разработки, постулируется необходимость покрывать новый код и изменения в старый код тестами перед тем как он попадет на ревью. 2) В унаследованный проект для его поддержки и модификации нанята группа программистов - цель номер один - не допустить регрессии существующего кода, цель номер два, увеличить скорость добавления новых фич в проект, цель номер три понять как работает уже написанный код - для решения этих целей среди прочих выбрано дополнительное покрытие тестами. 3) Сотрудник отдела ведет подрывную деятельность на предприятии и безнаказанно занимается рефакторингом легаси кода. Локально по коду: 1) Изначально код копировал файлы целиком, теперь появилась необходимость копировать по частям, поскольку изменились требования к системе. 2) Изначально код копировал файлы по частям, теперь появилась необходимость для множества маленьких файлов выполнять один способ копирования, а для других другой. 3) Изначально код копировал файлы по одному, теперь процесс необходимо распараллелить по носителям. 4) Изначально код копировал известный на этапе компиляции набор файлов, теперь пользователю необходимо дать возможность включить/исключить некоторые из них 5) Изначально код копировал файлы локально, теперь требуется посылать команды на удаленную машину. 6) Изначально код копировал файлы, а теперь он должен их перемещать с гарантией удаления информации с изначальной позиции считывания. 7) Изначально код решал одну из выше перечисленных задач, теперь требуется написать на его основе небольшую библиотеку классов, используемую в компании для решения каждой из представленных задач без необходимости переписывать общую для алгоритма часть.
0
|
||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|||||
| 13.02.2016, 15:07 | |||||
|
0
|
|||||
|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
||
| 13.02.2016, 15:43 [ТС] | ||
|
ct0r, Вопрос не был о том сколько мне часов, минут, секунд выделить на рефакторинг или покрытие тестами и кто сколько разрешит. Временная составляющая не затрагивалась вообще, перечитайте озвученные мной вопросы. Более того я не акцентировал внимание на том какие причины привели к задаче рефакторинга и покрытия тестами, а спрашивал про то, какие практические методы используют люди в своей каждодневной работе с их требованиями и их ограничениями. Общим остается наличие куска кода, который слишком велик и который нужно протестировать. Насколько сильно разделяют задачу и от чего это зависит, кроме того каким образом это разделение достигается - вот что меня интересует.
70 выбрано не совсем случайно, мне нужно число гарантированно больше 50 процентов, позволяющее увидеть как люди действуют в условиях необходимости тестирования классов с зависимостями от других классов.
0
|
||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||||
| 13.02.2016, 17:04 | ||||||
Я вижу, что ты прешься по умным словам, терминам, предложениям (поправь меня, если я не прав), потому что зачем например иначе упоминать "швы Физерса", ограничивая аудиторию тех, кто понял вопрос, только теми, кто читал его книгу? Особенно если учесть, что сама по себе суть шва элементарна, и ее понимает каждый.![]()
0
|
||||||
|
Антикодер
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
|
|
| 19.02.2016, 10:55 | |
|
обычно этим занимаются люди, которым не сказали, что есть функциональное программирование.
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||
| 19.02.2016, 14:03 | ||
|
0
|
||
| 19.02.2016, 14:03 | |
|
Помогаю со студенческими работами здесь
8
Применение кода из Unit1 в Unit2 Применение кода js при определенной ширине экрана Привести несколько примеров рефакторинга Можно ли выделить для приложения больше памяти для увеличения его быстродействия
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|