В C# (или на любом другом языке), какой способ удаления повторов является вашим любимым?

Я только что закодировал класс из 700 строк. Ужасный. Я от стыда опускаю голову. Это прямо противоположно СУХОЙ, как британское лето.

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

Для справки, мои, вероятно, используют:

  1. Универсальные классы и методы
  2. Перегрузка / связывание методов.

Какие твои?

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

Iain Holder 14.09.2008 13:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
539
7

Ответы 7

#область, край

Я сделал класс из 1000 строк только одной строкой!

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

#region: ковер, под которым можно спрятать свои грязные секреты

thijs 27.01.2010 19:18

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

Что касается моего любимого способа удаления дублирования… Замыкания, особенно на моем любимом языке (Ruby). Они имеют тенденцию быть действительно кратким способом взять 2 части кода и объединить сходства. Конечно (как и любой другой "передовой опыт" или совет), это не может быть сделано вслепую ... Я просто нахожу их действительно забавными в использовании, когда я могу их использовать.

Вы совершенно правы, не дожидаясь окончания урока. Меня охватило желание дополнить функционал.

Iain Holder 13.09.2008 02:57

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

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

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

while (true)
{
  var smallObject = WaitForSomethingToTurnUp();
  var largeObject = DoSomethingWithSmallObject();
}

Я обнаружил, что мое приложение хранит большой объем данных в памяти, потому что, хотя «largeObject» не находился в области видимости, пока smallObject что-то не вернул, сборщик мусора все еще мог это видеть.

Я легко решил эту проблему, переместив DoSomethingWithSmallObject () и другой связанный код в другой метод.

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

Надеюсь это поможет.

Ник

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

Также есть несколько простых методов удаления повторяющихся блоков if / else if и switch, любезно предоставленных Скоттом Хансельманом: http://www.hanselman.com/blog/CategoryView.aspx?category=Source+Code&page=2

Я мог бы сказать что-то вроде этого:

Создайте пользовательские (частные) типы для структур данных и поместите в них всю связанную логику. Dictionary <string, List <int>> и т. д.

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

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

Если ничего не помогает, добавьте к нему [SuppressMessage ("Microsoft.Maintainability", "CA1502: AvoidExcessiveComplexity")] и укажите, почему.

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

Приемы рефакторинга должны начинаться с самых простых. Я настоятельно рекомендую книгу Мартина Фаулера. Объединение общего кода в функции, удаление ненужных переменных и другие простые методы позволят вам сэкономить много времени. Для операций со списком я предпочитаю использовать идиомы функционального программирования. То есть я использую внутренние итераторы, map, filter и reduce (на языке Python есть соответствующие вещи в ruby, lisp и haskell) всякий раз, когда я могу, это делает код намного короче и более самодостаточным.

Да, книга Фаулера действительно хороша. Может стоит почаще выкапывать! :)

Iain Holder 14.09.2008 12:47

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

По моему личному опыту, моим любимым «способом удаления повторов» была функция «Извлечь метод» в Resharper (хотя она также доступна в стандартной Visual Studio).

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

Классы монстров также имеют тенденцию обнаруживать, что они содержат более одной функциональности. Это, в свою очередь, дает возможность выделить каждую отдельную функциональность в отдельный (надеюсь, меньший) класс.

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

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