Я недавно начал новую работу, где я работаю на очень крупном приложения (15М Лок). На моем предыдущем месте работы у нас было точно так же большие приложения, но (к лучшему или к худшему) мы использовали OSGi, которая означает, заявка была разбита на много микросервисов, которые могут быть изменены независимо, компиляции и развертывания. Новое приложение-это просто один большой кодовой базы, может быть пару .библиотеки DLL.
Так что мне нужно изменить интерфейс этого класса, потому что's то, что мой босс попросил меня сделать. Они изначально писал его с некоторыми предположениями, что это'т слишком обобщаете хорошо, и на некоторое время они избегают проблемы рефакторинга, потому что он's так тесно связаны. Я изменил интерфейс и теперь насчитывается более 25000 ошибки. Некоторые ошибки в классах с важными названиями вроде "и XYZPriceCalculator" и что reaaally не должно сломать. Но я могу'т запустить приложение, чтобы проверить, если он's работает, пока все ошибки не будут решены. И многие из модульных тестов как непосредственно ведения данного интерфейса, или в сочетании с базовыми классами, которые ссылаются, что интерфейс, так просто ее исправить-это довольно огромная задача сама по себе. Плюс, я не'т действительно знаю, как связать все это воедино, так что даже если я могу получить его, чтобы начать, я не'т действительно знаю, что это будет выглядеть, если вещи были сломаны.
Я никогда не сталкивался с проблемой такой на моей прошлой работе. Что мне делать?
25000 ошибки, в основном, означает "Дон'т прикоснуться, что". Изменить его обратно. Создайте новый класс, который имеет необходимый интерфейс и медленно перемещайте потребителей класса к новому. В зависимости от языка вы можете отметить старый класс как устаревшие, которые могут вызвать всевозможные предупреждения компилятора, но выиграл'т разбить построение.
К сожалению, эти вещи происходят в старых базах кода. Там's не много вы можете сделать об этом, кроме медленно сделать вещи лучше. При создании новых классов, убедитесь, что вы правильно их проверить и создавать их с помощью твердых принципов, так их легче будет изменить в будущем.
Часто, разбивая изменить, что нужно делать на более мелкие шаги могут помочь, потому что тогда вы можете выполнять большинство из небольших шагов в сторону, что не'т сломать программу. Инструменты рефакторинга помочь много с такими задачами.
Разделяй ###
Во-первых, определить минимально возможного изменения (с точки зрения логических изменений, не в плане измененных Лок), что подводить итоги изменений, которые вы хотите достичь. Особенно стараются выделить действия, которые являются чисто рефакторинга и может быть осуществлена инструменты.
Для сложных случаев, как ваш, возможно, имеет смысл проанализировать один небольшой рефакторинг в то время, а потом оставлять эту проблему, так что все системы непрерывной интеграции может проверить, и, возможно, команда тестирования посмотрели. Это подтверждает шагов, которые вы делаете.
Для проведения конкретного рефакторинга, вам совершенно необходимо поддерживать инструмент на случай, когда у тебя есть 25 000 сайтов вызова метода, который вы хотите изменить. Может быть, поиска и замены тоже работает, но для такой критический случай, я'd быть напуган.
Пример
В C#, например, это'ы можно использовать для ReSharper изменить подпись метода. Если изменение достаточно просто, например, при добавлении нового параметра, затем вы можете указать, какое значение должно быть использовано на объектах, называть, что бы ошибка компиляции.
Вы тогда на свободное основание код ошибки немедленно и может запустить все модульные тесты, которые будут проходить, потому что это было только рефакторинг.
После того, как сигнатура метода выглядит хорошо, вы можете пойти и заменить те ценности, которые для ReSharper добавлены в качестве аргументов вновь введенного параметра. Это не рефакторинг, но у вас ошибка-бесплатный базовый код и можете запускать тесты после каждой строки вы изменить.
Это очень полезный подход для таких случаев, как ваш, где у вас есть много места вызова. И у вас есть сейчас работающее программное обеспечение, поэтому можно сделать небольшой рефакторинг шаги, чтобы изменить подпись, потом еще одну.
К сожалению, он выиграл'т работать, если изменить подпись слишком сложна и не может быть разбита на более мелкие изменения. Но это редкость; разделение проблемы на более мелкие проблемы, как правило, показывает, что это возможно.
Уточнить свои задачи с вашим боссом, чтобы помочь ему осознать проблему и ваши потребности как профессионального разработчика программного обеспечения.
Если вы являетесь частью команды, ищем ведущего разработчика и спросить у него совета.
Удачи.
Дон'т прикоснуться к ней. Дон'т совершить что угодно.
Вместо этого, сядьте на стул и кричать и"Heeeeelp!!!!!" и так громко, как вы можете.
Ну, не совсем так, но спросите любого из ваших старших коллег за советом. Если у вас есть 25,000 ошибки, вы Дон'т исправить ошибки, исправить то, что вызвало ошибки. И старший коллега должен уметь консультацию вы how, чтобы изменить ваш босс хочет без 25,000 ошибок. Существуют различные способы сделать это, но то, что это хороший способ зависит от вашей конкретной ситуации.
И это может быть босс сказал своим старшим коллегам сделать то же изменение, и они сказали "нет". Потому что они знали, что произойдет. Что's, почему вы получили эту работу.
Окопались API, может'т быть просто изменены. Если вы действительно нужно их менять, anootate и/или документ их как устаревшие (что означает, что язык позволяет), и документ, в котором API должен использоваться вместо этого. Тогда старый API может быть прекращено медленно... возможно, очень медленно в зависимости от вашего бюджета времени на рефакторинг.
Оценки
Оценить, является ли это изменение необходимо, или можно ли добавить новый метод и охаять других.
Вперед
Если изменение необходимо; затем план миграции необходимо.
Первым шагом является ознакомление с новым методом и старым методом массажа свои аргументы, так что его можно назвать новым. Это может потребовать жесткого кодирования несколько вещей; что's прекрасно.
Это точка фиксации: проверить, что все тесты пройдены, совершают толчок.
Перенести
Заняты работой является переход всех абонентов старого метода к новому. К счастью, это можно сделать постепенно благодаря перевозчику.
Так что вперед; Дон'т стесняйтесь использовать инструменты, чтобы помочь (СЭД
быть самый основной, есть и другие).
Марк старый метод как deprecated (с намеком на переход на новый метод); это поможет вам пятнистость ли вы что-нибудь забыли и поможет если сотрудник вводит призыв к старому методу, пока вы работаете над этим.
Это точка фиксации (или может совершить несколько пунктов): проверить, что все тесты пройдены, совершают толчок.
Удалить
По прошествии некоторого времени (может быть, как в день), просто удалить старый метод.
Если изменение сигнатуры метода-это всего лишь смена названия, самое простое решение заключается в использовании инструменты, чтобы автоматизировать изменения в 25,000 классов, которые ссылаются на метод в вопрос.
Я предполагаю, что вы просто редактировать вручную код, который порождает все ошибки. Я также предполагаю, что вы знакомы с Java (видя вашу ссылку для каталога), так, например, в Eclipse (я не'т знаю, какой средой программирования вы пользуетесь, но и других средах, имеют схожие инструменты рефакторинга) вы можете использовать и"рефакторинг -> переименовать", чтобы обновить все ссылки на метод, который должен оставить вас без ошибок.
В случае, если вы вносите изменения в сигнатуре метода, чем просто переименование (изменение количества или типа параметров), вы можете использовать и"рефакторинг -> метод изменения подпись". Однако, скорее всего, вы должны быть более осторожны, так как другие ответы предлагаю. Кроме того, независимо от типа изменения он все еще может быть довольно задача, совершив все эти изменения в занятой базой кода.
Вот мой вклад.
Я недавно начал новую работу, где я работаю на очень крупном приложения (15М строк кода).
Вы наверное не знакомы с проектом и его фильм "Особенности" и. Прежде чем ввести вниз единой строчки кода, это's важно, чтобы быть знакомы с проектом. Так делать откат изменений и начала анализа кода. (По крайней мере над одной)
Понимание существующего решения дает вам лучшее представление о том, где ты идешь. Контекстом решения и его значение.
Как @Грег указал, вы должны быть в состоянии проверить существующий код, чтобы иметь действительную ссылку для сравнения с (регрессионное тестирование). Ваше решение должно быть способно генерировать те же результаты, чем существующий. На данном этапе, Дон'т вы заботитесь о том, действительно ли результаты верны. Первая цель-это оптимизация, а не для исправления ошибок. Если существующее решение, пишет "2+2=42" и ваше решение тоже. Если он не бросает исключений, ваши не должны. Если он возвращает значение null, твоя тоже должна возвращать значение null. И так далее. В противном случае, вы будете компрометировать 25к строк кода.
Это ради ретро-совместимость.
Почему? Потому что сейчас, это's ваша уникальная гарантия успешного рефакторинга.
> и многие из модульных тестов как непосредственно ведения данного интерфейса,
или в сочетании с базовыми классами, которые ссылаются, что интерфейс.
Таким образом, чтобы гарантировать ретро-совместимость крайне необходим для вас, так вот ваша первая задача. Изолировать компонентов для модульного тестирования.
Имейте в виду, что эти 25к строк кода были сделаны предполагая возможные результаты существующего кода. Если вы Don'т сломать эту часть договора, тогда вы на полпути к окончательному решению. Если у вас, хорошо: пусть сила будет с вами
Как только вы разработали и внедрили новых и"договор" и заменить старый. Охаять его или принять его.
Я предложил оставить в покое ошибок из-за рефакторинг и исправление ошибок-это разные задачи. Если вы попытаетесь взять их вместе, вы можете потерпеть неудачу на обоих. Вы можете думать, вы нашли ошибки, однако, они могут быть "Особенности" и. Так что оставьте их в покое (в минуту).
25к строк кода, как мне кажется, достаточно, чтобы заставить меня сосредоточиться только на одной задаче.
Как только ваша первая задача выполнена. Разоблачить эти ошибки/особенности своего босса.
Наконец, как @Стивен сказал:
там's не много вы можете сделать об этом, кроме медленно сделать вещи лучше. при создании новых классов, убедитесь, что вы правильно протестировать их и создавайте их с помощью твердых принципов, так им будет легче изменить в В будущем
Тест.
Все остальные рекомендации, как с помощью рефакторинга так мало влияния. Но с таким количеством ошибок, даже если вам удастся рефакторинг с как мало, как 10 строк кода (Вы, наверное, можете), то вы повлияли 25,000 код потоков даже если вы не'т нужна, чтобы переписать их.
Итак, следующее, что нужно сделать, это убедиться, что ваш регрессионных тестов проходит с честью. И если вы Don'т иметь один, затем сделать один, что будет. Добавление комплексных регрессионных тестов, чтобы ваши монолитного проекта звучит скучно, но это хороший способ увеличить уверенность в релиз-кандидатах, а также выпустить их быстрее, если программный комплекс Автоматизированная хорошо.