WEBVTT

00:00.110 --> 00:05.510
 (read only)حالا که دیدیم ویژگی‌های فقط خواندنی
 چطور کار می‌کنن، خب ویژگی‌های فقط نوشتنی 
چی؟(write only) 

00:05.540 --> 00:11.180
خب، یه مثال خیلی خوب برای ویژگی فقط نوشتنی، رمز عبوره.

00:11.210 --> 00:17.120
خب، اگه ما یه مشتری داشته باشیم و اون مشتری نیاز داشته باشه برای ورود به حسابش رمز داشته باشه،

00:17.120 --> 00:21.020
باید رمز عبور رو یه جوری ذخیره کنیم. درسته؟

00:21.020 --> 00:21.500
درسته؟

00:21.500 --> 00:28.760
و اگه بخوایم مطمئن بشیم رمز عبور به هیچ روشی، توسط هیچ متدی فاش نشه،

00:28.760 --> 00:33.860
اینجاست که از ویژگی‌های فقط نوشتنی استفاده می‌کنیم.

00:33.860 --> 00:42.650
پس بیایم یه متغیر خصوصی جدید بسازیم: private string _password.

00:42.650 --> 00:49.250
(backing field)و این همون فیلد پشتیبان 
 برای ویژگی فقط نوشتنی ما خواهد بود.

00:49.280 --> 00:55.310
prop stringحالا ویژگی فقط نوشتنی رو با 
 می‌سازم.

00:55.310 --> 00:58.190
و اسمش رو می‌ذارم Password.

00:58.190 --> 01:05.660
getterاین ویژگی نباید 
setter داشته باشه، فقط باید 
 داشته باشه که خودمون تعریف کنیم.

01:05.660 --> 01:08.630
چی می‌خوایم بذاریم؟setterخب حالا توی 

01:08.630 --> 01:15.080
Password  می‌خوایم مقدار رمز عبور رو برابر با مقداری که به 
می‌دیم تنظیم کنیم.

01:15.080 --> 01:20.480
پس اینجا الان یه ویژگی فقط نوشتنی شد.

01:20.510 --> 01:24.560
چون رمز عبور فقط می‌تونه تنظیم بشه، قابل خوندن نیست.

01:24.560 --> 01:27.650
و اینو توی وبسایت‌ها هم زیاد می‌بینید. درسته؟

01:27.650 --> 01:31.040
می‌رید توی یه وبسایت و مثلا رمزتون رو فراموش کردید.

01:31.040 --> 01:34.250
وبسایت رمزتون رو نمی‌فرسته، چون نمی‌تونه بخونه‌ش.

01:34.250 --> 01:37.130
اون خیلی ریسکی می‌شد.

01:37.130 --> 01:40.430
ولی کاری که می‌کنه اینه که میگه لطفاً یه رمز جدید تنظیم کنید.

01:40.430 --> 01:46.610
حالا واضحه که یه جوری باید رمز رو بعداً مقایسه کنه و اینا، ولی اون بحث برای وقتی‌یه که

01:46.610 --> 01:51.290
می‌خوایم ورود کاربرها رو دقیق بررسی کنیم.

01:51.290 --> 01:55.790
ولی اینجا فقط در مورد مفهوم کلی ویژگی‌های فقط نوشتنیه.

01:55.790 --> 02:00.890
خب فرض کنیم حالا مشتری‌های ۱، ۲، ۳ و ... رو داریم.

02:00.890 --> 02:09.950
customer3.Passwordمی‌تونیم بگیم 
 و بعد یه رمز براش تنظیم کنیم.

02:09.950 --> 02:14.270
مثلاً هر رشته تصادفی‌ای اینجا.

02:14.270 --> 02:17.210
خب این میشه رمز عبورش.

02:17.210 --> 02:23.510
و می‌تونیم چند تا کاراکتر خاص هم اضافه کنیم تا امن‌تر بشه.

02:23.510 --> 02:24.140
خب.

02:24.140 --> 02:27.710
پس الان مشتری ۳ ما یه رمز عبور داره.

02:27.710 --> 02:32.210
ولی اگه بخوام بهش دسترسی داشته باشم و چاپش کنم، نمی‌تونم.

02:32.210 --> 02:34.580
مثلاً customer3.Password.

