کپسولهسازی (Encapsulation) یکی از مفاهیم اصلی در برنامهنویسی شیءگرا است که در زبانهای برنامهنویسی مختلف از جمله دارت (Dart) نیز کاربرد دارد. کپسولهسازی به این معنی است که دادهها (فیلدها یا ویژگیها) و رفتارها (متدها یا توابع) مرتبط با یک شیء در یک واحد قرار میگیرند و دسترسی به دادهها محدود میشود تا از تغییرات ناخواسته یا نادرست جلوگیری شود.
کتابخانه در دارت چیست؟
به طور پیش فرض، هر فایل .dart یک کتابخانه است. کتابخانه مجموعه ای از توابع و کلاس ها است. یک کتابخانه را می توان با استفاده از کلمه کلیدی import به کتابخانه دیگری وارد کرد.
چگونه در دارت به کپسولاسیون برسیم؟
خصوصی کردن متغیرها و متدها: در دارت، برای خصوصی کردن یک فیلد یا متد، نام آن را با یک آندرلاین (_
) شروع میکنیم. این باعث میشود که آن فیلد یا متد تنها در داخل همان کلاس قابل دسترسی باشد و از بیرون کلاس به آن دسترسی نداشته باشیم.
class Person {
String _name; // متغیر خصوصی
Person(this._name); // سازنده کلاس
// متد برای دسترسی به متغیر خصوصی
String get name => _name;
// متد برای تغییر مقدار متغیر خصوصی
set name(String newName) {
if (newName.isNotEmpty) {
_name = newName;
}
}
}
void main() {
var person = Person(‘Ali’);
print(person.name); // دسترسی به نام از طریق متد getter
person.name = ‘Reza’; // تغییر نام از طریق متد setter
print(person.name); // دسترسی به نام بعد از تغییر
}
استفاده از Getter و Setter: در دارت میتوانیم از متدهای getter و setter برای دسترسی و تغییر فیلدهای خصوصی استفاده کنیم. این روش به ما این امکان را میدهد که کنترل بیشتری روی دادهها داشته باشیم، مثلاً میتوانیم هنگام تغییر فیلدها، اعتبارسنجی انجام دهیم.
کلاسهای عمومی و خصوصی: به طور پیشفرض، کلاسها در دارت عمومی هستند و میتوان به آنها از خارج از فایل دسترسی داشت. اما برای محدود کردن دسترسی به یک کلاس خاص، میتوان از آندرلاین برای نام کلاسها استفاده کرد (در دارت استفاده از این شیوه معمول نیست، اما در برخی موارد ممکن است مفید باشد).
مزایای کپسولهسازی:
- امنیت: محدود کردن دسترسی به دادهها از تغییرات ناخواسته جلوگیری میکند.
- سازگاری: تغییرات در پیادهسازی داخلی کلاسها باعث نمیشود که کدهای خارجی که از آنها استفاده میکنند، تغییر کنند.
- مدیریت بهتر دادهها: با استفاده از getter و setter میتوان کنترل دقیقی روی تغییرات دادهها داشت.
کپسولهسازی در دارت به این شکل کمک میکند که دادهها و متدها بهطور مؤثر مدیریت شوند و از اشتباهات رایج در برنامهنویسی جلوگیری شود.
توجه: دارت از کلمات کلیدی مانند عمومی، خصوصی و محافظت شده پشتیبانی نمی کند. دارت از _ (خطخط) برای خصوصی کردن یک ویژگی یا روش استفاده میکند. کپسوله سازی در سطح کتابخانه اتفاق می افتد، نه در سطح کلاس.
getter و setter در دارت
در دارت، getter و setter برای دسترسی و تغییر مقدار فیلدها استفاده میشوند. اینها متدهایی هستند که اجازه میدهند به صورت کنترلشده به خصوصیات یک شیء دسترسی پیدا کنید. استفاده از getter و setter به شما این امکان را میدهد که کنترل بیشتری روی دادهها و نحوه تغییر آنها داشته باشید، برای مثال میتوانید اعتبارسنجی (validation) یا پردازش خاصی را هنگام دسترسی به دادهها انجام دهید.
1. Getter:
یک متد getter به شما اجازه میدهد که مقدار یک فیلد را خوانده و بازگشت دهید. در دارت، getter به صورت خاص تعریف میشود و معمولاً به شکل یک فیلد بدون پارامتر عمل میکند.

2. Setter:
یک متد setter به شما اجازه میدهد که مقدار یک فیلد را تغییر دهید. در دارت، setter به گونهای تعریف میشود که مقدار جدید را به عنوان پارامتر دریافت میکند.

مثال کامل از استفاده از Getter و Setter در دارت:
class Person {
String _name; // فیلد خصوصی
// سازنده کلاس
Person(this._name);
// Getter برای دسترسی به _name
String get name => _name;
// Setter برای تغییر مقدار _name
set name(String newName) {
if (newName.isNotEmpty) {
_name = newName; // تغییر مقدار _name فقط اگر نام جدید غیر خالی باشد
} else {
print(“نام نمیتواند خالی باشد.”);
}
}
}
void main() {
var person = Person(“Ali”);
// استفاده از getter برای دسترسی به فیلد _name
print(person.name); // خروجی: Ali
// استفاده از setter برای تغییر مقدار _name
person.name = “Reza”; // مقدار _name به Reza تغییر میکند
print(person.name); // خروجی: Reza
// تلاش برای تعیین یک نام خالی
person.name = “”; // خروجی: نام نمیتواند خالی باشد.
print(person.name); // خروجی: Reza
}
توضیحات:
- Getter: در خط
String get name => _name;
، یک getter برای فیلد خصوصی_name
ایجاد شده است. این متد به صورت خودکار مقدار_name
را برمیگرداند و به شما امکان میدهد بدون دسترسی مستقیم به متغیر_name
، از آن استفاده کنید. - Setter: در خط
set name(String newName) {...}
، یک setter برای فیلد خصوصی_name
ایجاد شده است. این متد به شما امکان میدهد که مقدار_name
را تغییر دهید، اما با این محدودیت که اگر مقدار جدید خالی باشد، اجازه تغییر داده نمیشود.