من عاشق برنامه نویسیم چون روش درست تفکر رو به آدم یاد میده. در کنار کارم همیشه نوشیدنی میخورم. نوشیدنی من برخلاف سنت رایج قهوه نیست چاییه!? اونم بدون قند یا شکر... تلخ!
پراپرتیهای فقط نوشتنی در C# ?
همیشه برام سوال بود که پراپرتیهای write-only یا set-only دقیقا کجا کاربرد دارن... وقتی توی رفرنس سی شارپ نگاهی بندازید میگه که پراپرتیهای رایت اونلی فقط در موارد نادر و فقط برای محدود کردن دسترسی به اطلاعات حساس به کار میرن. مثلا یه همچین چیزی:
public string password { set { _password = value; } }
اینطوری وقتی که طرف پسورد رو ست کنه دیگه بهش دسترسی نداره. شاید به نظر توضیح خوبی باشه برای اینکه رایت اونلی پراپرتی چیه ولی واقعیتش اصلا جالب به نظر نمیاد. به نظر راه حلی عجیب و غیر منطقی میاد. چونکه پراپرتی قراره که مثل فیلد عمل کنه اگر چه پشت پرده در واقع مثل متد عمل میکنه. اینکه ما یک پراپرتی رایت اونلی داشته باشیم به شدت خلاف اون ذهنیتی است که از فیلدها داریم. توی این جور مواقع بهترین راه برای تغییر یک متغیر استفاده از تابعه. چون کسی که تابع رو صدا میزنه توقع نداره که الزاما بتونه به اون دیتایی که پاس داده دوباره درسترسی داشته باشه.
با اینکه به نظرم پراپرتیهای رایت اونلی بی کاربرد به نظر میان ولی همیشه برام سوال بود که پس چرا سی شارپ اونها رو درست کرده و براشون کارکرد محدودی در نظر گرفته؟ تا اینکه امروز به این صفحه برخوردم:
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/property?redirectedfrom=MSDN
یکی از توصیههای دات نت برای طراحی پراپرتی اینه:
پراپرتیای درست نکنید که سطح دسترسی setter اش از getter اش بیشتر باشد. مثلا اینطور نباشد که ستر شما پابلیک باشد ولی گتر پراتکتد.
اگر نمیتوانید برای پراپرتی خود getter را فراهم کنید در عوض آن را تبدیل به متد کنید. بهتر است اسم متد را با پیشوند Set آغاز کنید. مثلا کلاس AppDomain به جای قرار دادن پراپرتی رایت اونلی CachePath یک تابع به نام SetCachePath درست کرده است.
نتیجه اخلاقی اینکه بهتره اصلا از پراپرتیهای رایت اونلی استفاده نکنیم.
مطلبی دیگر از این انتشارات
راهنمای عملی توسعه مبتنی بر آزمون(TDD) در تولید نرمافزار
مطلبی دیگر از این انتشارات
آموزش استفاده از API در PHP
مطلبی دیگر از این انتشارات
بازی با داکر قسمت اول How to analyze disk usage of a Docker container