Синтаксис, который вы используете для определения type_info_impl
, неверен.
Использование
template<int N, typename... Ts>
struct type_info_impl<N, Ts...> { ...};
можно, если вы пытаетесь специализировать шаблон класса. Чтобы определить базовый шаблон класса, удалите бит <N, Ts...>
. Просто используйте
template<int N, typename... Ts>
struct type_info_impl { ...};
Я однажды осуществлял рефакторинг и столкнулся с чем-то вроде этого код:
string strMyString;
try
{
strMyString = Session["MySessionVar"].ToString();
}
catch
{
strMyString = "";
}
Resharper указал, что.ToString () был избыточен, таким образом, я вынул его. К сожалению, это закончило тем, что взломало код. Каждый раз, когда MySessionVar был пустым, он не вызывал NullReferenceException, на который код полагался для столкновения его вниз к блоку выгоды. Я знаю, это было некоторым печальным кодом. Но я действительно извлекал хороший урок из него. Быстро не проходите старый код, полагающийся на инструмент, чтобы помочь Вам сделать, рефакторинг - думает это через себя.
Я действительно заканчивал тем, что осуществил рефакторинг его следующим образом:
string strMyString = Session["MySessionVar"] ?? "";
Обновление: Так как это сообщение является upvoted и технически не содержит ответ на вопрос, я полагал, что должен на самом деле ответить на вопрос. (Хорошо, это беспокоило меня до такой степени, что мне на самом деле снился он.)
Лично я задаю мне несколько вопросов перед рефакторингом.
1) Система при управлении исходным кодом? Если так, разрешение и осуществляет рефакторинг, потому что можно всегда откатывать, если что-то повреждается.
2) Модульные тесты существуют для функциональности, которую я изменяю? Если так, большой! Осуществить рефакторинг. Опасность здесь состоит в том, что существование модульных тестов не указывает на точность и объем упомянутых модульных тестов. Хорошие модульные тесты должны взять любые изменения повреждения.
3) Я полностью понимаю код, который я осуществляю рефакторинг? Если нет никакого управления исходным кодом и никаких тестов, и я действительно не понимаю код, который я изменяю, это - красный флаг. Я должен был бы стать более довольным кодом перед рефакторингом.
В случае, если № 3, я, вероятно, провел бы время для фактического отслеживания всего кода, который в настоящее время использует метод, который я осуществляю рефакторинг. В зависимости от объема кода это могло быть легко или невозможно (т.е. если это - общедоступный API). Если это сводится к тому, чтобы быть общедоступным API затем, действительно необходимо понять исходное намерение кода с бизнес-точки зрения.
Я склонен осуществлять рефакторинг глобальные константы и перечисления вполне немного, если их можно считать, минимум осуществляют рефакторинг риск. Возможно, это просто быть, но что-то как перечисление ClientAccountStatus должно быть в или близко к классу ClientAccount вместо того, чтобы находиться в классе GlobalConstAndEnum.
Я пытаюсь осуществить рефакторинг на основе следующих факторов:
И иногда, если у меня есть достаточно времени, я осуществляю рефакторинг для изучения. Как в, я знаю, что мое изменение может взломать код, но я не знаю где и как. Таким образом, я изменяю его так или иначе для обнаружения где его повреждение и почему. Тем путем я узнаю больше о коде.
Мой домен был мобильным программным обеспечением (сотовые телефоны), где большая часть кода находится на моем ПК, и привычка влияют на других. Так как я также поддерживаю систему сборки CI для своей компании, я могу выполнить сборку готового продукта (для всех телефонов) на пересмотренном коде, чтобы гарантировать, что это не повреждает ничто больше. Но это - моя персональная роскошь, которую Вы не можете иметь.
Являются обширные ряды закомментированного кода антишаблоном? В то время как не кодируют а именно, (это - комментарии), я вижу много этого вида поведения с людьми, которые не понимают, как использовать управление исходным кодом, и кто хочет иметь в наличии старый код на потом, таким образом, они могут более легко возвратиться, если ошибка была представлена. Каждый раз, когда я вижу обширные ряды кода, которые комментируются, я почти всегда удаляю их в их полноте.
Я склонен осуществлять рефакторинг очень длинные функции и методы, если я понимаю набор вводов и выводов к блоку.
Это помогает удобочитаемости никакой конец.
Рефакторинг ради него является одним из корней всего зла. Никогда не делайте этого. (Модульные тесты действительно несколько смягчают это).
Я только осуществил бы рефакторинг код, с которым я сталкиваюсь, и активно не продолжаю работать после прохождения через следующих шагов:
Я почти всегда повреждаюсь> 2 подобных условных выражения в переключатель... чаще всего относительно перечислений. Я закорочу возврат вместо длинного оператора.
исключая:
if (condition) { //lots of code //returns value } else { return null; }
становится:
if (!condition) return null; //lots of code.. //return value
вспыхивание рано уменьшает дополнительные отступы и уменьшает длинные биты кода... также как правило мне не нравятся методы больше чем с 10-15 строками кода. Мне нравится, когда методы имеют исключительную цель, даже если, создавая больше закрытых методов внутренне.
Обычно я не осуществляю рефакторинг код, если я просто просматриваю его, не активно работая над ним.
Но иногда ReSharper указывает на некоторый материал, которому я просто не могу сопротивляться к Alt+Enter.:)
Больше, чем (возможно) три или четыре строки дублирующего кода всегда заставляют меня думать о рефакторинге. Кроме того, я склонен перемещаться, кодируют много, извлекая код, который я предсказываю, чтобы использоваться более часто в отдельное место - класс с его собственной четко определенной целью и обязанностями или статическим методом статического класса (обычно помещаемый в мой Utils.* пространство имен).
Но, для ответа на вопрос, да, существует партия случаев, когда создание кода короче не обязательно означает делать, это хорошо структурировало и читаемый. Используя?? оператор в C# является другим примером. О чем также необходимо думать, новые возможности на предпочтительном языке - например, LINQ может использоваться, чтобы сделать некоторый материал очень изящным способом, но также и может сделать очень простую вещь очень нечитабельной и чрезмерно сложной. Необходимо взвесить эти два вещь очень тщательно, в конце все это сводится к персональному вкусу и, главным образом, опыт.
Ну, это - другой, "это зависит" ответ, но я боюсь, что это должно быть.
Если бы осуществление рефакторинг делает код намного легче читать, наиболее распространенным для меня был бы дублирующий код, например, если/еще это только отличается первыми/последними командами.
if($something) {
load_data($something);
} else {
load_data($something);
echo "Loaded";
do_something_else();
}
Я только потрудился изменять его, если существует некоторая другая причина, я изменяю код.
То, как далеко я готов взять его, зависит от того, насколько уверенный я - то, что я ничего не буду повреждать и как обширный мои собственные изменения в коде будут.
Для простого рефакторинга я пытаюсь очистить глубоко вложенные управляющие структуры и действительно долгие функции (больше чем одна экранная ценность текста). Однако не прекрасная идея осуществить рефакторинг код без серьезного основания (особенно в многочисленной команде разработчиков). В целом, если рефакторинг не сделает большое улучшение в коде или зафиксирует вопиющий грех, я пытаюсь оставить достаточно хорошо одним.
Не рефакторинг на - говорит, но так же, как вопрос общего обслуживания я обычно делаю этот материал, когда я запускаю работу над модулем:
Это - большая ситуация для показа преимуществ модульных тестов.
Если модульные тесты существуют, разработчики могут смело и настойчиво осуществлять рефакторинг странно написанный код, с которым они могли бы столкнуться. Если это передает модульные тесты, и Вы увеличили удобочитаемость, то Вы сделали свое благодеяние в течение дня и можете идти дальше.
Без модульных тестов упрощая сложный код это заполнено подарками вуду большой риск взлома кода и даже знания, что Вы представили новую ошибку! Таким образом, большинство разработчиков будет следовать осторожным маршрутом и идти дальше.
Это - маленький, незначительный антишаблон, но он так раздражает меня, что каждый раз, когда я нахожу его, я сразу вычеркиваю его. В C (или C++ или Java)
if (p)
return true;
else
return false;
становится
return p;
В схеме,
(if p #t #f)
становится
p
и в ML
if p then true else false
становится
p
Я вижу этот антишаблон почти исключительно в коде, написанном студентами бакалавриата. Я определенно не составляю это!!
Каждый раз, когда я сталкиваюсь с ним, и я не думаю, изменяя его, вызовет проблемы (например, Я могу понять это достаточно, что я знаю то, что это делает. например, уровень вуду является низким).
Я только осуществляю рефакторинг его, если тесты уже на месте. В противном случае это обычно не стоит моего времени к тестам записи на, и осуществите рефакторинг, по-видимому, рабочий код.
Удаление / обновление комментариев, которые явно неверны или явно бессмысленны.
Их удаление - это:
Это единственный известный мне рефакторинг на 100% без риска.
Обратите внимание, что выполнение этого в структурированных комментариях, таких как комментарии javadoc, - другое дело. Их изменение сопряжено с риском, поскольку они очень будут исправлены / удалены, но не лишены некоторых гарантированных исправлений, как это было бы со стандартными комментариями неправильного кода.