Как программисты практикуют повторное использование кода - PullRequest
13 голосов
/ 26 октября 2008

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

Ответы [ 14 ]

9 голосов
/ 26 октября 2008

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

Взять, к примеру, скромный printf. Представьте, что у вас не было printf, а было только write или что-то подобное:

//convert theInt to a string and write it out.
char c[24];
itoa(theInt, c, 10);
puts(c);

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

printf("%d", theInt);

Вам не нужно быть столь же причудливым, как printf с его переменными аргументами и форматной строкой. Даже просто простая процедура, такая как:

void print_int(int theInt)
{
    char c[24];
    itoa(theInt, c, 10);
    puts(c);
}

хорошо бы с этим справиться. Таким образом, если вы хотите изменить print_int, чтобы всегда печатать в stderr, вы можете обновить его так:

void print_int(int theInt)
{
    fprintf(stderr, "%d", theInt);
}

и все ваши целые числа теперь будут волшебным образом напечатаны со стандартной ошибкой.

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

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

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

4 голосов
/ 26 октября 2008

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

4 голосов
/ 26 октября 2008

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

2 голосов
/ 27 октября 2008

, чтобы получить повторное использование кода, вы должны стать мастером ...

  1. Давая вещам имена, которые отражают их сущность. Это действительно очень важно
  2. Убедиться, что это только одно. Это действительно возвращает нас к первому пункту: если вы не можете назвать его по сути, то часто он делает слишком много.
  3. Нахождение вещи где-то логично. Опять же, это возвращается к способности хорошо называть вещи и улавливать их сущность ...
  4. Группировка с вещами, которые основаны на центральной концепции. То же, что и выше, но сказано иначе: -)
2 голосов
/ 26 октября 2008

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

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

  1. Трудно предвидеть будущие потребности, поэтому очень трудно определить API, чтобы вы действительно использовали их в следующий раз. Это может стоить вам вдвое больше времени - как только вы сделаете его более общим, так что во второй раз вы все равно будете его переписывать. Мне кажется, что особенно Java-проекты в последнее время склонны к этому, они, кажется, всегда переписываются в framework du jour, просто для того, чтобы их было легче "интегрировать" или что-то еще в будущем.

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

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

2 голосов
/ 26 октября 2008

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

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

1 голос
/ 16 сентября 2011

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

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

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

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

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

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

1 голос
/ 26 октября 2008

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

ExportToExcel (Дата списка, строковое имя файла)

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

0 голосов
/ 26 октября 2008

В зависимости от размера проекта можно изменить ответ.

Для проекта меньшего размера я бы порекомендовал установить класс DatabaseHelper, который обеспечивает весь доступ к БД. Это было бы просто оберткой вокруг открытия / закрытия соединений и выполнения кода БД. Затем на более высоком уровне вы можете просто написать DBCommands, которые будут выполняться.

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

Вы также можете попробовать обратиться к ORM, DAAB или к группе Patterns and Practices Group

Насколько, как предотвратить оле C & P? - Хорошо, когда вы пишете свой код, вам нужно периодически просматривать его, если у вас есть похожие блоки кода, которые меняются только на один или два параметра, что всегда является хорошим кандидатом для рефакторинга в свой собственный метод.

Теперь для моего примера псевдокода:

Function GetCustomer(ID) as Customer
   Dim CMD as New DBCmd("SQL or Stored Proc")
   CMD.Paramaters.Add("CustID",DBType,Length).Value = ID
   Dim DHelper as New DatabaseHelper
   DR = DHelper.GetReader(CMD)
   Dim RtnCust as New Customer(Dx)
   Return RtnCust
End Function

Class DataHelper
  Public Function GetDataTable(cmd) as DataTable
    Write the DB access code stuff here.
    GetConnectionString
    OpenConnection
    Do DB Operation
    Close Connection
  End Function
  Public Function GetDataReader(cmd) as DataReader
  Public Function GetDataSet(cmd) as DataSet
  ... And So on ...
End Class
0 голосов
/ 26 октября 2008

Легко: всякий раз, когда вы ловите код копирования-вставки, немедленно извлекайте его (т.е. не делайте это после того, как вы уже несколько раз кодировали CP) в новую функцию. 1003 *

...