چارچوب نرم‌افزاری

**چهارچوب نرم‌افزار** (به انگلیسی: Software framework) یک طراحی قابل استفاده برای سیستم یا زیرسیستم‌های نرم‌افزاری است.

در برنامه‌نویسی کامپیوتر یک **چهارچوب نرم‌افزاری** یک انتزاع است که در آن نرم‌افزار فراهم کننده عملکردهای عمومی می‌تواند به صورت انتخابی توسط کدهای نوشته شده کاربران عوض شود، در تعریفی بهتر می‌توان گفت یک فراهم کننده طراحی‌های قابل استفاده برای نرم‌افزار است. در واقع یک چهارچوب یک راه استاندارد برای ساخت و گسترش برنامه‌ها است و یک محیط با قابلیت استفاده مجدد در محیط نرم‌افزاری است به صورتی که عملکردهای خاصی از بخش‌های یک پلتفرم بزرگ نرم‌افزاری را آماده می‌کند تا برنامه‌نویسی نرم‌افزارهای کاربردی و الگوریتم‌ها را آسان‌تر کند، چهارچوب‌های نرم‌افزاری ممکن است شامل برنامه‌های پشتیبانی، کامپایلرها، کتابخانه‌های کد، مجموعه ابزارها ورابط‌های برنامه‌نویسی برنامه (API) باشد که تمام اجزای مختلف را گرد هم آورده تا امکان توسعه یک پروژه یا سیستم فراهم کند.

چهارچوب‌های نرم‌افزاری امکانات کلیدی متمایز کننده ای دارند که آنها را از کتابخانه‌های معمولی کد متمایز می‌کند:
* وارونگی کنترل: در یک چهارچوب نرم‌افزاری، برخلاف یک کتابخانه کد کنترل جریان سراسر یک برنامه توسط صدا زننده صدا زده نمی‌شود بلکه توسط یک چهارچوب نرم‌افزاری مدیریت می‌شود. این ویژگی با استفاده از روش الگویی (Template Method Pattern) در برنامه‌نویسی شی گرا به دست می‌آید.
* *رفتار پیش فرض*: رفتار پیش فرض را می‌توان با روشهای ثابت الگویی در یک کلاس انتزاعی ارائه داد که توسط چهارچوب ارائه شده‌است.
* *توسعه پذیری*: چهارچوب نرم‌افزاری می‌تواند توسط کاربر توسعه داده شود - معمولاً با بازنویسی انتخابی در برنامه‌نویسی شی گرا - یا برنامه نویسان می‌توانند یک کد اختصاصی را برای فراهم کردن عملکردهای خاص به چهارچوب اضافه کنند. این کار نیز با یک روش به دام انداختن یک کلاس فرزند که یک نمونه را در کلاس‌های والدین بازنویسی می‌کند انجام می‌شود. (ارث بری در برنامه‌نویسی شی گرا).
* *[[اصل باز-بسته|کد چهارچوب غیرقابل اصلاح]]*: کد یک چهارچوب به‌طور کلی غیرقابل تغییر است در حالی که پیوست‌های پیاده‌سازی شده توسط کاربر می‌تواند باعث توسعه آن شود، اما کد آن تغییر نمی‌کند.

## بنیاد و پایه
طراح‌های چهارچوب‌های نرم‌افزاری با هدف آسان کردن توسعه نرم‌افزاری به برنامه نویسان و طراحان نرم‌افزاری اجازه می‌دهند تا وقت خود را برای تأمین نیازهای نرم‌افزاری خود اختصاص داده و به جزئیات استاندارد سطح پایین‌تر ارائه سیستم کاری نپردازند، که نتیجه آن کاهش زمان کلی توسعه و برنامه سازی است. به عنوان مثال، تیمی که از یک چهارچوب وب برای ساخت یک وبسایت بانکی استفاده می‌کند می‌تواند تمرکز بیشتری بر روی نوشتن کدهای مخصوص بانکی داشته باشد تا مکانیک‌های درخواست پاسخ وبسایت یا state management.

چهارچوب اغلب حجم برنامه را می‌افزاید، پدید تحت عنوان «نفخ کد». به دلیل نیازهای نرم‌افزاری کاربران با توجه به درخواست مصرف‌کنندگان هر دو چهارچوب رقابتی و مکمل گاهی در یک محصول نهایی قرار می‌گیرند. به علاوه با توجه به پیچیدگی APIهای آنها زمان کاهش یافته کلی فراینده برنامه سازی ممکن است به دلیل صرف وقت اضافی برای یادگیری استفاده از چهارچوب در نظر گرفته نشود و زمان کاهش یافته حاصل نشود، در صورتی که این انتقاد زمانی مورد قبول است که برنامه‌نویس یا توسعه دهنده برای اولین بار با یک چهارچوب خاص یا جدید روبرو شود. در صورتی که این چهارچوب در کارهای بعدی استفاده نشود زمان صرف شده برای یادگیری چهارچوب می‌تواند حتی بیشتر از زمان نوشتن کد برای یک پروژه باشد. بسیاری از برنامه نویسان برای نیازهای مشترکشان کپی‌هایی را برای خود نگه می‌دارند.

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

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

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

## مثال‌ها
چهارچوب‌های نرم‌افزاری به‌طور معمول شامل فواید و کاربردپذیری‌های قابل توجهی برای کمک به برنامه‌های کاربر هستند، اما به‌طور کلی بر روی مشکلات خاص تمرکز می‌کنند، مثال‌هایی از چهارچوب‌ها:
* طراحی هنری، آهنگسازی و CAD مکانیکی
* برنامه‌های کاربردی حسابداری و مدیریت مالی
* برنامه‌های مدل‌سازی سیستم زمین
* سیستم‌های پشتیبانی تصمیم‌گیری
* پخش رسانه و تولید محتوا
* چهارچوب Ajax / چهارچوب جاوا اسکریپت
* چهارچوب وب
* میان افزار
* چهارچوب کاکتوس - محاسبات علمی با عملکرد بالا.
* چهارچوب برنامه - برنامه‌های عمومی رابط کاربری گرافیکی.
* چهارچوب معماری سازمانی
* چهارچوب توسعه برنامه Oracle
* لاراول (چهارچوب PHP)

## معماری
بر اساس گفته‌های Pree, چهارچوب‌های نرم‌افزاری از نقاط منجمد و نقاط داغ تشکیل شده‌اند. نقاط منجمد معماری کلی یک سیستم نرم‌افزاری را تعریف می‌کنند، یعنی همان اجزای پایه و اساسی و روابط بین آنها. این موارد در نمونه سازی از چهارچوب نرم‌افزاری بدون تغییر (منجمد) باقی می‌مانند. نقاط داغ نشان دهنده قسمت‌هایی است که برنامه نویسان با استفاده از چهارچوب کدهای مختص به خودشان را برای افزایش عملکردهای خاص به پروژه خود اضافه می‌کنند.

در یک محیط شی گرا یک چهارچوب از کلاس‌های انتزاعی و انضمامی تشکیل شده‌است. مراحل ایجاد چنین چهارچوبی ترکیب و طبقه‌بندی کلاس‌های موجود است (به صورت ارث بری برنامه‌نویسی شی گرا).

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

## جستارهای وابسته
* کلاس (علوم کامپیوتر)
* الگوی طراحی (علوم کامپیوتر)
* خودت را تکرار نکن
* استناد ضمنی
* موتور نرم‌افزار

## منابع

رده:الگوهای طراحی نرم‌افزار
رده:برنامه‌نویسی شیءگرا
رده:چارچوب‌های نرم‌افزاری
رده:معماری نرم‌افزار