Приближение к рефакторингу

У меня есть очень информационно-центрическое приложение, записанное в Python / PyQt. Я планирую сделать некоторый рефакторинг для реального разделения UI от ядра, главным образом потому что там существуют не любые реальные тесты все же, и это ясно должно измениться.

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

  • Когда пользователь щелкает правой кнопкой по представлению объекта данных, контекстное меню, которое открывается, создается по условию объект, хотя этот объект данных (по существу представление ORM строки базы данных) должен ясно не иметь никакого отношения к UI.

  • Когда что-то записано в базу данных, но сбои записи (например, потому что запись базы данных заблокирована другим пользователем), классическая "повторная попытка / аварийное прекращение работы" окно сообщения представлены пользователю. Это диалоговое окно создается по условию поставщик*, хотя у поставщика не должно, очевидно, быть функциональности UI. Очевидно, поставщик может вместо этого повысить исключение или иначе указать на отказ, и UI может поймать это и действовать соответственно.

    * это - слово, которое я использую для объекта, который в основном представляет таблицу базы данных и посредничает между ее объектами данных и механизмом базы данных; я не уверен, является ли это тем, что обычно называют "поставщиком"

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

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

Мой план состоит в том, чтобы начать осуществлять рефакторинг с идеей в памяти, что часть UI могла легко быть сорвана, чтобы быть замененной, скажем, сетью frontend или основанным на тексте интерфейсом вместо интерфейса Qt. С другой стороны, сам QT все еще использовался бы ядром, потому что механизм сигнала/слота используется в довольно многих местах, например, объекты данных испускают a changed сигнал указать, ну, в общем, на Вас знает что.

Так, мой вопрос: это - выполнимый подход для увеличения тестируемости и пригодности для обслуживания? Какие-либо другие комментарии, особенно с Python в памяти?

7
задан Community 23 May 2017 в 10:24
поделиться

4 ответа

Я сделал рефакторинг для большого устаревшего кода, направленного на отделение UI / Backenc. Это весело и полезно.

/ Похвала;)

Какую бы шаблон не вызывал его или быть частью MVC, это неоценимо, чтобы иметь очень четкое слой API . Если возможно, вы можете направить все запросы пользовательского интерфейса через диспетчеру, который предлагал вам больше контроля над пользовательским интервалом <-> логической связи, например. Реализация кэширования, аутентификации и т. Д.

для визуализации:

[QT Frontend]
[CLIs]             <=======> [Dispatcher] <=> [API] <==> [Core/Model]
[SOAP/XMPRPC/Json]
[API Test Suite]

Таким образом

  • Это проще добавить тестовый набор для проверки ваших API.
  • Также он делает добавление более единообразного УВД и легче.
  • Документация API: скажем, если вы хотите документировать и выставить API, хотя некоторые интерфейс RPC, он «проще генерировать документацию API». Если кто-то не согласен с важности документации API, всегда можно посмотреть на API Twitter и это успех.
  • Вы можете быстро импортировать слой API в Python Shell и воспроизводиться с ним

Проектирование API может случиться, прежде чем начать кодирование для слоя API. В зависимости от приложения, вы можете захотеть помочь пакетам, такими как ZINTERFACE. Это общий подход, который я беру даже во время написания очень маленьких приложений, и он никогда не подвел для меня.

Посмотрите

Одним из различных преимуществ такого подхода является после того, как у вас есть API Слой и новый интерфейс UI, теперь вы можете вернуться к Legacy Code и исправить / рефакторировать его, возможно, меньшие шаги.

Другие предложения состоит в том, чтобы получить ваш тестирование. См. Совет Interstar в Каковы первые задачи для реализации тестирования подразделения в приложениях Brownfield? .

1
ответ дан 6 December 2019 в 23:06
поделиться

Если вы этого не сделали, прочитайте «Работайте эффективно с устаревшим кодом» Michael Peathers - он имеет дело с именно такой ситуацией, и предлагает множество методов для решения с ним.

Один ключевой момент, который он делает, - это попытаться получить некоторые тесты на месте перед рефакторингом. Поскольку он не подходит для модульных тестов, попробуйте получить несколько сквозных испытаний на месте. Я считаю, что QT имеет собственную структуру тестирования для вождения графического интерфейса, поэтому добавьте тесты, которые манипулируют GUI против известной базы данных и проверяют результат. Когда вы убираете код, вы можете заменить или увеличить сквозные тесты с помощью модульных тестов.

7
ответ дан 6 December 2019 в 23:06
поделиться

Если вы хотите извлечь все части GUI вашего приложения из всех других частей, чтобы проверить все ваше приложение, вы должны использовать модель-представление: вы можете найти Некоторое объяснение здесь и здесь .

С этой моделью все ваши службы вашего приложения используют докладчики, тогда как только пользователь может напрямую взаимодействовать с видами (деталями GUI). Докладчики управляют взглядами из приложения. У вас будет такая часть GUI, независимая от вашего приложения в том случае, вы хотите изменить Framework GUI. Единственное, что вам придется изменить, являются докладчиками и самими взглядами.

Для тестов, которые вы хотите, вам просто нужно написать модульные тесты для ведущих. Если вы хотите проверить используемые GUI, вам необходимо создать тесты интеграции .

Надеюсь, что поможет!

2
ответ дан 6 December 2019 в 23:06
поделиться

Идеальное решение будет совместимым в браузере, и это предложение не; Я проверил его только на Ubuntu 9.10, хотя и с хром, Firefox, Epiphany и Opera, и, похоже, надежно работает в тех, что подразумевает надежность в своих коллегах Windows. Очевидно, то есть совершенно другой чайник рыбы.

Это сказано:

Эта идея основана на следующем (X) HTML:

<form>
    <fieldset>
        <button disabled title="this is disabled">disabled button</button>
    </fieldset>    
</form>

и использует следующие CSS для достижения чего-то близкого к вашей цели:

button  {
    position: relative;
}

button:hover:after {
    position: absolute;
    top: 0;
    left: 75%;
    width: 100%;
    content: attr(title);
    background-color: #ffa;
    color: #000;
    line-height: 1.4em;
    border: 1px solid #000;
}

 Кнопка {Position: относительна;  Размеры коробки: пограничная коробка;  } Кнопка: Наведите курсор: после {положение: абсолют;  Вершина: 0;  Слева: 75%;  Ширина: 100%;  Содержание: attr (название);  Фон-цвет: #ffa;  Цвет: # 000;  Высота линии: 1.4em;  Граница: 1PX Solid # 000;  Коробка-тень: 2PX 2PX 10PX # 999;  } 
 <Форма> 
<кнопка отключено заголовок = "Это отключено"> кнопка отключения

Это не идеально, но это был лучший без JavaScript Идея, с которой я мог придумать.

-121--1134026-

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

Рефакторинг - это то, где он действительно ценен, чтобы точно увидеть, где изменился эффект некоторой операции, и где тот же вызов производит другой результат. Это то, о чем все это тестирование: вы хотите посмотреть, сломаете ли вы что-то, вы хотите увидеть все непреднамеренные изменения.

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

1
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: