Как программисты практикуют повторное использование кода

StackOverflow https://stackoverflow.com/questions/237733

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

Решение

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

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

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

Вы также можете попытаться заглянуть в ORM, DAAB или обратиться к Группа «Образцы и практики»

Насколько можно предотвратить оле С & 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

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

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

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

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

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

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);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    <Ол>
  • Давать вещам имена, которые отражают их сущность. Это действительно очень важно
  • Убедиться, что это только одна вещь. Это действительно возвращает нас к первому пункту, если вы не можете назвать его по своей сути, то часто он делает слишком много.
  • Расположение вещи где-то логично. Опять же, это возвращает нас к способности называть вещи хорошо и улавливать их сущность ...
  • Группировка с вещами, которые основаны на центральной концепции. То же, что и выше, но сказано иначе: -)
  • Первое, на что нужно обратить внимание, это то, что при использовании копирования и вставки вы повторно используете код, хотя и не самым эффективным способом. Вы распознали ситуацию, в которой вы уже нашли решение.

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

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

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

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

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

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

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

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

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

    Постарайтесь использовать чужие функции и библиотеки.

    Обычно вы обнаружите, что ваша конкретная проблема имеет хорошо проверенное и элегантное решение.

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

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

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

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

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

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

    <Ол>
  • Напишите функцию, настройте ее, чтобы разрешить варианты
  • Напишите функциональный объект, члены которого будут содержать различные данные
  • Разработать иерархию классов (функциональных объектов?), которые реализуют еще более сложные варианты
  • В C ++ вы также можете разрабатывать шаблоны для генерации различных функций или классов во время компиляции
  • Легко: всякий раз, когда вы ловите код копирования-вставки, немедленно извлекайте его (т.е. не делайте это после того, как вы уже несколько раз кодировали CP) в новую функцию.

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