**استفاده مجدد از کد** ، که **استفاده مجدد از نرم افزار** نیز نامیده می‌شود ،  بر اساس بازبهره‌پذیری ، استفاده از نرم افزارِ موجود یا دانش نرم افزاری برای ساختن نرم افزار جدید است.

بررسی اجمالی
------------

استفاده مجدد از کد اولیه، در اولین روزهای برنامه نویسی مورد استفاده قرار گرفته است. برنامه نویسان همیشه از بخش‌های کد، قالب‌ها، عملکردها و رویه‌ها استفاده مجدد کرده‌اند. با اینکه استفاده مجدد از نرم افزار به عنوان یک حوزۀ شناخته شده برای مطالعه مهندسی نرم افزار است اما فقط از سال 1968 میلادی شروع می‌شود که داگلاس مک لیروه از آزمایشگاه‌های بل، مبنای صنعت نرم افزار را بر روی اجزا با قابلیت استفاده مجدد پیشنهاد کرد. 

استفاده مجدد از کد با هدف صرفه‌جویی در وقت و منابع و کاهش فراوانی و با بهره‌گیری از تجربه‌های با ارزشی که قبلاً به نوعی در فرایند توسعه محصول نرم افزاری بدست آمده‌اند، ایجاد شده است.  ایده اصلی در استفادۀ مجدد این است که بخش‌هایی از یک برنامه کامپیوتری که به طور همزمان نوشته شده‌اند، می‌توانند در ساختار برنامه‌های دیگری که بعدا نوشته می‌شوند، استفاده شوند. 

استفاده مجدد از کد ممکن است به معنی ایجاد نسخه جداگانه دارایی‌های قابل استفاده مجدد باشد. در حالی که کد، رایج‌ترین منبع انتخاب شده برای استفاده مجدد است، سایر دارایی‌های ایجاد شده در چرخه توسعه ممکن است فرصت‌هایی را برای استفاده مجدد فراهم کنند: مؤلفه‌های نرم افزار، مجموعه تست، طرح ها، مستندات و غیره. 

یکی از مثال‌های خوب استفاد مجدد از کد، کتابخانه‌های نرم افزاری است. برنامه نویسان ممکن است چکیده‌های داخلی ایجاد کنند یا ممکن است کتابخانه‌های سفارشی برای استفاده خود ایجاد کنند، تا قسمت‌های خاصی از برنامه آنها مورد استفاده مجدد قرار گیرد. برخی از خصوصیاتی که باعث می‌شود قابلیت استفادۀ مجدد نرم افزارها بیشتر شود عبارتند از: پیمانه‌ای بودن، همراهی آزادانه، انسجام زیاد، پنهان کردن اطلاعات و تفکیک دغدغه‌هاست. 

برای استفاده از یک قطعه کد موجود جهت استفاده در یک کد تازه نوشته شده، باید نوعی رابط یا وسیله ارتباطی تعریف شود. این موارد معمولاً شامل «تماس» یا استفاده از یک زیر روال، شی، کلاس یا نمونه اولیه است. در سازمان‌ها، چنین شیوه‌هایی توسط مهندسی دامنه، که به عنوان مهندسی خط تولید نرم افزار نیز شناخته می‌شود، رسمی و استاندارد می‌شود. 

همچنین نوع دیگری از استفاده مجدد از کد، استفاده از نسخه قبلی یک برنامه موجود به عنوان نقطه شروع برای نسخه بعدی است. 

بعضی از به اصطلاح «استفادۀ مجدد از کد» شامل یک کپی ساده از قسمت‌هایی یا همۀ کد یک برنامۀ موجود برای ساخت یک برنامۀ جدید است. در حالی که شرکت‌ها می‌توانند با استفاده از این قابلیت، فرصتی برای بازاریابی محصول در حال تولید پیدا کنند، در نتیجه می‌توانند با بسیاری از مشکلات تکراری همان کد که ناشی از برنامه نویسی برش و چسباندن است، تحمیل شوند. 

بسیاری از محققان تلاش کرده‌اند تا استفاده مجدد را سریع‌تر، آسان‌تر، منظم‌تر و بخشی جدایی‌ناپذیر از روند عادی برنامه نویسی قرار دهند. اینها برخی از اهداف اصلی اختراع برنامه‌نویسی شیءگرا است که به یکی از رایج‌ترین شکل‌های استفاده مجدد تبدیل شده است. یکی از اختراع‌هایی که مدتی دیگر خواهیم دید، برنامه نویسی عمومی است. 

وسیله جدیدتر دیگر استفاده از نرم افزار «ژنراتور» است، برنامه‌هایی که می‌توانند بر اساس مجموعه پارامترهایی که کاربران انتخاب می‌کنند، برنامه‌های جدیدی ایجاد کنند. زمینه‌های مطالعه در مورد چنین سیستم‌هایی برنامه نویسی مولد و برنامه نویسی استرالیا هستند .

انواع استفاده مجدد
------------------

در مورد انگیزه و عوامل مؤثر در استفاده مجدد از کد می‌توان به موارد زیر اشاره کرد:

فرصت طلبی: اعضای تیم در حین آماده شدن پروژه، متوجه اجزایی با قابلیت استفادهٔ مجدد خواهند شد.

برنامه‌ریزی شده: از لحاظ استراتژیک، تیم مولفه‌هایی را طراحی می‌کند که در پروژه‌های آینده قابل استفاده باشند.

طبقه‌بندی‌های بیشتری برای استفادهٔ مجدد وجود دارد:

