Отладчик URL-адресов Django

, я разрабатываю приложение django, и со временем количество URL-адресов увеличилось. Сейчас у меня их много, и из-за некоторых изменений, которые я внес, одно представление начало работать неправильно. Когда я пытаюсь ПОЛУЧИТЬ http://example.com/foo/edit_profile , он должен выполнять определенную функцию просмотра X , но вместо этого выполняет Y . Где-то портится маршрутизация URL, и я не могу понять. Я использовал метод django.core.urlresolvers.resolve , чтобы попробовать его из оболочки, и я могу подтвердить, что URL-адрес определяется неправильно. Однако я не знаю, как отладить это и точно определить проблему.

В идеале я бы хотел увидеть что-то вроде " cpp в нашем проекте, и каждый раз, когда мне приходится дотрагиваться до него, я съеживаюсь.

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

Файл используется и активно изменяется в нескольких (> 10) обслуживаемых версиях нашего продукта, поэтому его действительно сложно реорганизовать. Если бы я «просто» разделил его, скажем для начала, на 3 файла, то обратное слияние изменений из поддерживаемых версий стало кошмаром. А также, если вы разделите файл с такой длинной и богатой историей, отслеживание и проверка старых изменений в истории SCC вдруг станет намного сложнее.

Файл в основном содержит «основной класс» ( диспетчеризация и координация основной внутренней работы) нашей программы, поэтому каждый раз, когда добавляется функция, это также влияет на этот файл и каждый раз, когда он растет. : - (

Что бы вы сделали в этой ситуации? Есть идеи, как переместить новые функции в отдельный исходный файл, не нарушая рабочий процесс SCC ?

(Примечание по инструментам: мы используйте C ++ с Visual Studio ; Мы используем AccuRev как SCC , но я думаю, что тип SCC здесь не имеет значения; используйте Araxis Merge для фактического сравнения и объединения файлов)

228
задан 5 revs, 5 users 65% 3 May 2015 в 06:27
поделиться

9 ответов

Как вы описали, основная проблема заключается в различии до разделения и после разделения, объединении исправлений ошибок и т. д. Инструмент для решения этой проблемы. Это не займет много времени, чтобы жестко запрограммировать скрипт на Perl, Ruby и т. д., чтобы удалить большую часть шума от сравнения предварительного разделения с конкатенацией пост-разделения. Делайте все, что проще всего с точки зрения обработки шума:

  • удалите определенные строки до/во время конкатенации (например, включите охранники)
  • удалите другие элементы из вывода различий, если это необходимо

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

2
ответ дан 23 November 2019 в 03:47
поделиться

Я думаю, вам лучше всего создать набор классов команд, которые сопоставляются с точками API mainmodule.cpp.

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

Конечно, с одним классом из 11 KLOC код, вероятно, сильно связан и хрупок, но создание отдельных классов команд поможет гораздо больше, чем любая другая стратегия прокси/фасада.

Я не завидую этой задаче, но со временем эта проблема будет только усугубляться, если ее не решать.

Обновление

Я бы предположил, что шаблон Command предпочтительнее фасада.

Предпочтительно поддерживать/организовывать множество различных командных классов на (относительно) монолитном Фасаде. Отображение одного фасада в файле 11 KLOC, вероятно, потребуется разбить на несколько разных групп.

Зачем пытаться вычислить эти фасадные группы? С шаблоном Command вы сможете органично группировать и организовывать эти небольшие классы, что дает вам гораздо больше гибкости.

Конечно, оба варианта лучше, чем одиночный 11 KLOC и растущий файл.

14
ответ дан 23 November 2019 в 03:47
поделиться

Мне кажется, что вы столкнулись с несколькими запахами кода. Во-первых, кажется, что основной класс нарушает принцип открытости/закрытости. Также похоже, что на него возлагается слишком много обязанностей. Из-за этого я бы предположил, что код более хрупок, чем должен быть.

Хотя я могу понять ваши опасения по поводу трассируемости после рефакторинга, я ожидаю, что этот класс довольно сложно поддерживать и улучшать, и что любые внесенные вами изменения, скорее всего, вызовут побочные эффекты. Я бы предположил, что стоимость этого перевешивает стоимость рефакторинга класса.

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

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

В любом случае, это звучит как крупный проект, так что удачи :)

67
ответ дан 23 November 2019 в 03:47
поделиться

Именно этой проблеме посвящена одна из глав книги "Эффективная работа с устаревшим кодом" (http://www.amazon.com/Working-Effectively-Legacy- Michael-Feathers/dp/0131177052).

19
ответ дан 23 November 2019 в 03:47
поделиться

Я не знаю, решит ли это вашу проблему, но я предполагаю, что вы хотите перенести содержимое файла в файлы меньшего размера, независимые друг от друга (в сумме). Я также понимаю, что у вас есть около 10 различных версий программного обеспечения, и вам нужно поддерживать их все, не нарушая правил.

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

Я думаю, у вас есть только эти варианты:

  1. Не мигрировать и остаться с тем, что у вас есть. Возможно, бросить свою работу и начать работать над серьезным программным обеспечением с хорошим дизайном вдобавок. Экстремальное программирование — не всегда лучшее решение, если вы работаете над долгосрочным проектом и у вас достаточно средств, чтобы пережить один или два краха.

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

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

22
ответ дан 23 November 2019 в 03:47
поделиться

Вы должны заботиться не об уменьшении размера файла, а об уменьшении размера класса. Это сводится почти к тому же, но заставляет вас взглянуть на проблему под другим углом (как предполагает @Brian Rasmussen , у вашего класса, похоже, много обязанностей).

4
ответ дан 23 November 2019 в 03:47
поделиться

Ну, я понимаю вашу боль :) Я тоже участвовал в нескольких таких проектах, и это некрасиво. На это нет простого ответа.

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

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

8
ответ дан 23 November 2019 в 03:47
поделиться

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

4
ответ дан 23 November 2019 в 03:47
поделиться

Поправьте меня, если я неправильно понял вопрос.

Почему нельзя разделить исходный код на функции или классы (отдельные файлы .h/.cpp) и включить их в качестве заголовков? Конечно, должно быть повторное использование некоторых функций.

Это было бы началом.

0
ответ дан 23 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

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