Вопрос

Допустим, вы унаследовали кодовую базу C #, которая использует один класс с 200 статическими методами для обеспечения основной функциональности (например, поиска в базе данных).Из многих кошмаров в этом классе обильно используется венгерская нотация (плохая).

Могли бы вы провести рефакторинг имен переменных, чтобы удалить венгерскую нотацию, или оставили бы их в покое?

Если бы вы решили изменить все переменные, чтобы удалить венгерскую нотацию, каким был бы ваш метод?

Это было полезно?

Решение

Просто оставь это в покое. Есть лучшее использование вашего времени.

Другие советы

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

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

Щелкните правой кнопкой мыши на имени переменной, Refactor - > Переименовать.

Существуют надстройки VS, которые тоже это делают, но встроенный метод прекрасно работает для меня.

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

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

Не забывайте, что существует два вида венгерской нотации.

Оригинальный Charles Simonyi HN, позже известный как App's Hungarian, и более поздняя мерзость, названная System Hungarian в честь какого-то придурка (это технический термин), совершенно неправильно прочитанного Оригинальная статья Симони.

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

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

Если у вас есть приложение на венгерском языке, вы, вероятно, захотите сохранить его после прочтения как оригинальной статьи Чарльза Симони, так и статьи Джоэла.

Если вы угодили в дымящуюся кучу Системного венгерского?

Все ставки отменяются!

Ух ты!(говорит, зажимая нос) (-:

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

Раньше я использовал его религиозно еще во времена VB6, но прекратил работу, когда вышел VB.NET, потому что так сказано в новых рекомендациях VB. Другие разработчики не сделали. Итак, у нас есть много старого кода с ним. Когда я выполняю обслуживание кода, я удаляю обозначение из функций / методов / суб, к которым я прикасаюсь. Я бы не стал удалять все сразу , если у вас нет действительно хороших модульных тестов для всего и вы можете запустить их, чтобы доказать, что ничего не сломано.

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

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

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

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

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

Тем не менее, я бы согласился с определенной точкой зрения Криса Конвея и спросил вас, ПОЧЕМУ: да, это раздражает, но в то же время, в большинстве случаев метод "если это не сломалось, не исправляй это" действительно лучший выход!

Меняйте его только тогда, когда вы его используете напрямую. И убедитесь, что у вас есть готовый тестовый стенд, чтобы убедиться, что он все еще работает.

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

Я бы сказал, что большая проблема в том, что у вас есть один класс с 200 (!) методами!

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

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

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

Компилировать & amp; запустите свой тестовый набор.

Есть энергия для большего? Извлечь другой класс.
Изношены - нет проблем; вернись и сделай еще немного завтра. Всего за несколько дней ты покоришь зверя.

Я согласен с @Booji - делайте это вручную, на рутинной основе, когда вы уже посещаете код по какой-либо другой веской причине. Тогда вы получите самые распространенные из них, и кто заботится об остальном.

Я думал о том, чтобы задать аналогичный вопрос, только в моем случае код, вызывающий оскорбление, принадлежит мне. У меня очень старая привычка использовать «плохой вид» венгерского из моих дней FoxPro (который имел слабую типизацию и необычный обзор) - привычка, которую я только недавно бросил.

Это сложно - это означает, что нужно принять несовместимый стиль в вашей кодовой базе. Это было только неделю назад, когда я наконец сказал: «Винт это» и начал имя параметра без буквы "p". Когнитивный диссонанс, который я сначала почувствовал, сменился чувством свободы. Мир не пришел к концу.

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

Кроме того, вы можете полностью исключить свои переменные и просто вернуть каждой функции 42.

Мне кажется, что большая проблема заключается в том, что класс God Object состоит из 200 методов. Я бы предположил, что рефакторинг только для того, чтобы убрать венгерскую нотацию, сам по себе является малоценной и рискованной деятельностью. Если в этом классе нет обильного набора автоматических модульных тестов, чтобы придать вам уверенность в вашем рефакторинге, я думаю, вы должны оставить его в покое и по-настоящему в покое.

Я полагаю, что такой набор тестов маловероятен, потому что разработчик, следуя методам TDD, (надеюсь), естественно, в первую очередь избежал бы создания объекта God - было бы очень сложно написать всесторонние тесты.

Ликвидация объекта бога и установка базы для юнит-тестирования имеет большую ценность. Я бы посоветовал поискать возможности для рефакторинга самого класса - возможно, когда появятся подходящие бизнес-требования / изменения, которые потребуют изменения в этом коде (и, таким образом, мы надеемся, что будут куплены и оплачены некоторые системные и регрессионные тесты). Возможно, вам не удастся оправдать усилия по рефакторингу всего за один раз, но вы можете сделать это по частям, как только появится возможность, и протестировать изменения. Таким образом, вы можете постепенно преобразовывать код спагетти в более чистую кодовую базу с помощью комплексных модульных тестов, постепенно.

И вы можете ликвидировать венгерского на ходу, если хотите.

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

Примеры (идет в vimrc):

"" Hungarian notation conversion helpers
"" get rid of str prefixes and fix caps e.g. strName -> name
map ,bs /\Wstr[A-Z]^Ml3x~
map ,bi /\Wint[A-Z]^Ml3x~
"" little more complex to clean up m_p type class variables
map ,bm /\Wm_p\?[A-Z]^M:.s/\(\W\)m_p\?/\1_/^M/\W_[A-Z]^Mll~
map ,bp /\Wp[A-Z]^Mlx~

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

Если ваша команда в порядке с этим рефакторингом и вкладывает ваше время в это (что может сэкономить время в будущем, если это означает, что код будет более читабельным / поддерживаемым), используйте Visual Studio (или любую другую IDE вы используете), чтобы помочь вам рефакторинг кода.

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

Я люблю венгерскую нотацию. Не понимаю, почему вы хотели бы избавиться от этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top