فریم ورک (Framework) بک اند (Backend) چیست و چرا باید از آنها استفاده کنیم؟

why-frameworks

سلام، حتما تا به حال به واژه ی فریم ورک (Framework) برخورد کرده اید. آیا می دانید فریم ورک چیست؟ به گفته ی ویکی پدیای انگلیسی:

In computer programming, a software framework is an abstraction in which software providing generic functionality can be selectively changed by additional user-written code, thus providing application-specific software. A software framework provides a standard way to build and deploy applications. A software framework is a universal, reusable software environment that provides particular functionality as part of a larger software platform to facilitate development of software applications, products and solutions. Software frameworks may include support programs, compilers, code libraries, tool sets, and application programming interfaces (APIs) that bring together all the different components to enable development of a project or system.

و به گفته ی ویکی پدیای فارسی:

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

احتمالا مثل من زمانی که این را خواندید هیچ چیزی نفهمیدید! در واقع تقصیر شما نیست. این تعاریف و دیگری تعاریفی که معمولا در دنیای وب با آنها روبرو می شوید تعاریف فنی هستند؛ یعنی بیشتر به جنبه ی تئوری و تعریف ماهیت فریم ورک می پردازند تا توضیح عملی آن.

من برای شما با یک مثال ساده فریم ورک را توضیح میدهم.

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

تصور کنید یک کاغذ به شما بدهم و بگویم آن را به صورت مربع های 5 در 5 برش بزنید. کار سختی نیست مگر نه؟ حالا تصور کنید به شما 1000 صفحه کاغذ بدهم و بگویم این ها را در اندازه های 5 در 5 برش بزنید. در چنین حالتی نیاز نیست که هر بار برای هر کاغذ با خط کش 5 سانت اندازه بگیرید. کافیست کاغذ ها را روی هم بگذارید و همه را یک دفعه (با هر دستگاهی که دوست دارید) برش بزنید.

شما در چنین حالتی یک "چهار چوب" برای کارتان تعیین کرده اید. در برنامه نویسی هم به جای اینکه یک کار را صد بار انجام دهید و هر کد را صد بار بنویسید با استفاده از فریم ورک ها آن ها را به راحتی می نویسیم. مثالی که میتوان ذکر کرد مسئله ی درخواست های AJAX است.

اگر بخواهید برای هر درخواست AJAX در یک پروژه ی بزرگ یا نسبتا معمولی، با جاوا اسکریپتِ ساده کد بنویسید کلی فشار به شما می آید!

اما اگر از فریم ورک هایی مثل Vue.js استفاده کنید کارتان بسیار راحت خواهد بود.

مثال هایی از فریم ورک های Frontend:

مثال هایی از فریم ورک های Backend:

ما قصد داریم در این قسمت در رابطه با فریم ورک های backend صحبت کنیم.

فریم ورک های backend به چه درد ما می خورند؟

فریم ورک چیست و چرا باید از آن استفاده کنیم؟ Framework

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

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

You don't have to use a server-side web framework, but it is strongly advised — it will make your life a lot easier.

منبع: سایت رسمی Mozilla

ما در این قسمت سعی داریم کار های مهمی که فریم ورک ها برای شما می کنند را نام ببریم و برای هر کدام توضیحی ارائه دهیم.

کار کردن مستقیم با درخواست های HTTP

همه ی ما میدانیم که وب سرور ها و مرورگر از طریق پروتکل HTTP (یا HTTPS) با یکدیگر ارتباط دارند.

سرور ها صبر می کنند تا یک درخواست HTTP از سمت مرورگر به آنها برسد و سپس پاسخ این درخواست را از طریق همان پروتکل HTTP به آنها برمیگردانند. فریم ورک های backend به شما این امکان را می دهند که با نوشتن کد هایی در ظاهر ساده با این درخواست های HTTP کار کنید.

مثال زیر در مورد همین مطلب و از فریم ورک Django (بر اساس Python) است:

# Django view function
from django.http import HttpResponse

def index(request):
    # Get an HttpRequest (request)
    # perform operations using information from the request.
    # Return HttpResponse
    return HttpResponse('Output string to return')

در این فریم ورک، هر تابعِ "view" (که یک مدیریت کننده ی درخواست است) یک شیء HttpRequest دریافت می کند که شامل درخواست های HTTP است. سپس تعهد دارد که یک شیء HttpResponse را برگرداند.

ارجاع درخواست ها به handler مناسب‌شان

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

فریم ورک های مختلف مکانیسم های مختلفی برای این کار دارند. به طور مثال Flask (بر پایه ی Python) با استفاده از decorator مسیری به View می دهد:

@app.route("/")
def hello():
    return "Hello World!"

