2008-09-12 2 views
4

Я только что закодировал класс 700 строк. Ужасно. Я стыжусь своей головой. Это как противоположность DRY как британское лето.В C# (или на любом языке), что является вашим любимым способом удаления повторений?

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

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

  1. Generic классы и методы
  2. Метод перегрузки/сцепления.

Мои данные?

+0

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

ответ

2

#region

Я сделал класс 1000 линия только одна линия с ним!

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

+1

#область: ковер, под которым можно скрыть свои грязные секреты – thijs 2010-01-27 16:18:07

1

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

Что касается моего любимого способа устранения дублирования ... Закрытие, особенно на моем любимом языке (Ruby). Они, как правило, являются очень кратким способом взятия двух фрагментов кода и слияния сходства. Конечно (как любая «лучшая практика» или подсказка), это невозможно сделать вслепую ... Я просто нахожу их очень забавными в использовании, когда я могу их использовать.

+0

Вы совершенно правы, не дожидаясь окончания занятия. Я был настигнут желанием завершить работу. – 2008-09-12 22:57:26

1

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

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

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

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

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

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

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

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

Ник

1

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

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

1

я мог бы пойти что-то вроде этого:

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

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

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

Если все остальное не удается, удалите [SuppressMessage («Microsoft.Maintainability», «CA1502: AvoidExcessiveComplexity»)] и прокомментируйте почему.

4

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

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

+0

Да Книга Фаулера действительно хороша. Может быть, я должен выкапывать его чаще? :) – 2008-09-14 08:47:54

2

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

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

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

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

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

Смежные вопросы