02:34.580 --> 02:41.780
Passwordاین باعث خطا میشه چون ویژگی 
 نمی‌تونه توی این زمینه استفاده بشه

02:41.780 --> 02:44.330
نداره.getterچون 
 
02:44.330 --> 02:46.340
چیه؟getterخب 
 
02:46.340 --> 02:50.840
getter همینه.

02:50.840 --> 02:54.020
مثلاً Name یه getter داره.

02:54.020 --> 03:00.680
 getter ماIDیا 
داره.setter  فقطPassword داره. ولی رشته   

03:00.680 --> 03:03.320
نداریم اینجا.getterپس 

03:03.320 --> 03:06.200
نمی‌تونیم رمز رو بخونیم. درسته؟

03:06.200 --> 03:07.730
فقط می‌تونیم ستش کنیم.

03:07.730 --> 03:13.010
پس الان رمز تنظیم شده، ولی فقط برای یه مشتری.

03:13.010 --> 03:15.230
نه بقیه.customer3 یعنی 

03:15.230 --> 03:19.070
و این کاریه که می‌تونیم جاهای دیگه برنامه هم انجام بدیم.

03:19.070 --> 03:27.860
و حالا می‌بینید چرا مهمه که فیلد پشتیبان رمز رو مستقیماً استفاده نکنیم.

03:27.860 --> 03:30.620
چون این یکی قابل دسترسی میشه.

03:30.620 --> 03:34.640
و می‌تونیم مقدارش رو بخونیم.

03:34.640 --> 03:36.440
پس توی کد می‌تونیم مثلاً...

03:36.440 --> 03:47.960
IDوقتی جزئیات رو می‌گیریم، بگیم 
 اینه و رمز هم اینه.

03:47.960 --> 03:51.980
_passwordو اینجا می‌تونیم از 
 استفاده کنیم.

03:51.980 --> 03:56.570
و اینطوری ناگهان به رمز عبور دسترسی پیدا می‌کنیم.

03:56.570 --> 04:00.980
و این یه مثال خوبه برای اینکه چرا ویژگی‌ها اینقدر مهمن.

04:00.980 --> 04:03.530
چون اینطوری می‌تونیم رمز رو افشا کنیم.

04:03.530 --> 04:05.720
خب بیاید اینو اجرا کنیم.

04:05.720 --> 04:09.170
و جزئیات مشتری ۳ رو بگیریم.

04:09.170 --> 04:11.540
به این شکل.

04:11.540 --> 04:17.420
و حالا رمز عبور مشتری ۳ نمایش داده میشه.

04:17.420 --> 04:25.820
پس می‌بینید چرا اینقدر مهمه که فیلدهای پشتیبان رو بیرون از تعریف ویژگی استفاده نکنیم.

04:25.820 --> 04:28.250
اینجا داریم رمز رو تنظیم می‌کنیم.

04:28.250 --> 04:34.490
و اگه بخوایم به رمز دسترسی داشته باشیم و ازش استفاده کنیم، همیشه باید از ویژگی استفاده کنیم.

04:34.490 --> 04:36.020
نه فیلد.

04:36.020 --> 04:40.430
و همونطور که می‌بینید حتی توی خود این کلاس هم به ویژگی دسترسی نداریم.

04:40.430 --> 04:45.170
هست وprivateچون ویژگی 
نداره.getter  

04:45.170 --> 04:46.670
این رو اینجا دوباره می‌بینید.

04:46.670 --> 04:49.250
پس این واقعاً خیلی مهمه.

04:49.250 --> 04:56.480
و همین باعث میشه جلوی افشای اطلاعاتی که نباید دیده بشن گرفته بشه.

04:56.510 --> 04:57.020
خب.

04:57.020 --> 04:59.630
پس بیاید این بخش رو دوباره حذف کنیم.

04:59.630 --> 04:59.840
اما...

04:59.980 --> 05:02.920
حالا می‌دونید کل ماجرا چطور کار می‌کنه.

05:02.950 --> 05:09.430
البته روش‌های پیشرفته‌تری هم وجود دارن که حتی نذارن به رمز دسترسی داشته باشیم

05:09.430 --> 05:12.970
hashمثل استفاده از 
 و این چیزها، که اون برای بعده.

05:13.000 --> 05:13.780
باشه.

05:13.780 --> 05:15.370
خب، پس می‌بینمتون توی ویدیوی بعدی.
