کامپوننت در برنامه نویسی چیست؟
اگر شما هم وارد دنیای برنامهنویسی شده باشید، حتما نام کامپوننت در برنامه نویسی را شنیدهاید. به همین دلیل ما در دسمت تصمیم گرفتیم به طور کامل درباره موضوعاتی چون معرفی مفهوم کامپوننتها، بیان ویژگی و مزایای آن و همچنین تفاوت آن با مفهوم آبجکت در مبحث شی گرایی را بیان کنیم. پس اگر شما هم خواستار بالابردن معلومات خود در علم برنامه نویسی برای شروعی بهتر هستید، حتما تا پایان مطلب همراه ما باشید.
معرفی معماری های پر استفاده در برنامه نویسی
معماری و الگوهای مورد استفاده در مبحث برنامهنویسی براساس استفاده از ساختارهای جداگانه و مستقل به منظور تسهیل توسعه، نگهداری و مدیریت سیستمها طراحی میشوند. به همین خاطر ما در ادامه، قبل از پرداختن به مبحث کامپوننتها، میخواهیم برخی از رایجترین آنها را معرفی کنیم که به شرح زیر است:
-
معماری مبتنی بر خدمات (Service-Oriented Architecture - SOA)
در معماری SOA، سیستم به عنوان یک مجموعه از خدمات تعریف میشود که میتوانند مستقل از یکدیگر و مجددا استفاده شوند. هر خدمت میتواند به صورت مستقل اجرا شده و از طریق شبکه با سایر خدمات ارتباط برقرار کند. از ویژگیهای بارز این معماری باید به مواردی چون قابلیت استفاده مجدد بالا، تسهیل، توسعه با افزودن و یا بهروزرسانی خدمات، امکان اجرای خدمات در محیطهای مختلف و کاهش وابستگی بین خدمات، اشاره کرد.
-
معماری مبتنی بر کامپوننت (Component-Based Architecture)
در این معماری، سیستم به عنوان یک مجموعه از کامپوننتها (واحدهای مستقل و قابل استفاده مجدد) تعریف میشود. هر کامپوننت مسئولیتهای خاصی را برعهده دارد و میتواند به صورت مستقل اجرا شود. از ویژگیهای این معماری باید مواردی چون توسعهپذیری با افزودن کامپوننتهای جدید، قابلیت استفاده مجدد واحدهای کد، جداپذیری و واحدپذیری بالا و کاهش تداخل بین کامپوننتها را نام برد.
-
معماری مبتنی بر مدل-نما-کنترل (Model-View-Controller - MVC)
در معماری MVC، سیستم به سه بخش اصلی تقسیم میشود:
- مدل (Model) که داده و منطق تجاری را نمایش میدهد.
- نما (View) که اطلاعات را به کاربر نمایش میدهد.
- کنترل (Controller) که ارتباط بین مدل و نما را مدیریت میکند.
پس میتوان از ویژگیهای مهم این معماری مواردی چون جداپذیری مدل، نما و کنترل، قابلیت تست بالا با تفکیک عملیات و همچنین تسهیل توسعه با افزودن یا تغییر هر یک از بخشها را نام برد.
-
معماری مدل-نما-مدل-ویو (Model-View-ViewModel - MVVM)
MVVM یک توسعه از الگوی MVC است که برای اپلیکیشنهای رابط کاربری (UI) تعریف شده است. در این معماری، ViewModel به عنوان یک لینک بین مدل و نما عمل میکند و ارتباط دوطرفه بین آنها را فراهم میکند. از ویژگیهای آن میتوان به مواردی چون جداپذیری کامل بین مدل، نما و ViewModel، امکان اعمال داده و اطلاعات به نما از طریق ViewModel و قابلیت تست بالا با تفکیک وظایف، اشاره کرد.
-
معماری مبتنی بر میکروسرویس (Microservices Architecture)
در این معماری، سیستم به صورت مستقل و مجزا از میکروسرویسها تشکیل شده است. هر میکروسرویس یک واحد کوچک و مستقل از سایر میکروسرویسها را اجرا میکند و از طریق شبکه با سایر اجزا، ارتباط برقرار میکند. مهمترین ویژگی این معماری، مستقلبودن میکروسرویسها با امکان توسعه آن است.
کامپوننت چیست؟
قبل از تعریف این مفهوم در برنامهنویسی، بهتر است معماری مبتنی بر کامپوننت را به عنوان یک بلوک لگو در نظر بگیرید. در زمان ساخت سازهای از بلوکهای لگو، شما میتوانید شکلها، اندازهها و رنگهای مختلفی از لگوها را انتخاب کنید. همچنین بلوک هایی وجود دارند که به طور هدفمند برای ساخت درها، پنجرهها و سایر عناصر طراحی شدهاند که هر بلوک با داشتن تمام ویژگیها، برای اتصال به سایر بلوکها نیازمند است و اضافه و کم شدن بلوکها در ساختار سازه لگو ما تغییری ایجاد نمیکند.
با این مثال میتوان گفت کامپوننتها در برنامه نویسی یک قسمت کوچک از کل پروژه هستند تا توسعهدهندگان اجزایی بسازند که عملکردهای خاص را به خوبی تعریف کرده باشد. به عبارت بهتر، معماری مبتنی بر کامپوننت، هر جز را از سایر اجزا جدا کرده تا انعطافپذیری و قابلیت تغییر بیشتر در برنامه افزایش یابد و این رویکرد به توسعهدهندگان اجازه میدهد تا از قطعه کدهای خود، قابلیت استفاده مجدد در دیگر پروژهها را داشته باشند. این معماری علاوهبر بالا بردن سرعت برنامهنویسان در توسعه برنامهها، باعث مدیریت بهتر ساختار قطعه کد نیز میگردد. پس کامپوننت، بخشی مستقل به لحاظ عملکردی در هر سیستم است که یک یا چند وظیفه منطقی را نشان میدهد.
معرفی ویژگیهای یک کامپوننت در برنامه نویسی
اکنون که با مفهوم این واژه در برنامه نویسی آشنا شدهاید، به سراغ بیان ویژگیهای معماری مبتنی بر کامپوننت میرویم که از مهمترین آنها باید به موارد زیر اشاره کرد:
-
قابلیت استفاده مجدد:
کامپوننتها معمولا برای استفاده مجدد در موقعیتهای مختلف و همچنین برای برنامههای متفاوت طراحی می شوند اما برخی از مواقع ممکن است تنها برای یک کار خاص طراحی شود.
-
قابل تعویض:
قطعه کدها میتوانند آزادانه با سایر اجزای مشابه جایگزین شوند.
-
استفاده در پلتفرمهای مختلف:
کامپوننتها برای عملکرد در محیطها و زمینههای مختلف طراحی شدهاند.
-
توسعهپذیر:
یک جز از کامپوننت را می توان برای ارائه رفتار جدید از اجزای موجود، گسترش داد.
-
مستقل بودن
کامپوننتها بهگونهای طراحی شدهاند که وابستگی کمتری به اجزای دیگر داشته باشند.
انواع کامپوننتها در برنامهنویسی
انواع کامپوننتها در برنامهنویسی متنوع هستند و بسته به زمینه و زبان برنامهنویسی، میتوانند تفاوت داشته باشند که در اینجا چند نوع عمومی از کامپوننتها را معرفی و یک ساختار کلی از چگونگی تعریف و استفاده از آنها با زبان پایتون را بیان کنیم.
-
کامپوننتهای واسط کاربری (UI Components)
این کامپوننتها مسئول نمایش اطلاعات به کاربر و دریافت ورودی از او هستند که مهمترین آنها شامل دکمهها، فرمها، جداول و اجزا گرافیکی در برنامه است.
قطعه کد زیر مربوط یه یک کلاس در وب اپلیکیشنی که مسئول نمایش اطلاعات به کاربر و دریافت ورودی از وی است را نشان میدهد.
class WebPage:
def display_data(self, data):
# نمایش اطلاعات به کاربر
pass
def get_user_input(self):
# دریافت ورودی از کاربر
-
کامپوننتهای منطق تجاری (Business Logic Components)
این کامپوننتها مسئول اجرای منطق تجاری یا قوانین کسبوکار در یک برنامه هستند که کلاسها و توابعی که عملیات اصلی برنامه را انجام میدهند، از مهمترین کامپوننتهای این دسته قرار دارند.
قطعه کد زیر مربوط یه یک کامپوننت برای مدیریت تسکها در یک برنامه است.
class TaskManager:
def add_task(self, task):
# اضافه کردن وظیفه به لیست
pass
def complete_task(self, task):
# انجام شدن وظیفه
pass
-
کامپوننتهای دسترسی به داده (Data Access Components)
این کامپوننتها مسئول ارتباط با منابع داده مثل پایگاه دادهها هستند. آنها میتوانند اطلاعات را از منابع داده بخوانند، آنها را تغییرا داده یا حتی اطلاعات را ذخیره کنند.
قطعه کد زیر یک کلاس مربوط به ارتباط با پایگاه داده برای ذخیره و بازیابی وظایف است.
class TaskDatabase:
def save_task(self, task):
# ذخیره وظیفه در پایگاه داده
pass
def retrieve_tasks(self):
# بازیابی وظایف از پایگاه داده
pass
-
کامپوننتهای خدمات (Service Components)
این کامپوننتها مسئول ارائه خدمات مختلف به برنامه هستند. مثلا خدمات شبکه، خدمات تحلیل و پردازش داده و خدمات امنیتی.
قطعه کد زیر یک کلاس مربوط به ارائه خدمات مرتبط با محاسبات ریاضی را نشان میدهد.
class MathService:
def add_numbers(self, num1, num2):
# جمع دو عدد
pass
def multiply_numbers(self, num1, num2):
# ضرب دو عدد
pass
-
کامپوننتهای تست (Testing Components)
این کامپوننتها شامل توابع و اجزایی هستند که برای انجام تست و اعتبارسنجی عملکرد برنامه استفاده میشوند. به عنوان مثال قطعه کد زیر یک تابع برای انجام تست واحد بر روی کامپوننت منطق تجاری است.
def test_task_manager():
# تست اضافه کردن وظیفه به لیست
# ...
# تست انجام شدن وظیفه
# ...
-
کامپوننتهای ارتباطی (Communication Components)
این کامپوننتها مسئول برقراری ارتباطات بین کامپوننتها هستند؛ مثلا تعریف واسطها یا APIها که کامپوننتها از آنها برای ارتباط با یکدیگر استفاده میکنند.
در زیر یک قطعه کد مربوط به API برای ارتباط بین بخشهای مختلف یک سیستم را مشاهده میکنید.
class RestAPI:
def get_data(self, endpoint):
# درخواست گرفتن اطلاعات از یک نقطه پایانی (endpoint)
pass
def send_data(self, endpoint, data):
# ارسال اطلاعات به یک نقطه پایانی
pass
-
کامپوننتهای ایجاد کننده (Factory Components)
این کامپوننتها مسئول ایجاد نمونه اشیا و اجزا هستند. مثلا الگوی طراحی Factory Method، این نوع را معرفی میکند. قطعه کد زیر، یک کلاس فابریک (Factory) برای ایجاد نمونههای کلاسهای مختلف است.
class ComponentFactory:
def create_ui_component(self):
# ایجاد یک نمونه از کامپوننت واسط کاربری
pass
def create_data_access_component(self):
# ایجاد یک نمونه از کامپوننت دسترسی به داده
pass
در نهایت مهم است بدانید که در معماری مدرن امروز، از مفاهیمز مانند میکروسرویسها و کانتینرها نیز برای ایجاد و مدیریت کامپوننتها استفاده میشود که این مفاهیم برای تسهیل توسعه، نگهداری و مقیاسپذیری برنامهها بسیار موثر هستند.
مزایای استفاده از کامپوننت در برنامه نویسی
باتوجه به آنچه که تاکنون از کامپوننتها در برنامه نویسی بیان کردیم، مزایای استفاده از این معماری در توسعه برنامهها شامل موارد زیر است:
- سهولت توسعه و استقرار با در دسترس قرار گرفتن نسخههای سازگار جدید و جایگزینی آنها با نسخه های موجود بدون هیچ تاثیری بر سایر اجزا یا سیستم
- کاهش هزینه توسعه و نگهداری و همچنین استفاده در چندین برنامه یا سیستم
- اصلاح پیچیدگی فنی
- افزایش قابلیت اطمینان از طریق استفاده مجدد
- نگهداری و تکامل سیستم
- تغییر و به روز رسانی پیاده سازی آسان بدون تاثیر بر بقیه سیستم
- کاهش پیچیدگی کلی سیستم و مدیریت بهتر برنامه
- استقلال و اتصال انعطاف پذیر اجزا
- توسعه مستقل اجزا توسط گروه های مختلف به صورت موازی
- مدیریت منابع و تضمین بهترین استفاده از منابع موجود
برخی از نکات مهم در مورد کامپوننتها:
آیا شما هم نکات مربوط به استفاده از این معماری در برنامههای خود را میدانید؟
کافیست برای اطلاع از این موضوع در ادامه مطلب همراه درسمن باشید، چراکه مطالب مهم این بخش شامل موارد زیر است:
-
جداپذیری (Separation of Concerns)
اولین مساله مربوط به نحوه استفاده از معماری کامپوننت محور در برنامه نویسی بوده که یکی از مهمترین اصلهای آن، جداپذیری است. این اصل بیان میکند که باید بخشهای مختلف یک برنامه از هم جدا بوده و هر قسمت، مسئولیت خاص خود را داشته باشد تا تغییرات در یک بخش، اثر کمتری روی سایر بخشها داشته باشد.
-
پیادهسازی تعدادی از کامپوننتها
نکته دوم به نحوه پیادهسازی کامپوننتها اشاره دارد که بسیاری از برنامهنویسیهای مدرن امروزی، از کامپوننتهای مختلف در یک برنامه متمرکز هستند. به عنوان مثال برای معماری برنامهنویسی چندلایهای (Multilayer Architecture) از لایهها و کامپوننتهای مختلفی چون لایه واسط کاربری (UI)، لایه منطق تجاری (Business Logic) و لایه دسترسی به داده (Data Access) بهره میبرند.
-
تعامل بین کامپوننتها
مورد مهم دیگر برای اجرای این معماری متعلق به تعامل آنها است که کامپوننتها باید قابلیت تعامل با یکدیگر را داشته باشند که این تعامل میتواند از طریق واسطها یا APIها صورت بگیرد.
-
استفاده از کتابخانهها و فریمورکها
نکته بعدی این است که معمولا برنامهنویسان برای ساخت کامپوننتهای خود از کتابخانهها و فریمورکها استفاده میکنند، چراکه این کتابخانهها و فریمورکها عملکردهای خاص را فراهم و به برنامهنویس اجازه میدهد تا تمرکز خود را بر روی مسائل اصلی برنامه قرار دهند.
-
تست و نگهداری آسان
حتما این نکته را در نظر داشته باشید کهکامپوننتها باید قابلیت تست و نگهداری آسان را داشته باشند تا باعث افزایش اعتماد بهنفس شما در خصوص توسعه آسانتر کدها شود.
معرفی اصول طراحی مبتنی بر کامپوننت
اما از مهمترین مباحث پر اهمیت در بخش اصول طراحی مبتنی بر کامپوننت باید به موارد زیر اشاره کرد:
- هر سیستم نرم افزاری باید به واحدهای اجزای قابل استفاده مجدد، منسجم و محصور شده تجزیه شود.
- هر جز دارای رابط مخصوص به خود است که پورتهای مورد نیاز و ارائه شده را مشخص کرده و هر جز اجرای دقیق خود را پنهان می کند.
- یک کامپوننت باید بدون نیاز به ایجاد کد داخلی یا تغییرات طراحی در قسمتهای موجود کامپوننت، گسترش یابد.
- تعامل مولفهها میتواند به شکل فراخوانی ناهمزمان، پخش، تعاملات پیام محور، ارتباطات جریان داده و سایر تعاملات خاص، در ارتباط باشند.
- برای یک کلاس سرور، رابط های تخصصی باید ایجاد شود تا به دسته های اصلی مشتریان خدمات ارائه دهند. در حقیقت فقط آن دسته از عملیاتی که مربوط به دسته خاصی از مشتریان هستند باید در رابط مشخص شوند.
تفاوت بین Component و Object
سوالی که در اکثر مواقع ذهن برنامهنویسان را بعد از یادگیری معماری کامپوننت محور به خود مشغول میکند، تفاوت بین Component و Object است که برای پاسخ به آن توجه شما را به جدول زیر جلب میکنم:
Object | Component |
آبجکتها معمولاً به عنوان نمونههای خاص از یک کلاس یا نوع داده در برنامهنویسی شیءگرا ایجاد میشوند. | کامپوننتها میتوانند به صورت مستقل و مجزا از یکدیگر در برنامهنویسی شیگرا یا سایر مبحث برنامهنویسی ایجاد و استفاده شوند. |
آبجکتها معمولا قابلیت استفاده مجدد در داخل برنامه را دارند اما ممکن است نیاز به تغییرات و افزودن ویژگی داشته باشند. | کامپوننتها به عنوان واحدهای قابل استفاده مجدد طراحی میشوند و میتوانند به صورت مستقل و مجدد، در برنامهها و سیستمهای مختلف استفاده شود. |
آبجکتها به صورت اصول اصلی در برنامهنویسی شیگرا حضور دارند و در آن تاکید بر ارتباطات بین اشیا دارند. | کامپوننتها در برنامهنویسی کامپوننت-محور یا معماری مبتنی بر سرویس معمولا به عنوان واحدهای مجزا از منظر ویژگیها یا خدمات در نظر گرفته میشوند. |
در برنامهنویسی شیگرا، هر شیءمیتواند مستندات خود را داشته باشد تا توضیحاتی در مورد ویژگیها و متدها را ارائه دهد. | کامپوننتها نیز ممکن است مستندات خود را داشته باشند اما اغلب تاکید بر مستندات استاندارد (مانند Swagger برای وب سرویسها) و توضیحات قابل استفاده برای سایر توسعهدهندگان دارند. |
در شیگرایی، متدها و ویژگیها را میتوان به صورت زنجیرهای فراخوانی کرد؛ به این ترتیب که خروجی یک متد به عنوان ورودی متد بعدی استفاده میشود. | کامپوننتها نیز ممکن است قابلیت زنجیرهسازی را داشته باشند اما این ویژگی و استفاده از آن در مفاهیم مربوط به زبانهای برنامهنویسی مانند jQuery در جاوااسکریپت یا Fluent API در C# به مراتب، مهمتر است. |
در شیگرایی، اشیا میتوانند به صورت مستقیم با یکدیگر تعامل داشته باشند و ارتباطات بین آنها را برقرار کنند. | اما کامپوننتها ممکن است، از راههای مختلفی برای تعامل با یکدیگر بهره ببرند مانند واسطهای (Interfaces) مشترک، رویدادها، یا سیگنالها (برای تعامل در سیستمهای مبتنی بر سرویس). |
اشیاء معمولاً در حداقل یک پرونده (فایل) ذخیره میشوند و پوشهبندی مرتبط با کلاسها، در پروژه وجود دارد. | اما کامپوننتها ممکن است از چندین فایل یا منبع مختلف (مثلا فایلهای متنی، تصاویر، کدهای اجرایی و غیره) تشکیل شده باشند و معمولا یک پوشه یا دایرکتوری به عنوان یک کامپوننت شناخته میشود. |
اکنون شما با واژه کامپوننت در برنامه نویسی آشنا هستید
معماری مبتنی بر کامپوننت جز کلیدی مهندسی نرم افزار مدرن امروزی محسوب میشود، چرا که، توسعهدهندگان با آن میتوانند وظایف مختلف کدنویسی را به صورت خودکار انجام داده، عملکرد برنامه را بهبود، بهرهوری را افزایش و هزینهها را کاهش دهند. پس اگر بازهم سوالی ذهن شما را درخصوص کامپوننتها به خود مشغول کرده، آن را در بخش نظرات با ما به اشتراک بگذارید.
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.