تاریخ انتشار:۱۲:۲۸ ۱۳۹۹/۲/۲۲
immutable objects چیست؟
کلمهی mutable به معنای تغییر پذیر و کلمهی immutable به معنای تغیر ناپذیر در زبان انگلیسی تعریف شدهاند. در دنیای IT این دو واژه نیز همین معنا را دارند.
در حین مطالعهی منابع مختلف دربارهی موضوع این مطلب، جملهای را با این مضمون دیدم: برای ساخت کوزه، گل را تا مرطوب هست باید شکل داد. زمانیکه گل خشک شود، دیگر نمیتوان کوزه را تغییر شکل داد. اشیاء تغییر ناپذیر هم به همین شکل هستند. بعد از ایجاد این اشیاء، دیگر نمیتوان به هیچ وجه آنها را تغییر داد.
منظور از یک Immutable Object این است که فضایی که برای نگه داری اطلاعات آن در حافظه اختصاص داده شده یکتا است و تغییر نمی کند.
چه زمانی از این اشیاء استفاده میکنیم؟
اشیاء تغییر ناپذیر برای دادههای استاتیک استفاده میشوند و نمونههایی از آن در بخش زیر لیست شدهاند:
دادههای اصلی (Master Data): یکی از بیشترین کاربردهای اشیاء تغییر ناپذیر، برای بارگذاری دادههای اصلی است (کشورها، واحدهای پولی، استان ها) و دادههایی که به ندرت تغییر میکنند. این دادههای اصلی بعد از بارگزاری در حافظه، دیگر تغییر نخواهند کرد.
اطلاعات پیکرهبندی (Configuration Data): همهی برنامهها نیاز به اطلاعات پیکرهبندی دارند. در دنیای برنامههای مایکروسافت، عموما این اطلاعات پیکره بندی را در فایلهای web.config و App.config ذخیره میکنیم. این نوع اطلاعات بصورت یک شیء در حافظه بارگذاری میشوند و بعدا تغییر نخواهند کرد.
اشیاء Singleton: اشیاء singleton اشیائی هستند که تنها یک نمونه از آنها را میتوان ایجاد کرد. در برنامهها از این اشیاء برای اشتراک گذاشتن اطلاعات استاتیک استفاده میکنند. اگر این اطلاعات تغییر نکنند، یکی از گزینهها، استفاده از اشیاء تغییر ناپذیر هستند.
در طرف مقابل این تعریف اشیای Mutable قرار دارند که می توان داده ها آنها را در زمان اجرای برنامه و بعد از ایجاد متغیر در حافظه عوض کرد.
به عنوان مثال در زبان #C متغیرهای از نوع String به عنوان اشیای Immutable شناخته میشوند. هر چند در زمان اجرای برنامه می توانید مقدار یک متغیر رشته ای را عوض کنید اما در عمل مقدار متغیر در حافظه عوض نمی شود بلکه یک فضای جدید برای نگه داری رشته ی جدید در حافظه ایجاد میشود. این موضوع کار کردن با رشته ها را بسیار پر هزینه میکند. با هر تغییر یک رشته بخشی از حافظه اشغال میشود و اگر زیاد اینکار را انجام دهید حافظه سر ریز میشود.
البته در NET Framework. سیستم Garbage Collection وجود دارد که این حافظه های پسماند را خالی می کند.
در مقایسه با String اگر از StringBuilder استفاده کنید متغیرهای رشته ای به صورت Mutable ایجاد می شوند.
با وجود اثرات منفی که اشیای Immutable دارند اما برای برنامه نویسی الزامی هستند. یکی از مهمترین مزیت های استفاده از متغیرهای تغییر ناپذیر این است که Thread-safe هستند و در برنامه های چند نخی ایجاد باگ نمی کنند.