Как программисты практикуют повторное использование кода
Я был плохим программистом, потому что я делаю копию и вставку. Например, каждый раз, когда я подключаюсь к базе данных и получаю набор записей, я копирую предыдущий код и редактирую, копирую код, который задает datagridview и edit. Я знаю о повторном использовании кода фразы, но на самом деле я его не использовал. Как я могу использовать повторное использование кода, чтобы мне не нужно было копировать и вставлять код базы данных и код datagridview.,
14 ответов
в зависимости от размера проекта может изменить ответ.
на меньше проект я бы рекомендовал настроить класс DatabaseHelper, который выполняет весь ваш доступ к БД. Это будет просто оболочка вокруг открытия / закрытия соединений и выполнения кода БД. Затем на более высоком уровне, вы можете просто написать DBCommands, которые будут выполняться.
аналогичная техника мог бы будет использоваться для более крупного проекта, но потребуется несколько дополнительных работа, интерфейсы должны быть добавлены, DI, а также абстрагировать то, что вам нужно знать о базе данных.
вы также можете попробовать заглянуть в ORM, DAAB или в шаблоны и практики группа
как предотвратить ole 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
суть повторного использования кода состоит в том, чтобы взять общую операцию и параметризовать ее, чтобы она могла принимать различные входы.
принять скромный 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);
}
будет делать трюк nickely. Таким образом, если вы хотите изменить print_int
чтобы всегда печатать на stderr, вы можете обновить его:
void print_int(int theInt)
{
fprintf(stderr, "%d", theInt);
}
и все ваши целые числа теперь волшебным образом будут напечатаны до стандартной ошибки.
вы могли бы даже тогда связать эту функцию и другие, которые вы пишете в библиотеку, которая представляет собой набор кода, который вы можете загрузить в свою программу.
следуя практике повторного использования кода, у вас даже есть база данных для подключения: кто-то создал некоторый код для хранения записей на диске, переработал его, пока он не будет использоваться другими, и решил назвать его базой данных.
библиотеки не появляются чудесным образом. Они созданы программистами, чтобы сделать их жизнь проще и позволить им работать быстрее.
Проверьте Мартин Фаулер книги on рефакторинг, или некоторые из многочисленных рефакторинг связанных интернет-ресурсов (также на stackoverflow), чтобы узнать, как вы могли бы улучшить код, который имеет запахи дублирования.
сначала создайте библиотеку с многоразовыми функциями. Они могут быть связаны с различными приложениями. Это экономит много времени и способствует повторному использованию.
также убедитесь, что библиотека проверена и документирована. Таким образом, очень легко найти правильный класс/функцию/переменную/константу.
хорошее эмпирическое правило - если вы используете один и тот же кусок три раза, и, очевидно, можно обобщить его, чем сделать его процедурой/функцией/библиотекой.
однако, поскольку я становлюсь старше, а также более опытным профессиональным разработчиком, я более склонен видеть повторное использование кода как не всегда лучшую идею по двум причинам:
трудно предвидеть будущие потребности, поэтому очень трудно определить API, чтобы вы действительно использовали их в следующий раз. Он это может стоить вам вдвое больше времени - как только вы сделаете его более общим, так что во второй раз вы все равно его перепишете. Мне кажется, что особенно Java-проекты в последнее время склонны к этому, они, похоже, всегда переписываются в рамках du jour, просто чтобы быть более "легче интегрировать" или что-то еще в будущем.
в более крупной организации (я являюсь членом одной), если вам нужно полагаться на какую-то внешнюю команду (либо внутреннюю, либо третью сторону), вы можете иметь проблема. Тогда ваше будущее зависит от их финансирования и ресурсов. Поэтому использование иностранного кода или библиотеки может быть большой нагрузкой. Аналогичным образом, если Вы делитесь частью кода с какой-то другой командой, они могут ожидать, что вы будете его поддерживать.
обратите внимание, однако, это больше похоже на бизнес-причины, поэтому в open source почти всегда хорошо быть многоразовым.
чтобы получить повторное использование кода, вам нужно стать мастером...
- давая вещи имена, которые захватывают их сущность. Это действительно очень важно
- убедитесь, что он делает только одну вещь. Это действительно возвращается к первому пункту, если вы не можете назвать его по своей сути, то часто он делает слишком много.
- Поиск вещи где-то логично. Снова это возвращается к способности хорошо называть вещи и захватывать их сущность...
- группировка его с вещами, которые строятся на центральной концепции. Как и выше, но сказал differntly :-)
первое, что нужно отметить, это то, что с помощью копирования и вставки вы повторно используете код-хотя и не самым эффективным способом. Вы распознали ситуацию, в которой вы ранее придумали решение.
есть две основные области, о которых вы должны знать, когда думаете о повторном использовании кода. Во-первых, повторное использование кода в проекте и, во-вторых, повторное использование кода между проектами.
тот факт, что у вас есть кусок кода, который можно скопировать и вставить в проект должен быть намек на то, что фрагмент кода, на который вы смотрите, полезен в другом месте. Это время, чтобы сделать его функцией и сделать его доступным в рамках проекта. В идеале вы должны заменить все вхождения этого кода своей новой функцией, чтобы она (a) уменьшала избыточный код и (b) гарантировала, что любые ошибки в этом куске кода должны быть исправлены только в одной функции вместо многих.
вторая область, повторное использование кода в проектах, требует дополнительной организации для получения максимальная выгода. Эта проблема была рассмотрена в нескольких других вопросах SO, например. здесь и здесь.
хорошим началом является организация кода, который, вероятно, будет повторно использоваться в проектах в исходные файлы, которые являются максимально автономными. Минимизируйте объем поддержки, специфичный для проекта, код, который требуется, так как это облегчит повторное использование целых файлов в новом проекте. Это означает минимизацию использования конкретных типов данных проекта , минимизация использования конкретных глобальных переменных проекта и т. д.
Это может означать создание файлов утилит, содержащих функции, которые, как вы знаете, будут полезны в вашей среде. например. Общие функции базы данных, если вы часто разрабатываете проекты, зависящие от баз данных.
Я думаю, что лучший способ ответить на вашу проблему-создать отдельную сборку для ваших важных функций.. таким образом, вы можете создавать методы расширения или изменять вспомогательную сборку.. подумайте об этой функции..
ExportToExcel (дата списка, имя файла строки)
этот метод можно использовать для ваших будущих функций экспорта excel, поэтому почему бы не сохранить его в вашей собственной вспомогательной сборке.. i таким образом, вы просто добавляете ссылку на эти сборки.
в приведенном примере соответствующее решение заключается в том, чтобы написать функцию, которая принимает в качестве параметров все, что вы редактируете, когда вставляете блок, а затем вызываете эту функцию с соответствующими данными в качестве параметров.
попробуйте привыкнуть использовать функции и библиотеки других людей.
обычно вы обнаружите, что ваша конкретная проблема имеет хорошо проверенное, элегантное решение.
даже если решения, которые вы найдете, не идеально подходят, вы, вероятно, получите много понимания проблемы, увидев, как другие люди справились с ней.
Я сделаю это на двух уровнях. Сначала в классе или пространстве имен поместите этот фрагмент кода, который повторно используется в этой области, в отдельный метод и убедитесь, что он вызывается.
во-вторых, это что-то похожее на случай, который вы описываете. Это хороший кандидат для размещения в библиотеке или вспомогательном / служебном классе, который можно использовать более широко.
важно оценить все, что вы делаете, с точки зрения того, можно ли сделать его доступным для другие для повторного использования. Это должен быть фундаментальный подход к программированию, что большинство из нас не понимают.
обратите внимание, что все, что должно быть повторно использовано, должно быть задокументировано более подробно. Его соглашение об именах должно быть отдельным, все параметры, возвращаемые результаты и любые ограничения/ограничения/предварительные условия, которые необходимы, должны быть четко документированы (в коде или файлах справки).
Это зависит от того, какой язык программирования вы используете. На большинстве языков вы можете
- напишите функцию, параметризуйте ее, чтобы разрешить вариации
- написать объект функции, с членами для хранения различных данных
- разработать иерархию (объект функции?) классы, реализующие еще более сложные вариации
- В C++ вы также можете разрабатывать шаблоны для создания различных функций или классов при компиляции время
легко: всякий раз, когда вы поймаете себя на копировании-вставке кода, выньте его тут (т. е. не делайте этого после того, как вы уже несколько раз кодировали CP'D) в новую функцию.