اما Django از توسعه دهنده انتظار دارد لیستی از mapping های مختلف برای URL ها، بین الگوی URL و تابع View، تعریف کند:

urlpatterns = [
    url(r'^$', views.index),
    # example: /best/myteamname/5/
    url(r'^(?P<team_name>\w.+?)/(?P<team_number>[0-9]+)/$', views.best),
]

سهولت دسترسی به داده در درخواست ها

داده ها میتوانند در درخواست های HTTP کدگذاری (Encode) شوند. به طور مثال یک درخواستِ GET برای اینکه فایل یا داده ای را از سرور بگیرد ممکن است URL را تغییر داده و در این فرآیند قسمت از اطلاعات را کدگذاری کند.

چنین مواردی در مواقع دیگر نیز رخ می دهند. دسترسی به این نوع داده ها از طریق فریم ورک ها آسان تر است. به طور مثال شیء HttpRequest که Django به هر تابع view می دهد شامل متدها و خصوصیاتی برای دسترسی به URL هدف، نوع درخواست (مانند GET یا POST)، داده های کوکی ها و session ها و ... است.

دسترسی ساده به پایگاه داده

ما از پایگاه های داده برای ذخیره ی اطلاعات کاربران و به اشتراک گذاری آن ها استفاده می کنیم. فریم ورک ها معمولا لایه ای به پایگاه داده اضافه می کنند که عملیات خواندن، نوشتن، درخواست و حذف را به حالت انتزاعی در می آورد. این لایه ی انتزاعی به نام (Object-Relational Mapper (ORM معروف است. استفاده از ORM دو مزیت دارد:

  1. شما می توانید پایگاه داده را تغییر بدهید بدون اینکه نیاز باشد کد های مختلف مربوط به آن را دوباره نویسی کنید. به این شکل توسعه دهندگان می توانند پایگاه های داده ی خود را بهینه کنند بدون اینکه وقت خود را برای دوباره نویسی کد های مورد استفاده ی پایگاه داده هدر بدهند.
  2. اعتبار سنجی ساده ی داده می تواند در خود فریم ورک صورت بپذیرد؛ به این ترتیب بررسی داده ها و اینکه در field مناسب و با فرمت مناسب در پایگاه داده ذخیره شده باشند ساده تر و امن تر می شود.

به طور مثال نمونه کد ذیر یک کد Django را نشان می دهد که مدلی از شیء Team را دارد. این شیء نام تیم و سطح آن را به صورت فیلد های کاراکتری ذخیره کرده و برای هر ردیف محدودیت کاراکتری تعریف می کند.

#best/models.py

from django.db import models 

class Team(models.Model): 
    team_name = models.CharField(max_length=40) 

    TEAM_LEVELS = (
        ('U09', 'Under 09s'),
        ('U10', 'Under 10s'),
        ('U11, 'Under 11s'),
        ...  #list our other teams
    )
    team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')

نمایش داده ها

فریم ورک ها معمولا سیستم های قالب پیشرفته ای دارند که به شما اجازه می دهند ساختار یک سند خروجی را تعیین کنید؛ مثلا استفاده از placeholder برای داده ای که هنگام بارگذاری صفحه قرار است در فیلدی قرار بگیرد.

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

به طور مثال Django به شما اجازه می دهد از ساختار {variable_name }} برای اشاره به یک متغیر استفاده کنید. این متغیر پس از بارگذاری صفحه با مقدار اصلی اش تعویض می شود. در مثال زیر می توانید نحوه ی چنین کارکردی را مشاهده کنید.

#best/templates/best/index.html

<!DOCTYPE html>
<html lang="en">
<body>

 {% if youngest_teams %}
    <ul>
    {% for team in youngest_teams %}
        <li>{{ team.team_name }}</li>
    {% endfor %}
    </ul>
{% else %}
    <p>No teams are available.</p>
{% endif %}

</body>
</html>

اینها برخی از عملیات های جالبی بود که می توان با فریم ورک های امروزی پیاده سازی کرد. البته این ها تنها استفاده های یک فریم ورک نیستند و همانطور که قبلا گفتیم می توانید استفاده های زیادی از آن ها ببرید (مانند راحت کردن کار های روتین مثل درخواست های AJAX و ...). امیدوارم از این قسمت استفاده ی کافی را برده باشید.

در پناه حق.

نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سینا قاسمی
25 خرداد 1399
-اگر بخواهید برای هر درخواست AJAX در یک پروژه ی بزرگ یا نسبتا معمولی، با جاوا اسکریپتِ ساده کد بنویسید کلی فشار به شما می آید! این نوشتار به تنهایی روز بنده رو ساخت! باعث شد بفهمم که من تنها نیستم.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.