جلسه پنجم  >>آموزش شي گرايي با جاوا

در ادامه جلسات قبلی من میخوام یه سری کلاس بنویسم .امروز میخوام در موردخب ما آرایه ای به این مقدار نوشتیم یه جایی از برنامه مان نیاز داریم که دو تا بهش اضافه کنیمبعد میایم پایین تر نیاز دارم که 3 تاش رو حذف کنم .کاری که برای حذف میتوانم انجام دهم اینه که آرایه مد نظر را برابر با null قرار دهم به این صورت :اولین چیزی که به ذهنمان میرسه اینه که تعداد آرایه را زیاد کنیم اما آن به معنای این است که کل آرایه 15 شود .مثلا میتوانیم مقدار آرایه را 1000 تا در نظر بگیریم اما آن خانه ها را الکی داریم در نظر میگیرم چرا که ممکنه ما فقط از 20 تا از آرایه ها استفاده کنیم . و بقیه ارایه هایی که گرفته ایم اضافه است و حافظه را درگیر میکند . پس راه حل خوبی نیست راه حل دیگه اش چیه ؟الان ما یه حلقه نوشتیم میخواهیم دو تا ایتم بهش اضافه کنیم .کاری که میخواهیم انجام دهیم این است که هر موقع نیاز شد رشدش بدهم .برای اینکه رشدش بدم باید بیام هر موقع نیاز دارم یه فاینال متغیر تعریف کنم که 5 تایی رشدش بدم .آرایه ای مثل خط 23 درعکس پایین تعیین میکنیم .به اندازه تعداد عناصر آرایه اولی حلقه ای را تشکیل می دهیم و آرایه قبلی را وارد آرایه تمپ میکنیم .و در آخر بنویسیم آدرس stlist با تمپ برابر است و جاشون رو دوباره عوض کنم . حالا همون آرایه stlist ام 15 تایی هستش و نگهشان داشته و حذفشان نکرده . پس من میتوانم بنویسم stlist[10] برابر با دانشجوی جدید همینطور برای بقیه شماره ها تا 15 .و بعد مقدار دهیشان نیز میتانیم بکنیم .این راه کاملا درسته و هیچ راه دیگه ای هم نداریم .همه آرایه های داخل جاوا صد در صدشان باید حتما از آرایه های استاتیک ساخته بشن هیچ راه دیگه ای نداریم و همشان از این ارایه های استاتیک ساخته میشن .الان این عکس بالا ارایه پویاست هاااا ولی خب باید دستی انجامش بدم فرض کنیم که من 15 تا هم پر کردم دوباره باید بیام و دستی این کد رو تکرار کنم .در عکس پایینی در خط 39 باز هم همین کار را انجام میدهیم برای اضافه کردن به تعداد آرایه ها .خب این کارا اولا مقداری اذیت کننده است . دوما قابلیت استفاده مجدد نداره اصلاخب اینا رو باید به صورت دستی انجام بدیم ما باید جوری بنویسیم کد رو که خودش رشد پیدا کنه از طرفی الان امکان خطا بالاست و در هم تنیدگیش زیادهخب بااید چکارش کنیم ؟ باید مدل براش بسازیم باید مدل سازی کنم که آرایه ی خاصی رو برای دانشجو ها بسازه که من از طریق اون آرایه بتونم یه سری چیزا رو اضافه کنم هر موقع بیشتر از حدش بود کمترش کنه و داده ها رو بهم بده و کلی از این مدل کار هاپس باید برم و کلاس براش بسازم و مدلی که می سازیم هر موقع بخواهیم میتونیم ازش نمونه بسازیم . میام کلاسی تحت عنوان studentarrylist تعریف میکنم که یعنی لیست ارایه ای . خب studentarrylist قراره چکار کنه قراره ارایه ای از دانشجو ها رو داشته باشه دیگه .خب در کلاس ارایه تعریف میکنم لیستی از دانشجو ها را بگیره این ارایه که تعریف میکنماین الان متغیر آدرس حافظه است باید چکارش کنم ؟ ioc1 رو باید اینجا رعایت کنم یا ن به نظرتان ؟ دو تا راه دارم یا اینکه وابسته اش کنم به یک نمونه سازی یا اینکه وابسته اش نکنم خب اینجا بر خلاف اون چیزی که قبلا بهتون گفتم که من نباید بیام حتما نمونه سازی کنم اینجا خودم واقعا میخوام که نمونه سازی کنم چرا میخوام اینکار رو کنم چون میخوام آرایه بسازم .نمیخوام از بیرون کاربرم بیاد یه آرایه بهم بده بگه بیا با این کار کن بعد هرچی کاربر بهم میده خودم آرایه رو رشد بدم کمش کنم .اصلا هدف کلاس همینه .هدف کلاس اینه که با یه نمونه از ارایه کار کنه .رشدش بده کمش کنه آرایه ای رو مرتب کنه ، یه آیتم جدید اضافه کنه ..هدفم همینه پس من میام واقعا اینجا وابسته اش میکنم .نمیام براش ستر و گتر بنویسم . چطوری وابسته اش میکنم ؟میام اولا سازنده براش می زنم .به اسم studentarrylist . سازنده اولم برای اینه که سایز اولیه بهم بده . و بعد از اینکه بهم داد میام و ازش نمونه میسازم . به این صورت :به این صورت بالا .بعدش چه نیاز دارم ؟ یک پرایوت فاینال اینت استپ .نیازه از کاربر بگیرم ؟ن چیز خیلی مهمی نیست . خودم بهش مقدار میدم اصلا.و اصلا نیازی نیست از کاربر آن را بگیرم .یه حالت دیگه برای سازنده هم می گذارم که شاید کاربر نخواهد بیاد مقدار اولیه بده مثلا خودم مقدار پیشفرضی از اول داشته باشم . ارایه سازنده خالی براش میذارم .و بعدش توی این سازنده خالی ام مثلا مقدار دهی اولیه این stlist رو یه مقداری که داخل خود کلاسم پیش فرض است ( من ده میذارم مثلا ) . این پیشفرضه اگه کاربر مقداری داد خب از اون استفاده میکنم اگر نداد خودم پیشفرض ده می گذارم . عکس زیر :یعنی چی ؟یعنی الان بجای اینکه آرایه رو این مدلی بسازه میتوونه بیاد بنویسه ) خط 16 در عکس پایین )که دو تا کار میتانه انجام بده مثلا بگه من یه آرایه میخوام 20 تایی :یا اینکه بگه اصن نمیخام تعداد بدم :و این مدلی تعریفش میکنه و از اونجایی که قابلیت رشد کردن داره نمیخواد نگران چیزی باشه . همینطوری مینویسدش و حالا یه سری کارا رو روش انجام میدهاین کد در کلاس استیودنت اری لیست رو که اینجا هست میتونم یه جور بهتر بنویسمش میتونم داخل یک کلاس سازنده های مختلف رو تو سازنده های دیگه صدا بزنمدر عکس بعد خط 9 همان خط داوازده است که فقط اینیت رو ده گذاشته پس مثل این میمانه که من صداش بزنم و مقدار ده بهش بدم .پس بجای اینکه خود سازنده ها رو صدا بزنم از دیس (this) استفاده مکنم .مینویسم this و مقدار 10 رو بهش میدم .خب حالا چطوری به خط شش آرایمان داده اضافه کنم من که گفته ام ستر و گتر براش نذارم . الان stlist بیرون نیست من چطوری مقدار بهش بدم .الان بر اساس عکس زیر لیست نقطه رو بذارمنمیشه بهش مقدار داد . نیازی نیست که حتما من واژه ستر و واژه گتر بنویسم میتونم یه جور دیگگه بنویسمشخط 15 نقش ستر رو برای من داره دیگه . ولی به جای اینکه خود لیسته رو بهش بدم که هر کاری خواست روش انجام بده یه متد مینویسم که فقط یه استودنت بگیره و به من بده من به لیست اضافه اش کنم . اگه صلاح دونستم اضافه اش کنم .. اگر ستر و گتر میذاشتیم کل ارایه رو بهش میدادم .بعد هرچی خودش میخواست هرجا مینوشت . خب این کلن نظم کار من رو به هم می ریخت . ترتیبش رو به هم میریخت و نمیتونستم دیگه رشد و ایناش رو انجام بدم اما اینجا میام و استیودنت میگیرم میگه مگه تو نمیخوای داده ها رو ذخیره کنی ؟ یه استودنت به من بده من خودم میدونم کجا باید اضافه اش کنم اگر نیازه رشد میدم اگر نیاز نیست که ن همون طوری میذارمش پس اینجا من یه چیز دیگه هم لازم دارم برام بشماره که چند تا آیتم اضافه شدهمقدار اولیه اش هم صفره . و بعد در متد ادد میام و مینویسم توی خونه stlist کانتر چی رو اضافه کن؟ اس رو اضافه کن . بعدشم بیا کانتر رو اضافه کن ، به همین سادگی . . . هر داده ای بهش اضافه کردم یه دونه بهش اضافه میکنم که اگه دفعه بعدی گفت ادد روی اون قبلی ننویسدش یه خورده جلو تر برام بنویسه این کد رو میتونم یه خورده بهینه تر و ساده تر هم بنویسمش (منظور عکس پایین )اگر شمارنده ای رو جایی استفاده کردم و خواستم بعد از اینکه اون دستور اجرا شد اضافه اش کنم می تونم به این صورت بنویسمش :این باعث میشه اول استی لیست کانتر مساوی با اس انجام بشه بعد کانتر پلاس پلاس شه . اما اگگه بخوام قبلش انجام بشهیعنی کانتر رو پلاس پلاس کنم بعدش انجام بدم دستور را . میتونم به علاوه اش رو قبلش بزارم به این صورت :این باعث میشه اول کانتر رو یکی اضافه میکنه بعد اس تی لیست اون کانتر اضافه شده رو برابر اس قرار میده .خب فعلا رشدش رو انجام ندادیم . . . دیگه چی میخوایم ؟ متدی میخوایم که ریموو کنه برامون مثلا میگم یه خونه ای رو برامون ریموو کن اندیس میگیرم که خونه ای که توی این ایندکس هستش رو برام حذفش کن یکی دیگه اینه که من از بیرون به آرایه دسترسی ندارم پس چطوری بیام داده هاش رو بخونم . . مثلا اینجا تو میتونی بنویسی استودنت س استی لیست ششمی رو بده (خط 21)استی لیست الان این قابلیت رو نداره ، میام یه دانه براش میذارم که خروجیش استودنت باشه به اسم گت که استودنت بگیره (خط24) میگه اونی که توی ایندکس هستش رو بهم پسش بده پس لازم نیست من روی خوداینها (خط شش) ستر و گتر بزنم میتونم رو آیتم هایی که داخلشون هست براش بیام ادد بزنم با اسم های قابل فهم مفهومی ، ادد ریمو و گت .این سه تا کاریه که فعلا میخوام انجام بدم حالا یه سری چیزای دیگه هم بهش اضافه میکنم . برای گتش چکارکنم؟ خیلی راخحت میتونم بنویسم استی لیست کانتر رو پس بدهخط 26صحبتمم این بود که این پرایوت استودنت رو اینجا نوشتم و در خط 14 وابسته اش کردم این صحبتی که ما جلسه قبلی انجام دادیم نباید هممچین کاری میکردیم باید اون آی او سی یک رعایت میکردیم اما اگر یادتون باشه من هیمشه تاکید میکنم که تا حد ممکن ما باید این ها رو رعایت کنیم یه جاهایی من واقعا نیاز دارم کلاسم رو وابسته اش کنم .الاان من هدف کلاسم اینه که وابسته بشه به یک آرایه یعنی کل مفهوم این کلاسه اینه که وابسته اش کن به این آرایه .. چون من میخوام درونش یه سری کار ها انجام بشه که بیرونش نمیخوام کسی خبر داشته باشه فقط میخوام از بیرون این قابلیت باشهکاربرم بیاد بگه یه آیتم اضافه کن یه دانشجو اضافه کن ادد کن مثلا این دانشجو (خط 18)فقط همین رو میخوام که انجام بده .. نمی خوام بگه اونو تو فلان خونه قرار بده البته اونم میتونم براش بزارم ولی نمیخوام مث این آرایه باشه که به صورت دستی خودش مشخص کنه که چی به چیه و چیکار کن و زیادش کن و کمش کن و از این رشد دادن و از این مدل کار ها . . . نمیخوام انجام بدم .و نهایتا بخواد صداش بزنه بیاد گت کنه اونی که خونه هتفم هستش رو بهم بده :خط 21یا مثلا میخوام حذف کنم یه آیتمی داخل لیستم هستش مثلا شماره نهم رو نمیخوام حذفش کنخط 23ببین چقدر واسطش راحته میخوام هیمنطروی باشه بگه ادد کن گت کن و ریمو کن دیگه نیاد درگیر شه الان شرط روبزنم الان این بزرگتر از سایزم شد پس بیا و رشدش بده الان خیلی از داده ها دارن اضافه مصرف میشن بیا و کمش کن ن ن ن نمی خوام اینطوری باشه فقط بگه ادد کن گت کن و ریمو کن حاللا به من دستور بده من اون داخل یه سری کار ها انجام میدم به هیچ کسی هم ربط نداره چه اتفاقی داره میفته پس من این رو پرایوت ش میکنم خط شش و وابسته اش میکنم (خط 14 )پس چچطوری بهش داده اضافه کنم ؟ میام از طریق این واسطه ها ادد و ریمو و گت .اددش رو برای این گذاشتم که دانشجو رو اضافه کنم نیومدم کل لیست دانشجو ها رو اضافه کنم هاا میگم یه دونه دانشججو اضافه کن واسم هرچند لیستم هم میتونم اضافه کنم فعلا ما کاری به اونش نداریم . .. من فقط میخوام یه دونه دانشجو اضافه کنم . پس دانشجو رو میگیرم و اضافه اش میکنم به همین سادگی .. . فعلا هنوز اضافه کردیم هنوز خیلی چیز هاش موندهاز اون طرف گت کردنش هم همون کاریه که بیرون انجام میدیمثلا اینجا گفتی شماره ششم رو بده من اونجا گفتم اونی که کاربر میگه رو بدهاینجا میگیم ایندکس روبدهحالا این فعلا تا اینجای کاره من میتونم یه سری داده ها رو بهش اضافه کنم یه سری داده ها رو ازش خذف کنمبجای این س تی لیستهخط شانزده رو اینطوری بنویسمو خط 26 رو هم به این صورت بنویسیم که میگه بیست تا دانشجو رو ادد کن :خب کد های اضافه رو پاک کردیم که شلوغ نشه و راحت باشیمالان ما اینجا چی نیاز دارم ؟ یکیش طولیه که اینجاست خط 18 که من طول رو لازم دارم اما طولش رو اینجا ندارم پس یه متد دیگه هم براش می ذارمو بعد در مین هم 18 رو اینطوری مینویسیم :و استپ رو هم لازم ندارم و برش میدارم . خب الان سایزی نداریم پس من بجاش عدد میزارم ده تامن ده تتا آیتم اضافه کردم که مقدار اولیه اش رو هم ده میزارم یا مثلا حالا هرچیز دیگه ای مثلا مقدار اولیه اش رو 15 میذارم . میام 15 تا دانشجوی تصادفی رو ایجاد میکنم میخوام دانشجوی 16 هم رو هم اضافه کنم نباید بتونه انجامش بده در واقع باید بهم ارور بده دیگه در واقع من این رو ندارم و 16 ام رو ندارم .این همون آرایه است و هنوز اون رشد دادن رو انجام ندادمشانزده تا نداریم 15 تتا داریم ولی من گفتمت بیا و 16 امین رو اضافه کن یعنی یه دونه داده اضافه دارم .ارور داد بهم و کاملا چیز منطقی ای هستش چون هنوز رشد ندادم پس بریم رشدش رو هم انجام بدیم من الان میخوام بیام و یه سری شرط براش بزارم یه خورده کنترلشون کنم خیلی هر کی به هرکیه اولا ایندکسی که اینجا وارد میکنه باید تو رنج لیست من باشه که قابل قبول باشه پس من باید بیام و بنویسم اگر ایندکسه کوچک ترت از کانتره بیا ریتوترن کنهبه این صورت بالااگر ایندکس کوچکتر از کاانتر بود بیاد ریتورن کنه اگر نبود چی ؟در غیر این صورت خطا تولید میکنیم .واین ارور رو تولید میکنیم که میگه این ایندکسی که تعریف کردی خارج از محدوده منه و اون خطای لازم رو برات تولید میکنه . برای قسمت ادد من باید بیام بررسی کنم که آیا نیاز به رشد داره یا نداره اگه رشد داره رشدش بده بعد آیتمه رو اضافه کنه ..نیاز به رشد داره یعنی چی؟یعنی کانتر برابر است با سایز لیستم اگر این طور بود مینویسم گرو (به معنای رشد )اما گرو ندارم باید بیام و تعریفش کنم بچه ها یه زمانی اسم تابع رو که اونجا مینویسی میتونی بنویسی اما هنوز نداریمش میخوایم داشته باشیمش و باید بسازیمش در داخل کلاسمان الان که قرمز شده یه آلت میزنم و بعد کرییتت رو میزنم و تعریفش میکنه داخل خود کلاسممثلا یه چیزی رو میخوام به استی لیستم اضافه کنم میام یه چیزی به اسم تست که میخوام ورودی هاش رو هم مشخص کنم مثلا ورودیش یه رشته باشه مثلا اینو میخوام تو کلاسم داشته باشمبه این صورت جریانی که میخوایم درست کنیم رو مینویسیم وقتی غالب روشن شد اون قرمزی رو یه الت و اینسرت میزنیم رو اون قرمزیه و میاد داخل کدی که تو خواستی و مینوسدش و میدونیم که همچین چیزی میشه انجام داد . خب حالا میخوام این رو رشدش بدم اگه کانتر مساوی با لینت شده بیا و رشدش بدهچطور رشدش بدم ؟پرایوت هم تعریفش میکنم چون که قرار نیستت از بیرون دسترسی بهش داده بشهمن به اين صورت ميام و ليست خود را چاپ میکنم و مرتب میکنم و . . .اگه یه ارایه دیگه خواستم میتونم از اریی لیست استفتاده کنمبه این صورت و ایتم بهش اضافه کنم و بعد چاپ کنم و مینیمم و ... ازش بگیرم به این صورت :اما هنوزم مشکل اساسی داره من اومدم استویدنت اریی لیست ساختم این یعنی وابستگی یعنی این کلاس وابسته اس به ارری لیست چفقدر خوب بود که من یه دونه ارری لیست داشته باشم و همه چی رو برای من بتونه توش نگهداری کنه و همه کارا رو برای من انجام بده این چیزی میشه به اسم ارری لیست خود جاوا که شما میتونین نوعش رو داخل براکت های جللوش که دایموند بهش گفته میشه مشخص کنید .و باهاش هر کاری که میخواهید انجام دهید .من الان ارری لیست استودنت ساختم شما ارری لیست استرینگ میتونین بسازین و چیز های مختلف حالا ما قراره ارری لیستی که خودمون تعریف کردیم رو مث خود این ارری للیست جاواش کنیم دقیقا عین همینش کنیم یعنی با همه اون امکاناتی که داره و ارری لیست های فوق العاده متفاواتی رو طراحی کنید .