* استفاده مجدد داخلی: تیم از اجزای خود استفادهٔ مجدد می‌کند که این ممکن است یک تصمیم تجاری باشد، زیرا ممکن است این یک جز مهم از پروژه باشد.
* استفاده مجدد خارجی: یک تیم ممکن است مجوز یک جزء شخص ثالث را انتخاب کند. صدور مجوز برای یک مؤلفه شخص ثالث معمولاً برای تیم داخلی ۱ تا ۲۰ درصد از هزینه ای که برای توسعه داخلی هزینه می‌کند، هزینه دارد. تیم همچنین باید زمان لازم برای یافتن، یادگیری و ادغام مؤلفه را در نظر بگیرد.

قاعده
-----

استفاده مجدد از نرم افزار سیستمی یک استراتژی برای افزایش بهره وری و بهبود کیفیت صنعت نرم افزار است. اگرچه بیان ساده ای دارد ولی اجرای مجدد موفقیت آمیز نرم افزار کاری دشوار است دلیل این امر وابستگی استفاده ی مجدد به زمینه ای است که در آن پیاده سازی شده است.برخی از موضوعات مشکل ساز که باید در رابطه با استفاده مجدد از نرم افزارهای منظم برطرف شوند عبارتند از:

* چشم انداز واضح از محصول یکی از پایه های اساسی در SPL است.
* یک استراتژی اجرایی تکاملی یک استراتژی واقع بینانه برای شرکت خواهد بود.
* برای اطمینان از موفقیت ، نیاز به حمایت و مدیریت مداوم مدیریت وجود دارد.
* یک ساختار سازمانی مناسب برای پشتیبانی از مهندسی SPL مورد نیاز است.
* تغییر ذهنیت یک شرکت پروژه محور به یک شرکت محصول محور امری ضروری است.

مثال ها
-------

**کتابخانه های نرم افزار**

نمونه بسیار متداول استفاده مجدد از کد، روش استفاده از کتابخانه نرم افزاری است.بسیاری از عملیاتهای رایج ، از جمله تبدیل اطلاعات در بین قالبهای مختلف شناخته شده ، دسترسی به فضای ذخیره سازی خارجی ، رابط با برنامه های خارجی یا دستکاری اطلاعات (اعداد ، کلمات ، نام ها ، مکان ها ، تاریخ ها و غیره) به روش های معمول ، مورد نیاز بسیاری از افراد مختلف است.نویسندگان برنامه های جدید می توانند به جای "دوباره اختراع چرخ" ، مثل نوشتن کد کاملاً جدید به طور مستقیم در یک برنامه برای انجام یک عملیات ، از کد در یک کتابخانه نرم افزاری استفاده کنند.پیاده سازی کتابخانه ها غالباً از مزیت هایی مثل تست شده و پوشش دادن موارد غیرمعمول و محرمانه برخوردار هستند.معایب آن عبارتند از عدم امکان نشان دادن جزئیات که ممکن است بر عملکرد یا خروجی مورد نظر ، و زمان و هزینه دستیابی ، یادگیری و پیکربندی کتابخانه تأثیر بگذارد.

**الگو های طراحی**

الگوی طراحی یک راه حل کلی برای مشکلاتی است که مدام تکرار می شوند. الگوهای طراحی مفهومی تر و ملموس تر هستند و می توانند دقیقا متناسب با نیاز طراحی شوند. این حال ، کلاسها و رابطهای انتزاعی برای پیاده سازی الگوهای خاص قابل استفاده هستند.

**چارچوب ها**

توسعه دهندگان معمولاً از طریق برنامه های شخص ثالث و چارچوب ها، از نرم افزارهای بزرگ استفاده مجدد می کنند.اگرچه چارچوب ها معمولاً مخصوص دامنه هستند و فقط برای گروه هایی از برنامه ها کاربرد دارند.

**عملکرد مرتبه بالاتر**

در برنامه نویسی کاربردی در بسیاری از موارد که همچون چارچوب ها و الگو های طراحی، می توان از توابع مرتبه بالاتر استفاده کرد.

**متقابل**

از آنجا که برنامه های یکپارچه سازی سیستم عامل ها روی رایانه های قدیمی تر یا شبیه ساز آنها اجرا می شود، تقابل نیز یک نوع استفاده مجدد از کد است.

**امنیت کامپیوتر**

استفاده مجدد از کد در امنیت رایانه به عنوان یک روش بهره برداری از نرم افزار استفاده می شود. مثلا زمانی که یک مهاجم قادر به وارد کردن مستقیم یک کد برای تغییر کنترل جریان نیست، می تواند جریان کنترل را به دنباله های موجود در حافظه هدایت کند.نمونه ای از حملات استفاده مجدد از کد برنامه نویسی پرش گرا است.

**اجزا**

یک مؤلفه ، در یک حوزه ی شی گرا ، مجموعه ای از کلاس های مشارکتی (یا فقط یک کلاس) و رابط های آن را نشان می دهد. اجزای قابل استفاده مجدد همچنین با استفاده از فن آوری های مدیریت کد منبع اجزا (CSCM) می توانند ایزوله و هماهنگ شوند

منابع
-----

1. ↑  Frakes, W.B.; Kyo Kang (July 2005). "Software Reuse Research: Status and Future" (PDF). *IEEE Transactions on Software Engineering*. **31** (7): 529–536. CiteSeerX 10.1.1.75.635. doi:10.1109/TSE.2005.85. Archived from the original (PDF) on 7 August 2017. Retrieved 24 November 2019.
2. ↑  Lombard Hill Group. "What Is Software Reuse?". *lombardhill.com*. Lombard Hill Group. Archived from the original on 23 January 2019. Retrieved 22 October 2014.
3. ↑  Lombard Hill Group. "What Is Software Reuse?". Archived from the original on 23 January 2019. Retrieved 22 October 2014.
4. ↑  McConnell, Steve (1996). *Rapid Development: Taming Wild Software Schedules*. ISBN 978-1-55615-900-8.