<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Amir_B</title>
        <link>https://virgool.io/feed/@phoenix_0</link>
        <description>دانشجوی کارشناسی کامپیوتر</description>
        <language>fa</language>
        <pubDate>2026-06-10 20:47:19</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/208210/avatar/Rt24RT.jpeg?height=120&amp;width=120</url>
            <title>Amir_B</title>
            <link>https://virgool.io/@phoenix_0</link>
        </image>

                    <item>
                <title>بررسی روابط association ،aggregation و composition</title>
                <link>https://virgool.io/@phoenix_0/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-association-aggregation-%D9%88-composition-bnjp4t4zdphj</link>
                <description>association aggregation compositionبه ترتیبی که نوشته شده ، هر چقدر از بالا به پایین می آییم روابط و  وابستگی سخت تر می شود . حال به نوبت موارد بالا را بررسی میکنیم . رابطه اول association  است .یک نوع رابطه ضعیف است که مستقل از همدیگر هستند و تعلق خیلی کمی به همدیگر دارند و مستقل از همدیگر هستند . مثال : راننده ماشین و خود ماشین : درسته که به صورت موقتی راننده ماشین صاحب آن ماشین است .ولی هر کدام مستقل از همدیگر یک شی کامل هستند . اگر راننده بمیرد ماشین را یکی دیگر بر میدارد و استفاده میکند . اینگونه نیست که ب مرگ راننده ماشین هم از بین رود . مثال دیگر : رابطه کارمند و حساب بانکی داستان این است که شی اول جزئی از شی دوم نیست . درسته که کارمند حساب بانکی را دارد ولی ماشین جزئی از راننده نیست . یا حساب بانکی جزئی از کارمند نیست . مثال دیگر در این رابطه دانشجو و استاد است که درسته که استاد دانشجو داره ولی دانشجو جزئی از استاد نیست.ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــرابطه دوم aggregation  است . مثال اول : موبایل و باتری : نه تنها موبایل باتری داره بلکه باتری جزئی از موبایل است . مثال دوم : چرخ و خودرو : نه تنها خودرو چرخ دارد بلکه چرخ جزئی از خودرو هم هست  .درسته که باتری مال موبایل است . ولی باتری بدون موبایل هم کار میکند . درسته که چرخ مال ماشین است . ولی چرخ بدون ماشین هم کاربرد دارد .  ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــرابطه سوم composition است. که به رابطه مرگ معروف است . مثل برگه امتحانی و سوالات آن : برگه امتحانی سوالات را دارد  ، سوالات جزئی از برگه امتحانی هستند . ولی برگه امتحانی نابود شود ، سوالات نیز نابود می شوند . سوالات بدون برگه امتحانی ارزشی ندارند. یاد داشت هایی برگرفته از دوره رایگان متخصص پایتون رضا دولتی از سایت سبزلرن </description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Tue, 03 Oct 2023 19:54:46 +0330</pubDate>
            </item>
                    <item>
                <title>مسئله چهارم اویلر با پایتون</title>
                <link>https://virgool.io/@phoenix_0/%D9%85%D8%B3%D8%A6%D9%84%D9%87-%DA%86%D9%87%D8%A7%D8%B1%D9%85-%D8%A7%D9%88%DB%8C%D9%84%D8%B1-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ctstcxc7v62w</link>
                <description>سلامfor item in range(999,900,-1):    for item2 in range(999,900,-1):        number=str(item * item2)        rev_number=number[::-1]        if number==rev_number:            print(number)اگه جایی نیاز به توضیح داشتین بگین در کامنت توضیح میدم .  لازم به ذکر هست که به روش های دیگه هم میشه این مسئله رو حل کرد . بخش مربوط به معکوس کردن رو با اعمال حسابی تقسیم کردن و مود کردن هم میشه انجام داد یا اینکه از تابع معکوس هم میشه استفاده کرد.در این روش من از عملگر معکوس استفاده کردم .</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Sat, 25 Mar 2023 02:41:40 +0330</pubDate>
            </item>
                    <item>
                <title>مسئله سوم از مسائل اویلر</title>
                <link>https://virgool.io/@phoenix_0/%D9%85%D8%B3%D8%A6%D9%84%D9%87-%D8%B3%D9%88%D9%85-%D8%A7%D8%B2-%D9%85%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%88%DB%8C%D9%84%D8%B1-jdj09bvojzsx</link>
                <description>تعریف مسئله : متن سوال:عامل های اول عدد 13195 عبارتند از5, 7, 13 و 29.بزرگترین عامل اول عدد600851475143 چیست؟قدم اول در کد ما این است که باید اعدادی که بر ورودی بخش پذیر هستن و ما تحت عنوان ضرایب اون عدد میشناسیم رو پیدا کنیم. برای این قدم باید بیاییم و یه حلقه فر راه بندازیم .مود عدد فرضیمون رو تا یه رنج مشخصی بر اون حلقه بگیریم . مثلا حلقه ما از یک تا ده هست . این بدان معناست که عدد فرضی ما قرار هستش که بر اعداد 1و 2و 3و 4و 5 و 6 و .. 9 مود گرفته بشه حالا که این مود ها گرفته شد باید برابر 0 قرار داده بشه که این به ما نشون میده که عدد فرضی ما به هر کدام از این ها که حاصلش 0 شده ، بخش پذیر هست . حال در قدم دوم ما باید این اعداد بخش پذیر را وارد یک فیلتر دیگر کنیم . فیلتری که قرار هست به ما بگوید که این اعداد بخش پذیر جدا از بخش پذیر بودن ، اول هم هستند . خب شرط اول بودن این است که : 1 : بر خودش بخش پذیر باشد ( مود خودش بر خودش برابر 0 باشد ) 2 : بر یک هم بخش پذیر باشد .3:بر دو بخش پذیر نباشد . همه این ها را میتوان در یک if سه شرطی نوشت تمام این توضیحات در کد اورده شده است . و در قدم اخر هم میتوان اعدادی که هم بخش پذیر بودن و هم اول را بودن در یک ارایه قرار داد و به این صورت همه را به صورت یک جا خواهیم داشت. n=600851475143lis=[]for x in range(1,10000):    if (n%x==0):        print(f&#x27;{x} bakhsh pazir&#x27;)        if (x%x==0 and x%1==0 and x%2!=0 ):                print(f&#x27;{x} bakhsh pazir va aval&#x27;)                lis.append(x)print(lis)</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Thu, 23 Mar 2023 21:44:40 +0330</pubDate>
            </item>
                    <item>
                <title>حل مسئله اول سایت projecteuler.net</title>
                <link>https://virgool.io/@phoenix_0/%D8%AD%D9%84-%D9%85%D8%B3%D8%A6%D9%84%D9%87-%D8%A7%D9%88%D9%84-%D8%B3%D8%A7%DB%8C%D8%AA-projecteulernet-ipdjxzau0dka</link>
                <description>سلام امروز میخوام مسئله اول سایت projecteuler.net رو براتون اینجا قرار بدم . شرح مسئله به این صورت هست :اگر تمام اعداد طبیعی زیر 10 را که مضرب 3 یا 5 هستند فهرست کنیم، به 3، 5، 6 و 9 می رسیم. مجموع این مضرب ها 23 است. مجموع همه مضرب های 3 یا 5 زیر 1000 را پیدا کنید.حل سوال به صورت زیر است . sum = 0for i in range(1, 1000):    if i % 3 == 0 or i % 5 == 0:        sum += iprint(sum)در قسمت اول یه متغیر تعریف میکنیم که در آن 0 قرار دارد. در قدم بعد از یه حلقه for استفاده میکنیم که نامش i است . این حلقه قرار است که از دامنه 1 تا 1000 دانه دانه برای ما پیمایش کند .و هر کدام از اعداد را در یک فیلتر بخصوصی قرار دهد . چه فیلتری ؟ همان طور که سوال از ما خواسته است . ما باید اعداد یک تا هزار را وارد فیلتری کنیم که یا بر 3 بخش پذیر باشد و یا بر 5 بخش پذیر باشد . به همین دلیل از یه دستور شرطی استفاده میکنیم. ما برای بخش پذیری از مود (%) به این صورت که هر عددی مودش بر 2 برابر صفر شود ما نتیجه میگیریم که این عدد بر 2 بخش پذیر است. طبق توضیحی که در بالا دادم ما هم برای 3 و 5 این کار را انجام داده ایم . و چون در صورت سوال از واژه &quot;یا &quot; استفاده شده است . ما از or  بین این دو مودی که گرفته ایم استفاده میکنیم . در قدم بعد sum =sum+i می شود . و به این صورت هر بار هر عددی که از فیلتر رد می شود با sum جمع می شود و به این صورت ما مجموع تمامی اعداد از فیلتر رد شده را داریم . و در اخر از بلوکمان خارج می شویم . و با استفاده از تابع print  مجموع را چاپ میکنیم.</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Wed, 22 Mar 2023 20:24:20 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه یک عدد را معکوس کنیم ؟(در جاوا )</title>
                <link>https://virgool.io/@phoenix_0/%DA%86%DA%AF%D9%88%D9%86%D9%87-%DB%8C%DA%A9-%D8%B9%D8%AF%D8%AF-%D8%B1%D8%A7-%D9%85%D8%B9%DA%A9%D9%88%D8%B3-%DA%A9%D9%86%DB%8C%D9%85-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-soev7ums2vwv</link>
                <description>سلام . برای معکوس کردن عدد در جاوا امروز میخواهیم از روش حلقه while استفاده کنیم. برای معکوس کردن عدد ما به 3 قدم نیاز داریم . قدم اول : جدا کردن رقم سمت راست . ( به وسیله %بر ده ) قدم دوم : یک متغیر تعریف کنیم و به آن مقدار اولیه صفر را بدهیم . سپس بگوییم که عدد بدست آمده در قدم اول را با حاصل ضرب این متغیر در ده ، ضرب کن . یعنی : temp=(temp*10)*adadeQadamAval;قدم سوم : در قدم سوم شما بایستی عدد ذخیره شده در قدم اول را بر 10 تقسیم کنید . (تقسیم بر ده باعث میشود مرتبه یکان عددمان از بین برود و ما بتوانیم در قدم بعدی از حلقه while به سراغ مرتبه دهگان برویم . ) public class ReverseNumberExample1{public static void main(String[] args){int number = 987654, reverse = 0;while(number != 0){int remainder = number % 10;reverse = reverse * 10 + remainder;number = number/10;}System.out.println(&quot;The reverse of the given number is: &quot; + reverse);}}</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Mon, 21 Mar 2022 18:56:20 +0330</pubDate>
            </item>
                    <item>
                <title>isArmstrong?بررسی آرمسترانگ بودن عدد در جاوا</title>
                <link>https://virgool.io/@phoenix_0/isarmstrong%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A2%D8%B1%D9%85%D8%B3%D8%AA%D8%B1%D8%A7%D9%86%DA%AF-%D8%A8%D9%88%D8%AF%D9%86-%D8%B9%D8%AF%D8%AF-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-p2cmiwysvwvd</link>
                <description>بررسی آرمسترانگ بودن عدد . . با جاوا اول از همه بریم سراغ اینکه عدد آرمسترانگ چه عددیه .. فک کنم مثال های پایین به خوبی این رو توضیح بده .. . :یعنی اول باید دید عددمون چند رقمیه . . بعد هر کدام از یکان ، دهگان و صدگان  و .. رو به توان میرسانیم . مثلا اگه عددمون 3 رقمی بود ، یکان و دهگان و صدگان رو به توان 3 میرسانیم . و در آخر همه این ها رو با هم جمع میکنیم . اگه نتیجه جمع این اعداد با عدد قبلی یکسان و برابر بود میگیم که این عدد ارمسترانگه ! خب بریم سراغ پاسخ این سوال . در اولین قدم ما باید این عدد رو از کاربر بگیریم . من اسم عددمون رو adadVoroodi گذاشتم . یک متغیر کمکی هم به وجود میارم و اسمش رو میذارم CopyadadVoroodi . یعنی میخوام یک کپی از عددم رو توش نگه دارم . در حل این مسئله از دو حلقه استفاده میکنیم . از حلقه اول برای جدا کردن عدد های رقممون استفاده میکنیم و میگیم تا وقتی که رقممون بزرگ تر از صفر هست بیا و مرتبه های این رقم رو از هم جدا کن و با هر بار جدا کردن یکی بشمار ( این یکی بشمار رو با استفاده از تعریف یک متغیر به اسم counter  به وجود میاوریم و هر بار که حلقه while ما در حال رفت و برگشت هستش این کار برامون انجام میشه و یکی بهش اضافه میشه .. اینطوری اگه عددمون 3 رقمی باشه counter مون 3 رو در خودش ذخیره میکنه . کدش به این صورت هست : CopyadadVoroodi=adadVoroodi		while(CopyadadVoroodi&gt;0) {			CopyadadVoroodi=CopyadadVoroodi/10;			counter++;		}در قدم بعد دوباره عدد ورودیمون رو وارد متغیر کپی ای که به وجود اوردیم میکنیم و بعدش میریم سراغ حلقه while بعدی  هدف از این حلقه این هستش که عدد های یکان و دهگگان و صدگان رقممون رو از هم جدا کنه و به توان برسونه مثلا اگه رقممون 153 باشه اون رو به عدد های 1 و 5  و 3 تجزیه کنه و هر کدام رو به توان 3 برسونه و بعد حاصل توان ها رو با هم جمع کنه . به همین دلیل اینجا میریم که متغیری دیگه به اسم تیکه عدد ورودی(tikeadadVoroodi) ایجاد کنیم . و بعد کپی عدد مون رو با مود بر ده گرفتن تجزیه میکنیم و وارد این متغیر جدیدمون میکنیم ( تیکه عدد ورودی ) در قدم بعد متغیر دیگه ای رو به اسم sum به وجود میاریم که قراره این تیکه ها رو که به توان میرسن با هم جمع کنه . در خط اخر این حلقه هم کپی عدد رو تقسیم بر ده میکنیم اینطوری در هر مرحله از حلقه عدد سمت راست حذف میشه و میریم سراغ بعدی .. کد رو حلقه رو میزارم و بعد یه توضیح کوچیک با مثلا راجع بهش میدم . while(CopyadadVoroodi&gt;0) {			tikeadadVoroodi=CopyadadVoroodi%10;			sum=sum+(Math.pow(tikeadadVoroodi, counter));			CopyadadVoroodi=CopyadadVoroodi/10;		}خب در خط اول این حلقه اگر عدد 153 رو در نظر بگیریم . مودش بر ده باعث میشه که عدد 3 رو در اختیار دااشته باشیم . سپس متغیر sum  رو که تعریف کردیم و با استفاده از کتابخانه ریاضی عدد 3 رو که در متغیر tikeadadVoroodi ذخیره کرده بودیم رو به توان کانتری میرسونیم که در حلقه اول راجع بهش گفتیم . اینطوری 3 ما به توان سه میرسه . با خط سوم از حلقه 153 رو تقسیم بر ده میکنیم و به این صورت یکان رو حذف میکنیم و به این صورت عددمون رو برای این آماده میکنیم که بخوایم دهگانش یا همون عدد پنج رو وارد این داستان کنیم . عدد 5 و عدد 1 رو هم به همین منوال دنبال میکنیم . و همه این ها وقتی که به توان رسیده ان در متغیر sum با هم جمع میشن . if(adadVoroodi==sum) 				return true;			else 				return false;در این قسمت ما میایم با استفاده از یک دستور شرطی میگیم که آیا sum ما با عدد ورودی که از کاربر گرفتیم با هم برابر هست یا ن . همان طور که در اول پست گفتم اگه برابر باشند نتیجه میگیریم که عددمون ، عدد آرمسترانگه . به همین زیبایی . همه این ها رو در یک تابع مینویسم به اسم isArmsrong  و در تابع مین هم یک سری کد دیگه باید نوشت . که اون رو هم میگم . حالا کد کامل تابع isArmstrong رو به صورت کامل میذارم . 	static boolean isArmstrong(int adadVoroodi) { 		int counter = 0;		int CopyadadVoroodi;		int tikeadadVoroodi=0;		double sum=0;				CopyadadVoroodi=adadVoroodi;				while(CopyadadVoroodi&gt;0) {			CopyadadVoroodi=CopyadadVoroodi/10;			counter++;		}				CopyadadVoroodi=adadVoroodi;				while(CopyadadVoroodi&gt;0) {						tikeadadVoroodi=CopyadadVoroodi%10;			sum=sum+(Math.pow(tikeadadVoroodi, counter));			CopyadadVoroodi=CopyadadVoroodi/10;		}		if(adadVoroodi==sum) 				return true;			else 				return false;	}خب کد مین رو هم میذارم . و توضیحی خلاصه راجع بهش . public static void main(String[] args) {					Scanner scan=new Scanner(System.in);		System.out.println(&amp;quotadad voroodi ra vared konid&amp;quot);		int n=scan.nextInt();				isArmstrong(n);		if(isArmstrong(n)) {  				System.out.print(&amp;quotArmstrong &amp;quot);  			}  		else   			{  				System.out.print(&amp;quotNot Armstrong &amp;quot);  			}  	}}در مین یک عدد از کاربر میگیریم و عدد رو وارد تابع isArmsrong  و بعد تابع عدد رو بررسی میکنه . تابع ما از جنس بولین هست . پس ما در مین میگیم که اگر این تابع true بود بگو آرمسترانگه اگه false بود بگو آرمسترانگ نیست . به همین راحتی  . کامپایل کد هم به این صورت هست . </description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Fri, 11 Mar 2022 23:09:55 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی  palindrome بودن عدد دریافتی . .</title>
                <link>https://virgool.io/@phoenix_0/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-palindrome-%D8%A8%D9%88%D8%AF%D9%86-%D8%B9%D8%AF%D8%AF-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA%DB%8C-gf3wnur37p7l</link>
                <description>عدد palindrome عددی هست که اول و آخرش شبیه هم باشه . مثلا 454 . در تمرین امروز ما عددی را از کاربر میگیریم و بررسی میکنیم که آیا palindrome هست یا ن .کد به این صورت است : 	Scanner scan=new Scanner(System.in);	int number=scan.nextInt();	int sum=0;	int r;		int temp=number;		while(number&gt;0) {		r=number%10;		sum=(sum*10)+r;		number=number/10;			}	if(temp==sum) {		System.out.println(&amp;quotthis number is palindrome&amp;quot);	}else System.out.println(&amp;quotthis number is not palindrome&amp;quot);برای این کار ابتدا باید عدد دریافتی را معکوس کنیم . قبل از معکوس کردن عدد دریافتی را وارد متغیر temp  نیز میکنیم. سپس با حلقه while  و محتوای داخلش عدد دریافتی را معکوس میکنیم. حال ما temp  را داریم که عدد مورد نظرمان را داخلش ریختیم . در داخل حلقه while نیز عددمان را بعد از معکوس کردن وارد متغیر sum کردیم . بعد در دستور if  این دو متغیر را با هم مقایسه میکنیم .  اگر این دو عدد با هم برابر باشند . به این معناست که عدد ما 	palindrome  است . میتوان palindrome  را به لغات نیز نسبت داد . حتی میتوان با استفاده از کلاس استرینگ و متد های این کلاس این مسئله را حل کرد . </description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Sun, 06 Mar 2022 21:33:35 +0330</pubDate>
            </item>
                    <item>
                <title>نوشتن دنباله ی عدد های اول</title>
                <link>https://virgool.io/@phoenix_0/%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D8%AF%D9%86%D8%A8%D8%A7%D9%84%D9%87-%DB%8C-%D8%B9%D8%AF%D8%AF-%D9%87%D8%A7%DB%8C-%D8%A7%D9%88%D9%84-br1flp1wwfve</link>
                <description>اول از همه چی تمام حل این مسئله رو بنویسیم و بعد به توضیح می پردازیم.	Scanner scan = new Scanner(System.in);	1	int length;	2	System.out.println(&amp;quotpleas enter length&amp;quot);	3	length = scan.nextInt();	4	for (int number = 2; number &lt; length; number++) {	5		if (number%2==0) {	6			continue;	7		}else if ( number%1==0|| number % number == 0) {	8			    System.out.println(number + &amp;quot  &amp;quot);
                         }                     }}در خط اول حد حلقه را تعیین کرده ایم . در خط دوم تعامل با کاربر را داریم . و از کاربر حد این دنباله را میگیریم اینکه تا کجا میخواهد این دنباله ادامه داشته باشه . ما باید شی اسکنر را تعریف کنیم و به واسطه همین اسکنر میتوانیم عددی را از کاربر بگیریم و آن را وارد متغیر length کنیم. یک حلقه تعریف میکنیم . و در این حلقه از 2 تا length ادامه می یابد . داخل این حلقه از دو شرط استفاده کرده ایم . به این صورت که شرط اول به این معناست که برای تشخیص عدد زوج مود آن عدد را بر دو باید گرفت و باید برابر صفر باشد . به همین سبب ما عدد زوج را تشخیص دادیم . سپس میگویم اگر عدد ما زوج بود با دستور continue  از اون عدد رد می شویم . چون ما این عدد را نمیخواهیم . و بعد با else if  شرط دوم را وارد داستان میکنیم . در ریاضی میدانیم که برای تشخیص عدد اول دو شرط داریم یکی اینکه بر خودش بخش پذیر باشد .دومی هم اینکه به غیر از خودش بر یک هم بخش پذیر باشه و لا غیر . در خط 7 هم ما این کار را انجام داده ایم و به این سبب شرط ما عدد های اول را در میابد . و ما با دستور چاپ این عدد را چاپ میکنیم . </description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Sat, 05 Mar 2022 20:09:10 +0330</pubDate>
            </item>
                    <item>
                <title>دنباله فیبوناچی با جاوا 0 _1_ 1_ 2_ 3_ 5_ 8_ 13</title>
                <link>https://virgool.io/@phoenix_0/%D8%AF%D9%86%D8%A8%D8%A7%D9%84%D9%87-%D9%81%DB%8C%D8%A8%D9%88%D9%86%D8%A7%DA%86%DB%8C-%D8%A8%D8%A7-%D8%AC%D8%A7%D9%88%D8%A7-0-1-1-2-3-5-8-13-ynnsqk5viazt</link>
                <description>با سلام . public class mainclass {
	public static void maهn(String[] args) {
       //0 1 1 2 3  5 8 131	int n0=0;2	int n1=1;3	int n2;4	int length;5	Scanner scan=new Scanner(System.in);6	System.out.println(&amp;quotEnter your Fibonacci sequence limit&amp;quot);7	length=scan.nextInt();8	for(int i=2;i&lt;length;i++) {9	n2=n0+n1;10	System.out.println(&amp;quotyour number &amp;quot+n2);11	n0=n1;12	n1=n2;	}
دنباله فیبوناچی داره میگه که عدد بعدی حاصل جمع دو عدد قبلی هستش . یعنی 0+1 میشه 11+1میشه 22+1میشه 3 و یه همین منوال ادامه میدیم . و دنباله ما به این صورت در میاد :0 1 1 2  3 5 8  13 و . .. حالا ما میخوایم در برنامه نویسی این دنباله رو ایجاد کنیم . قدم اول : تعریف متغیر ها : 1	int n0=0;2	int n1=1;3	int n2;4	int length;ما چهار تا متغیر تعریف کردیم متغیر اول ما عدد اول دنباله که همان عدد صفر هست رو داخلش ذخیره کردیم . در متغیر دوم عدد دوم دنباله را در آن ذخیره کردیم . متغیر سوم به اسم n2 متغیری هست که قرار است حاصل جمع n1 و n2 در آن ذخیره شود . هدف از متغیر آخر این است که ما یک حدی برای دنباله خودمان تعیین کنیم . و یه انتهایی برای آن در نظر داشته باشیم  . مثلا بگوییم که این دنباله تا ده مرتبه ادامه پیدا کند . قدم بعد: استفاده از حلقه : ما از حلقه فور برای پیمایش دنباله استفاده کردیم . مقدار اولیه حلقه فور باید از عدد دو شروع شود چرا که ما عدد های صفر و یک را خودمان مقدار دهی کرده ایم . در نتیجه حلقه ما از صفر شروع می شود و تا length ادامه پیدا میکند . در داخل حلقه ما این قطعه کد را داریم : n2=n0+n1;10	System.out.println(&amp;quotpleas enter &amp;quot+n2);11	n0=n1;12	n1=n2;در قسمت اول آن ،ما عدد اول(0) دنباله را که در متغیر n0 و عدد دوم (یک ) را در متغیر n1 ذخیره کرده ایم ، را با هم جمع میکنیم و نتیجه را وارد n2  میکنیم .در خط بعد ( ده) ما از دستور چاپ استفاده کردیم . و n2  را چاپ کرده ایم . در خط بعد مقدار متغیر ها را جابه جا کرده ایم به این صورت که در n1 در حال حاضر 1 قرار دارد .ما آن 1 را وارد n0 میکنیم . عدد داخل n2 هم که حاصل جمع دو عدد قبلی بود را وارد n1 میکنیم . و این چند خط کد را در حلقه قرار میدهیم . و حلقه به اندازه  length  این کار را ادامه میدهد و دنباله فیبوناچی به این صورت ساخته می شود . </description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Fri, 04 Mar 2022 20:25:08 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه هفدهم &gt;&gt;ادامه جنریک ها یا ای او سی سطح 4</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D9%87%D9%81%D8%AF%D9%87%D9%85-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D8%AC%D9%86%D8%B1%DB%8C%DA%A9-%D9%87%D8%A7-%DB%8C%D8%A7-%D8%A7%DB%8C-%D8%A7%D9%88-%D8%B3%DB%8C-%D8%B3%D8%B7%D8%AD-4-or9kazcgjjmg</link>
                <description>ای او سی طح چهارمون این بود که چطوری نوع داده رو بفرستیم داخل یه دونه کلاس قبلش یه نمونه از اون نوع داده رو میفرستادیم مینوشتیم استودنت اس بعد اس رو میفرستادیم داخل یه دونه کلاس یا یه دونه تابع یه دونه هر چیزی حالا به جایی اینکه اس بفرستیم خود نوع داده رو میخوایم بفرستیم و ازش استفاده کنیم :تا اینجا این رو میفرستادیم :توی جنریک ها میخوایم خود نوع داده رو بفرستیم ن اینکه متغیری از اونبرای شروع کارمون رفتیم از رازی ارری لیست شروع کردیم گفتیمتوی رازی ارری لیست کاری که ما داریم انجام میدیم وابسته بود استودنت ارری لیست بود یا شیپ ارری لیست بود اومدیم روشون کار کردیم فکر کردیم دیدیم که خیلی وابسته است این الان به یه نوع داده خاص وابسته است . من هر نوع داده دیگه ای که بخوام بسازم و ارری لیستی برای اون نوع داده داشته باشم باید اون ارری لیست رو از اول برای اون نوع داده بسازم . ارایه پویا ازش داشته باشم .هرچند ما توی جاوا داریم . ما داریم منطق اون و بیس کارشه و خب اومدیم این رو توسعه اش دادیم چیکارش کردیم ؟برای شروع کار از نوع ابجکت تعریفش کردیم وقتی ابجکت تعریفش میکنیم چه اتفاقی میفته ؟ هر نوع داده ای رو میتونی داخلش قرار بدی پس من الان یه ارری لیست دارم همه چی میشه توش قرار داد همه چی میشه توش قرار داد . یعنی این کار رو انجام بدیمتی ها رو به ابجکت تغییر داد استاد چون که برای کلاس قبلی توضیح داده بود و کد ها رو کامل کرده بود و برای اموزش به ما دوباره تی ها رو حذف کرد و ابجکت قرار داد .خب این الان خیلی عالیه شما الان میتونید بیاید و بنویسید رازی ارری لیست مساوی با نیو ارری لیست این گام اولمونخیلی عالیه الان هرچیزی میپذیره دیگه پس اون مشکلمون حل شد من میگم دات اد و مثلا یه رشته به من بده این میشه رازی ارری لیستی که همه چی میشه داخلش قرار داد مشکلی نداریم باهاش که بگیم الان حتما سیرکل باشه یا استودنت باشه یا هرچیزی الان همه چی رو میپذیره مثل دفعه قبلی وابسته نیست اما مشکل داره و مشکلش اینه که ما نمیخوایم همه چی رو هم بپذیرهاز یه طرف میخوایم که همه چیز رو بپذیره از یه طرف هم نمیخوایم همه چیز رو بپذیره یعنی در واقع هر دو رو میخوایم   هر دو کاربردش رو میخوایم میخوایم که یه جاهایی رو بتونم همه چی رو بپذیره برام اما یه جاهایی هم ممکنه نیاز داشته باشم که به طور خاص یه چیز هایی رو بپذیرم مثلا چی حالا فرض کن من اینجا یه متد دارم حالا ممکنه این متده تو یه کلاس دیگه باشه من اینجا مینویسمش برای سادگی میگم وید تستو میخوام با یه لیستی از ابجکت های نوعی خاص مثلا کار کنم .مثلا چی فرض کنید که میخوام رازی اریرری لیست رو بنویسم و این داخل یه حلقه بزنم و این تستم فقط وفقط با استودنت ها کار کنه و من میتونم الان بیام و بگم استودنت فرض کنید اسالان فرض کن اینجا استودنت اضافه شده یه دونه از این استدونت ها رو اضافه میکنم میپذیره دیگه عمومی هم هست همه چی رو میپذیره خب من الان یه دونه استودنت دارم داخل رازی اینجا مینویسم رازی استودنت اس داخل رازی ارری لیست بهم ارور میدهاها این رازی ارری لیست قابل فور ایچ نیست چون ایتریبلش نکردیم من این رو اینجوری بنویسم مینویسم ای مساوی است با صفرای کوچیکتر از رازی ارری لیست دات سایز و ای پلاس پلاس . بعدش میام مینویسم استودنت اس مساوی است با رازی ارری لیست دات گت ای ام رو بهم بده بعد اس دات و بعد سیستم دات اوت اس دات گت اوریجش خب اینجا بهم ارور میده من استدونت قرار دادم هاولی این که نمیدونه من استودنت قرار دادم این خودشم مطمئنه که استودنت قرار داده کستش میکنهاونی که این رو نوشته میدونه صد در صد قراره با استودنت ها کار کنه کستش میکنه ممکنه اینجا اشتباهاا ممکنه اصلا به صورت کتابخانه بدی دست مردم دیگه بیاد بزنه مثلا یه رشته ایاینم میپذیره اولی رو میاد کست میکنه و درست چاپ میکنه میرسه به دومی میخواد کستش کنه استرینگه به استودنت ارور میده بهتونپس اینجا من واقعا خودم میخوام که داده ای که وارد این میشه صدرصد از نوع استودنت باشه نمیخوام یه ارری لیستی داشته باشم که همه چی توش باشه میخوام یه ارری لیستی داشته باشم بتونه فقط استودنت توش باشه اما از اون طرف هم من فقط میخوام یه دونه ارری لیست داشته باشم که همه چی بتونم براش تعریف کنم ارری لیستی از ابجکت ها ارری لیستی از استودنت ها ارری لیستی از سیرکل ها ارری لیستی از استرینگ ها و از هر چیزی ن اینکه صد تا ارری لیست بنویسم اگه یه دونه یه دونه بنویسم که که خاص میشه و این مشکل حل میشه اما از طرفی اگه یه دونه یه دونه بنویسم برای هر کداام از نوع های داده باید یه دونه از این ها بنویسم اگر بیام ابجکتش کنم خب این مشکل برام به وجود میادپس من باید یه کار دیگه بیام و انجام بدم کاری که ما انجام میدیم از ای او سی سطح 4 اش استفاده میکنیم و جنریک هامیگیم این رو ابجکت تعریف کن که همه چی بگیره اما ورودی و خروجیت رو محدود کن چطوری ؟این ورودیته تی اش کناین خروجیته تیش کنهو اینم کستش کناین شد ورودیماین هم شد خروجیمحالا چه خوبی ای داره برای من ؟اگه من بنویسمش خب این همون چیزی بود که قبلا داشتیم از ابجکت اگه بخوام خصوصیش کنمکافیه اینجا بنویسم که این از نوع استودنته دیگه اصلا نیازی ندارم به کست کردن صدرصد استودنت وارد اینجا میشه همین رو مستقیم میتنم اینجا بزارمو این رو هم اگه بنویسم استودنت دیگه رشته رو هم ازم قبول نمیکنه چون اگه الان قبلیه رو تست اگه بزنم رازی ارری لیست رو ازم میپذیره ن رازی ارری لیست ابجکت رو این رو اگرم بیاد داخل بهم ارور میدهاین رو هم بذارید که مشکل ساز نشهتست رازی ارری لیست این میاد داخل ادد میکنه دانشجو رو و ایتم های دگیه رو اصلا به هیچ عنوان   نمیپذیره به هیچ عنوان آیتم دیگه ای رو ازت نمیپذیره فقط استودنت رو ازت میپذیرهخب پس این تا اینجا شد یه ارری لیستی که خیلی دیگه هم عمومیه و هم محدود شده است یعنی هر دو تا رو داره ورودیش کنترل شده است خروجیش هم کنترل شده است و نوعش هم همه چی میتونه داخل قرار بگیره این شد جنریک هامون برای رازی ارری لیستمون بعدش اومدیم برای رازی سورت گفتیم رازی سورت باید چطوری باشه باید از نوع تی باشههمه رو به نوع تی تبدیل کردیم به این صورتخب چرا این کار رو انجام دادیم ؟چون که اگه برگردیم از جلسه اول یه مرور کنیم در مورد سورت جلسه اولی که اومدیم سورت رو بررسی کردیم اولش اومدیم مثلا برای سیرکل اومدیم این کار رو انجام دادیم گفتیم ما یه سورت مینویسم که فقط دایره ها رو مرتب میکنه این گام اول و گفتیم این وابسته است و این خوب نیست اومدیم یه مرحله بهترش کردیم گفتیم یه سوپر کلاس تعریف میکنیم بهاسم شیپ   و زیر مجموعه ای از شیپ های مختلف داریم سیرکل داریم رگتنگل داریم تری انگل درایم و همه این چیزهای مختلف رو اومدیم در نظر گرفتیم و سورتمون رو بجای اینکه با اون نوع های خاص تعریف کنیم اومدیم با چیز عمومی تر شیپ تعریفش کردیم و یه مرحله بهتر شد و ما یه مرتب سازی داشتیم که همه شکل ها رو میومد برای ما مرتب میکرد شد ای او سی سطح دو و یک   بعدش گفتیم این هنوز مشکل داره اگر من بخوام شکل ها رو بر اساس مساحت مرتبشون کنم و یه دونه از این شکل ها نیومده باشه و اریا شو پیاده سازی کنه میاد اریا ی شیپ رو به ارث می بره و اریای شیپ هیچی توش نبود شیپ فقط یه مفهوم بود و اصلا مساحتی نداره متد رو داره اما هیچی توش انجام نمیشه تا زمانی که نوع شکله مشخص نشه کدومتون میتونید مساحت حساب کنید اصلا نمیتونید گفتیم میایم و یه مرحله بهترش میکنیم عمومی سازیه رو انجام میدیم همون جوری که قبلا انجام دادیم اما یه خورده قوانین رو هم براش در نظر میگیریم شد کلاس های انتزاعی و و اجبار روی پیاده سازی یه سری متد ها مثلا گفتیم هر کسی شیپ باشه باید خودش اریاشو پیاده سازی کنه که ابهام وجود نداشته باشه باز اومدیم جلو تر دیدیم با اینکه این خیلی خوب شد اما هنوز هم مشکل داره مشکلش اینه که من نوع های مختلفی میخوام قرار نیست که شکل مرتب کنم اگه بخوام انسان رو مرتب کنم چی بر اساس یه سری ویژگیشون اگه بخوام یه ابجکت دیگه ای هر چیز دیگه ای مرتب کنم چی اونا که زیر مجموعه شیپ نیستند خب یه دونه سوپر کلاس اصلی هم برای همشون بذارم باز که به دردم نمیخوره خب بی نهایت ویژگی مقایسه ای مختلف توی این کلاس های زیر مجموعه وجود داره بر اساس کدومش بخوام مقایسه کنم اصلا همچین چیزی عملی نیست گفتیم برای اینکه بهترتش کنیم حرف نوع نزنیم نوعش رو بزاریم کنار نوع داره اصلا اونا رو هم بذاریم کنار بجاش قانون تعریف کنیم بگیم هر کلاسی این قانون رو رعایت کرد میتونه نمونه هاش رو بفرسته داخل کلاس سورت و مرتبش کنه شد اینترفیس ها یا ای او سی سطح سوم هر کلاسی قوانین رو رعایت کرد ما میتونیم لیسیی از نمونه های مختلف اون نوعع داده رو بفرستیم داخل کلاس ها اون قانونمون اسمش چی بود ؟ اسمش رو گذاشته بودیم کمپیربل که داخش باید متد کمپیر داشته باشه یا مثلا کمپریتور یا بقیه چیز هایی که یاد گرفتیم این شد گام بعدیمون حالا امروز دارم چی بهتون میگم ؟ امروز دارم بهتون میگم یه مرحل باید بهترتش کنیم مشکلش چیه ؟ ابهام داره هنوز ابهامش چیه ؟ ابهامش اینه که این داره میگه که هر چیزی که کمپیربل باشه میتونه با هم مقایسه بشه مگه اینطوریه ؟تو دنیای واقعیمون مگه اینطوریه مگه اصلا همچین چیزی  نیست تو دنیای واقعیمون کاریکه ما داریم انجام میدیم اینه که این انسان ها با هم مقایسه میشن اون لیوان ها با هم مقایسه میشن و اینکه اگر دو تا ابجکت از دو دنیای مختلف با هم مقایسه بشن میگیم این ها با هم میتونن مقایسه بشن میگم این با اون مقایسه میشه این با اون یعنی درواقع حرفی که درایم میزنیم اینه که مثلا فلان ابجکت قابل مقایسه است با یک ابجکت دیگه حالا اون ابجکت دگیه یا از نوع خودشه یا از نوع ابجکت های دیگه است مثلا میگم لیوان با لیوان مقایسه میشه بر اساس ارتفاع مثلایا اینکه میگم ن لیوان با مثلا بشقاب مقایسه میشه یا انسان با ماشین مقایسه میشهاز یه حالت دیگه هم دارم اختصاصیش میکنم میگم لیوان ها فقط وفقط با لیوان ها خود دارم میگم اما خب این قابلیت رو هم دارم بگم این لیوانه با یه چیز دیگه چیزی که الان میخوایم درباره اش حرف بزنیم یا اینکه جلسه قبلی هم درموردش حرف زدیم اینه که هرکی با هرکی نباشه همه چی با همه چی اگه قراره چیزی با چیزی باشه خودم بگم اگر خودم نگم ابهام به وجود میاد چطوری ابهام به وجود میاد ؟ مثلا من اینجا استودنت دارم گفتم این کمپیربله از اون طرف هم سیرکل دارم اینم نمیگم .بعدش میام اینجا اینم نمیگم یه همچین چیزیاینم استودنتهحالا من لیسیتی از دایره ها و دانشجو ها رو با هم قاطی شون کردم میخام مرتبشون کنم همه رو با هم قاطی کردم حالا میخوام مرتبشون کنم خب فرض کنیم همشون استودنت اند یه دونه هم دایره افتادن توشوناینطوری تا مشخص هم باشهخب استوتدنت ها خیلی راحت با هم کست میشن و میتونم کستشون کنم و با هم مقایسه شون کنم و نتیجه انجام بشن و هیچ مشکلی ندارم اما به محض اینکه می خورن به سیرکله خب این مشکل داره برای من اینجاست که اتفاقات ناخوشایند میفته و این ارور میده و یا مثلا این ور فرض کن این همشون سیرکلن و یه دونه استودنت افتاده بینشون حالا میای مقایسه میکنی همه رو تبدیل میکنه میرسه به استودنته نمیتونه تبدیلش کنهارور بهم میده میرسه به استودنته ارور بهم میده خب حالا این رو من چیکارش کنم این ابهام رو چطوری حل کنم ابهام اینطوری حل میشه که من خودم بگم که چی با چی مقایسه بشه مثلا اگر منبگم این قابل مقایسه است با استودنته ابعدش اینجا باید بیام و حتماخب این رو میاد برای من استودنت میزنه اگر حالا نوع دیگه ای بزنم مثلا سیرکل بزنم از من قبول نمیکنهمیگه باید حتما استودنت باشه خب من اگر استودنت رو بزنم این ازمقبول میکنه حالا اینجا میام این رو دیگه نمیتونم بیام تبدیلش کنم به دایره و این رو تبدیلش میکنم به استودنت و میگم اریا این با استودنت مقایهس بشهحالا اینیه چیز بی معنی ای هستش ها ولی خب من اینجوری میخوامکی میاد دایره رو با استودنت مقایسه کنههمچین چیزی که نیست البته باز این مشکلاتی داره ها به این سادگی ها حل نمیشه کلیتش رو دارم میگم چون که دو طرفه است ممکنه استودنت با دایره مقایسه بشه یا برعکسپس این هنوز جواب نمیده به ما ولی خب من کلیتش رو بهتونو دارم میگم خبولی از این ور مثلا برای استودنت هاموندقیقا همینطورمیگم کامپیربل هم استودنت باشه بعد این باید بیاد از نوعاستودنت باشه که این رو تبدیلش میکنه به اوریج و تمام مشکلی ندارهپس از اون طرف داخل رازی سورتمون الان کمپیربل بودن بر اساس نوعیه که مشخصه چیه و الان اجازه نمیده که نوع مختلفی مثلا با هم مقایسه بشن مگر اینکه از اون نوع کمپیربل باشهمثلا اگر دایره از نوع استودنت کامپیربل باشه این قبول نمیکنه ولی خب باید از این نوع کمپیربل باشه خب این شد نکته دوممون که اومدیم و این کار رو انجام دادیم لیست یوتیلیتی مون هم که خیلی واضح و روشن بود چیز خاصی نداشت فقط همین کمپریتورش که  که اونم صحبت کردیم اما یه نکته داشت که اونم گتفم بعدا بهتون میگگم اینکه این ها رو چطوری بیام و جنریک کنمبهتون میگم این ها روخب این ها چیز هایی بود که از جلسه قبل داشتیم مطلبی که میخوام الان بهتون بگم جدیده خیلی با دقت گوش کنید یه خورده شاید سنگین تر از مطالب قبلی باشه خیلی خیلی با دقت گوش کنید خیلی خیلی مهمه میگم یه کوچولو شاید سنگین تر از مطالب قبلی باشه اون چیه اون مطلب ؟اون چیزی که میخوایم درموردش حرف بزنیم ؟برای مرتب سازیاین رو قبلا یاد گرفتیم دیگه اگه من از نوع استودنت این ها رو تعریفشون کنم چندن تا داده داخلش قرار بدم بدم به ایتم و رازی سورت این رو برای من سورتش میکنه و هیچ مشکلی هم یپش نمیاد چون گفته ارریلیسیتتی از کمپیربل ها رو میپذیرم درسته ؟خب استودنتم هم مگه کمپیربل نیست ؟خود استودنت هم کمپیربله پس ارایه ای از استودنت ها هم میشه ارایه ای از کمپیربل هامشکل کجا پیش میاد ؟مشکل زمانی یپش میاد کهارایه رو بردارم و ارری لیستش کنماینم باید ارری لیستش کنیملنگت ها به سایز تبدیل میشن چون دیگه ارری لیست چیز نداره میشن سایز و بقیه هم باید از ارایه خارج بشن و لیست اکسسز میشنهمه این ها رو این مدلیش میکنیم حالا یه ارور بهمون میده خب دیگه باید هم ارور بده درسته ؟ارایه است اون ارری لیسته استودنت رو باید تبدیل کنم به ارری لیستبه این صورتو اینم بنویسم نیو ارریلیستاینم اینطوری ننویسمش بنویسسم ادد کنه خب . .اما حل نشد بازمهنوزم داره ارور میده مگه همه چی الان درست نیست ؟ انگار همه چی حله من همه چی رو درست نوشتم گفتم ارری لیستی از کمپیربل ها اینم ورودییم که ارری لیسیتی از کمپیربل هاست . استیودنت کمپیربله از نوع استودنتاز این ور هم این تی رو اینجا دارم اینم گفتم رازی از نوع استودنته پس وقتی میاد داخل این استودنت میشه پس این هم میشه ارری لیستی از کمپیربل های استودنتی خب منم الان همین کار رو انجام دادماین رازیاین استودنت هم همون کمپیربل از نوع استودنته دیگه پس چرا داره هنوز بهم ارور میده ؟در واقع تشخصیش میده اما نمیتونه تبدیلش کنه به چی تبدیلش کنه به ارری لبیست کمپیربل از نوع استودنت نمیتونه تبدیلش کنه به ارری لیستی از نوع کمپیربل از نوع استودنتی نمیتونه این رو تبدیل کنه چر انمیتونه این رو تبدیلش کنهبخاطر اینکه من هم از ااون ارری لیست خودمون استفاده میکنم برای توضیح دادنش اون ساده تره حالا بریم داخل این یه خورده داستانش زیااد ترهاین ارری لیست خودمون خب چطوری تعریفش کردیم ؟اومدیم این بالا نوشتیم پابلیک کلاس از نوع تیمهم مهم مهم مهمخیلی با دقت گوش کنید . این واقعا خیلی مهمهرازی ارری لیست از نوع تی رو من اینجا نوشتم داخل جاوا و حالا این جنریک هایی که توش استفاده میشه وقتی شما مینویسید رازی ارری لیست از نوع تیبعد یه دونه تی میاد اینجا قرار میگیره مثلا استودنت قرار میگیره مثلا فرض کن همین الان رازی ارری لیستهرازی ارری لیست از نوع استودنت و استودنت اومده داخلاستودنت اینجا قرار میگیره انگار شما همچین کلاسی رو تتعریف کردیناین اتفاق نمیفته ها میگم انگار اینطوریهبعد کلاس میسازه ازش براتون انگاری اینطروی میشه در این متد ادش مثلا میاد  میشه استودنتاینطوری انیشکلی انگار میشه   یه کلاس برات تعریف میکنه و بقیه جززیاتش اون پایین داره اتفاق میفته بعد خب منخب نوشتم ارری لیست از نوع استودنت ها خب پس این شد اولیارری لیست از نوع استودنت ها شد اینو شد این اما میام توی رازی سورتتوی رازی سورت نوشته چی ؟ گفته پرایویت ارری لیست کمپیربل از نوع تی تی هم که من فرستادم داخل از نوع استودنته پس اتفاقی که میفته انگار یه همچین چیزی میشه یعنی یکی دیگه از همین انگار تولید میشهاینش کمپیربله و استودنت هم میره تو دایموندش یه کلاس اینطوری تعریف میشهاینم بیارم بزارم این قسمتانگار دقیقا همچین کلاسی تعریف میشهتوی تابع مینمون شد دومی :توی رازی سورتموناین تعریف شده اولی خب حالا پس داخل رازی سورت من دارم از این کلاس متغیر تعریف میکنم اما توی میندارم از این یکی کلاس میفرستم تو خب این پایینی رو نمیتونه تبدیل کنه به بالایی در چه صورتتی میتونست برام تبدیل کنه ؟در صورتی که من میومدم این دومی رو اینطوری مینوشتم :یعنی اگر این اتفاق میفتاد میگتم رازی ارری لیست از نوع استتودنت اکستند اکستندی باشه ازرازی ارری لیست از نوع کمپیربل استودنت اگر این رو اکستند میکردم میتونست این رو بیاد برای من تبدیل کنه به این یکی و بزاره داخل این لیستم و مشکلم حل شه پس مشکل بخاطر نوع تعریف کلاس هامونه که توی جنریک ها اتفاق میفته من نیومدم بگم که رازی ارری لیست از نوع استودنت زیر مجموعه رازی ارری لیست از نوع کمپیربل استودنته من گفتم خود استودنت اکستندی از نوع کمپیربل استودنته خب خودش چه ربطی به این رازی ارری لیستم داره ؟؟اما توی ارایه ها اینطوری نبود توی ارایه ها خب کلاسی تعریف نمیشد توی اارایه ها من از اون ور استودنتی به صورت ارایه داشتم و از اون ور هم کمپیربل داشتم و اگر استودنت ها همشون کمپیربل بودن میتونست اونا رو بندازه داخل برام کلاس جدیدی تعریف نمیشد همون داده بود فقط ارایه بود میفرستاد داخل   امااما تو جنریک ها انگار واقعا یه کلاس جدیدی تولید میشهبا این اسم طولانیش و این رو من گذاشتم توی گذرگاهم   الان من توی این گذرگاهماین رو گذاشتمبعد سعی دارم این رو بفرستم داخل ولی چون این زیر مجموعه اش نیست اصلا   نمیپذیره ازم   و بهم ارور میده حالا برای حلش باید چیکار کنمکاری که باید انجام بدیم اینه که یه همچین کاری باید انجام بدیم :این رو جنریکش کنم به همین شکلی که هست امااین رو اینطوری ننویسم و تبدیل به تی اش کن ماین رو هم تی بزنم الان میگم چرا باید این کار رو انجام بدی ماین رو هم تی بزنیم :و مشکل حل میشه   ارورش حل میشه چراحل شد ؟دلیلش این چیزیه که بهتون میگممن گفتم رازی سورت از نوع استودنت اتفاقی که میفته اینهاستودنت رو میاد میذاره اینجاهمه این ها رو استودنت میذارهپس وقتی که من این استودنت رو اینجا گذاشتمرازی سورت میاد و همه این ها رو استودنت میکنهخب من گفتم چی رو بفرست تو ؟ارری لیستی از استودنت ها رواین چیه ؟ ارری لیستی از استودنت هاو به همین سادگی حل شد</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Fri, 25 Feb 2022 18:26:37 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه شانزدهم جنریک ها، ioc4</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D8%B4%D8%A7%D9%86%D8%B2%D8%AF%D9%87%D9%85-%D8%AC%D9%86%D8%B1%DB%8C%DA%A9-%D9%87%D8%A7-ioc4-bkn4hhg7ggn7</link>
                <description>میخوایم در مورد جنریک ها صحبت تکنیم اول بیایم مشکلاتش رو بررسی کنیم که ببینیم چه مشکلاتی وجود داره و بعد از اینکه کامل و دقیق فهمیدیم مشکلش رو اون موقع شروع میکنیم به راه حلش رو به دست آوردن .خب مشکلاتی که داریم کجا ها هستند ؟اول مشکلاتی که داره رو با هم بررسی کنیم قبلا یه چیزی داشتیم به اسم شیپ ارری لیستو یه استودنت ارری لیست رو هم داشتیم که اینجا من اسمش رو ععوض کردم به رازی ارری لیست .خب مشکلاتش رو با هم بررسی کنیم اولین مشکلی که استودونت ارری لیست داره چیه ؟ شما به من بگین میخوام با هم دیگه بررسیش کنیم .جواب: مخصوص دانشجو هستش مهم ترین مشکلش اینه که الان این استودنت ارری لیسته وابسته است بخاطر همین من مجبورم وقتی میخوام برای دایره هام ارری لیست تعریف کنم مجبورم از اول دوباره همه چی رو بنویسم الان برای دایره ها همه چی نوشتم ولی شیپ رو اینجا استفادفه مکینمخب مشکل ارری لیست وابستگی به نوع داده اشه . اصلا چرا اسمش رو گذاشتیم ارری لیست ؟ بخاطر اینکه یه ارری لیسته یه ارایه پویاست برای دانشجو ها .این یکی شیپ ارری لیسته چرا اسمش شیپه ؟ چون یه ارایه پویاست که فقط شیپ ها رو میپذیرهورودی این کلاسمان کجاستچه استودنت ارری لیست چه شیپ ارری لیست وروردی اصلیش کدامه ؟ سازنده که نیست سازنده فقط سایز میگیره متد ادد هستش خیلی راحت .ستر هم براش نذاشته ادد گذاشته متد ادد ورودیمه من داده اصلیم استتودنته و ورودی سازنده استودنت نیست فقط یه عدد صحیحهو ورودی اصللیم این جاییه که استودنت میاد داخل و من بررسی میکنم که آیا جا داره این آرایه ام یا ن اگه نداره که رشدش بده اگهگ داره که هیچی دست نزن بهش همون یه دونه کانتر پیش روی میکنه و اون یه دونه کانتر رو اضافه کناین متد رشدشه این متد ریموششه که اندیس میگیره حذف میکنه و متد گتش هم ورودی استودنت نداره ورودی یه عدد میگیره و خروجی یه استودونت داره جای دیگه هم من ورودی ندارم پس همین یه جا من وروردی دارم همین یه جا دارم ورودی میگیرم و نوع داده ای هم که دارم استفاده میکنم استودنتهپس این کلالس استودنت ارری لستم وابسته است به نوع داده استودنت من اگه بخوام توتسعه اش بدم برای چیز های دیگه باید کدش رو کلن کپی کنم بیارم داخل شیپ ارریلیست پیست کنم و اسم استودنت ها رو به شیپ تغییر بدم .به این صورت : و ورودیم رو هم شیپ بذارم . و حالا چیز های مختلف دگیه جا های دیگه هم برای داده های دگیه باز هم همین کار ها رو باید انجاما بدم فایل بسازم کپی کنم همه چیز هاش رو باید ببرم اون ور ولی خب این اصول ما رو داره نقض میکنه اما هدف ما اینطوری نبود هدف ما این بود که بتونیم از ابزار هامون مخصوصا در حالت کلی کد هامون بتونیم استفاده مجدد کنیم قابل تتوسعه باشه اما به طور خاص و ویژه میشه ابزار هایی که برای کلاس های دیگه می سازیم . مثل مثلا ارری لیست مثل مرتب سازی مثل خیلی چیز های مختلف دیگه که بر روی داده های اولیه مون کار میکنن داده های اصلیمون مثلا مثل استودنت سیرکل و .. . و هرچیهدفمون این بود که عمومی باشن که بتونیم استفاده کنیم ن همینجا تو خیلی از برنامه های دیگه هم که بعد ها میتونیم بسازیمشاید مثللا فرض کن تو اگه الان بیای مثلا یه کد رو خیلی مهندسی شده بنویسی و بخوای اصول رو توش رعایت کنی شاید مثللا یه هفته ازت وقت بگیره برای بار اولش حالا دارم مثلا میزنم . اما تو تفرض کن دو هفته وقت گذاشتی و اون کد رو نوشتی حالا فرض کن ده تا پروزه دیگه هم میایی می سازی و تولید میکنی و از این ده تا پروژه ات باز به اون کده نیاز داری دیگه اصلا نیازی نیست دوباره این کارا رو تکرار کنی و انجامشون بدی و اینکه بخواد دو هفته وقت بگیرهسریع میای کتابخونه ادد میکنی و استفاده میکنی اما فرض کن مهندسی انجامش ندی برای ده تا پروژه ات باید ده تا یک هفته ای وقت میذاشتی دو هفته کجا و ده هفته کجا پس کلن صرفه جوییه دیگه پس الان میخوایم یه جوری توسعه اش بدیم چون الان وابسته است به استودنتخب این یه دونه مشکلکدی که من نوشتم وابسته شده به نوع داده امدو تا مشکل دیگه هم توی این دو تا مدل سازی ای هست که انجام دادماول کامپیربلش رو بهتون میگم بعدش میریم کمپریتورش رو هم بهتون میگم مشکل کمپریبلمون چیه مگه ما نگفتیم که اینترفیس گذاشتیم خیلی عالیه عمومیش کردیم الان همه چی برای ما مرتب میکنه پس چرا دوباره اومدیم و دنبال ایراد میگردیم توش ؟!به نظرتون مشکلش کجاست ؟اون پارامترش رو که گفتیم و بعد با کامپریتور حلش کردیم به غیر از این مشکل که با کمپریتور حلش کردیم یه مشکل دیگه هم داره به نظرتون مشکلش چیه ؟ مربوط به همین عمومی بودنشه ها مربوط به همین عمومی بودنشه مشکلش اینه که فرض کنید اینجافرض کنید که ارایه ای از کمپپریبل ها نوشتم مثلا گفتم ده تا ایتم میگیره و بعد تو خانه اوش استودنت گذاشتم و توی خونه دومش سیرکل گذاشتم بعدش میام به لیست یوتیلیتی میگممیگم بیا سورت کن ایتمز و میبینیم که هیچ اروری نداد چون هیچ اروری نداده الان اشتباههه یعنی در واقع یعنی الان نباید قبول میکرد اصن چرا نباید از من قبول کنه درسته که من عمومیش کردم هااا من الان عمومیش کردم که همه چی رو بگیرهقبلا وابتسه بود استودنت گذاشته بودیم نمیدونم شیپ گذاشته بودیم گفتیم این الان خوب نیست خیلی وابسته است گفتیم که از اینترفیس استفاده میکنیم برای اینکه هرچیزی بتونیم بهش بدیم اما این کمپریبل رو هم که گذاشتم خیلی عمومیش کردهچون که استودنت نباید با دایره مقایسه اش کرد من نمیتونم این رو با سیرکل مقایسه کنم بر اساس چه پارامتری بخوام مقایسه اش کنم ! ؟ یکی اوریج داره دیگری شعاع داره مساحت دارهمن الان هر دو رو میتونم بذارم داخل کمپریبل و ایتمز رو حالا امده تعریف کردم و گفتم سورت کن و این میاد سعی کنه که سورتت کنهالان دو تا ایتم توشه صفرش استودنته و یکش سیرکله و اینجا میگه استودنته مقایسه شو با سیرکل .میاد داخل متد استودنت متد کمپیرش که حالا اینجا هست میاد توی متد کمپیرش و اینجا گفته که چیکارش کنیم ؟ گت اوریج  بیا مقایسه کن با چی ؟ این رو باید کستش میکردیم و گت اوریجخب گفتم چیه ؟ گفتم استودنت خونه اولش استودنته و دومی سیرکلهحالا این گفتم چیه گفت خونه اولش استودنت و دومی سیرکله میگه استودنت دات کمپیر سیرکلمیاد اینجا خب الان یه سیرکل اومده اینجا بعد سیرکل رو کست کن به استودنت و گت اوریج و بعد بهم ارور میده ارور زمان اجرامیده خب این اشتباهه اصلا نباید بپذیره یه همچین چیزی ن اینکه نباید بپذیره همچین قابلیتی رو داشته باشه اما  شاید اصلا بخوام کد هایی از نوع های مختلف رو با هم مقایسه کنم شاید بخوام این کار رو هم انجام بدم مثلا فرض کنمثلا فرض کن چندین داده مختلف رو با هم داده هایی که ای دی دارن مثلا همه داده هایی که ایدی دارن مثلا برای استودنت ایدی بزارم برای چیز های دیگه هم ایدی میزارم بعد بتونم خودم بهش بگم بگم مثللا این سیرکله بر اساس ای دی بر اساس کلاس مشترکی بین کلاس های دگیه قابل مقایسه است مثلا فرض کن بگم بر اساس ایندکسبل کلاس هایی که قابل ایندکس شدن هستن .یه اینترفیس تعریف کنم و بعد بگم سیرکل ایندکس بله بعد بگم مثلا میتونه ایندکس داشته باشه استودنت ایندکس بله میتوته ایندکس داشته باشه بعد مثلا بگم سیرکلم بر اساس ایندکسه قابل مقایهس است خودم بگم بر اساس چی بر اساس ایندکسبل بودن قابل مقایسه است پس بگم استودنتمم بر اساس ایندکسبل بودن میتونن با هم قابل مقایسه باشن . این قابلیت باشه اما اگر من خواستم فقط و فقط نوع داده خاصی رو برای من مرتب کنه ن اینکه لیستی از همه چیز رو یعنی هم اون باشه هم این باشه این نباشه که داده های مختلف با پارامتر های مختلف با هم قابل مقایسه باشن . چطوری با هم قابل مقایسه باشن ؟! نمیتونم همچین چیزی وجود نداره اما اگر یه پارامتر مشترکی اومدم و بینشون تعریف کردم و اومدم یه اینترفیس براشون گذاشتم و همشون بر اساس این پارامتر قابل مقایسه ان اون اره اون میشه ولی این نباشه که هر کدوم بر اساس یه پارامتر برای خودشون قابل مقایسه باشن و بعد استودنت رو با سیرکل بخوام مقایسه کنم چطوری میشه نمیشه همچین چیزی در واقع داده های مختلفمون تو دنیای واقعی به صورت جزئی قابل مقایسه اند .یعنی چی جزئی تو ریاضیات گسسته اگه داشته باشین یه چیزی به اسم ترتیب جزئی هست که به صورت جزئی اینا میتونستن ترتیب داشته باشن اینم همینه به صورت جزئی میتونن قابل مقایسه باشن یعنی لیوان رو با لیوان مقایسه کنن موس رو با موس مقایسه کنند انسان رو با انسان مقایسه کنند یا اگر خواستم پارامتر مشترکی بینشون بذارم بتونم همشون رو بر اساس اون پارامتر مشترک مقایسه کنم پس باید به طور خیلی مشخص خودم بگم که بر اساس چی مقایسه پذیر باشه ن اینکه همین طوری بگم مقایسه پذیر باشه !خب بر اساس چی مقایسه پذیر باشه ؟؟! این یه مشکل دیگه که الان با جزییات بیشتر برسیش میکنیم یکی هم توی این کمپریتورمه خب کاملا مشخصه دیگه این کمپریتور مشکلش چیه ؟این دیگه کاملا مشخصه وابسته است به استودنت هم اینجا خود این وابسته است به استودنت هم کامپریتورش وابسته است به استودنت کمپریتوری هم که تعریف کردم وابسته است به استودنت پس این کاملا مشخصه هم خودش وابسته است خود این متدم وابسته است و همو هم کمپریتوتری که دارم در داخلش استفاده میکنم وابسته است پس این سه تا مشکل رو ما میخوایم حلشون کنیم . چطوری باید حلشون کنیم ؟ با استفاده از سطح چهارم اول ارری لیسته رو بیایم درستش کنیم خب تا اینجای کار تمام مطالبی که در مورد دپندنسی اینجکشن داشتیم و اینورژن اف کنترل داشتیم و حذف وابستگی و وابسته کردن به نوع داده عمومی تر و اینترفیس ها و همه این چیز هایی که داشتیم یه چیز مشترک بینشون وجود داشت دپندنسی اینجکشنشون صدرصد یک نمونه از نوع داده رو میپذیرفت یعنی چی یک نمونه از نوع داده رو می پذیرفت &gt;&gt; مثلامثلال توی این سورت کمپیربلی که اینجا نوشتتیم چی رو از ما میپذیره ؟ لیستی از کمپیربل ها رو از ما میپذیره یعنی لیستی از متغیر های ادرس حافظه یعنی متغیری که تعریف شده میپذیرهاینجا مثل این آیتمز الان من ایتمز رو تعریف کردم این ها همشون متغیر های ادرس حافظه ان دو تاش نمونه سازی واقعی شده بقیه شون متغیر ادرس حافظه ان ولی تعریف شدن اون جمله قبلیم رو اصلاح کنم بهتره اینطوری باید بگم : تا اینجای کار هرچی که داشتیم دپندنسی اینجکشنشون یک متغیر تعریف شده رو میپذیرفتند حالا یا اون متغیر ادرس حافظه بود یا اینکه مثلا یک نمونه داخلشههرچند خالی بنویسی هم ارور میده باید حتما نوع رو هم توش ریخته باشی که برات بتونه اون کار رو انجام بده یعنی نال باشه باز ازت قبولش نمیکنه و بهت ارور میدهیا مثلا توی استودنت ارری لیستی که اینجا داریمچی رو فرستادم داخل؟ با نیو یه نمونه ازش ساختم و فرستادم تو متد ادد ممکن بود این رو توی یه متغیری قرار میدادم به هر حال باید یه نمونه ازش تعریف کنم و اون رو بفرستم تو که بیاد داخل استودنت ارری لیستم و اون رو بفرستم تو که بیاد داخل استودنت ارری لیستماینجا برام بذاره داخل اون لیسته همه اون سطوح مختلف همه شون اونطوری بودن همه سطوح از یک و دو سه و همه شان نمونه رو میپذیرفتند مشکلی که من اینجا در استدونت ارری لیست دارم با فقط نمونه فرستادن داخل درست نیشه مشکلم نوع داده استچقدر خوبه که من بتونم نوع داده ام رو بفرستم تو و بتونمو بتونم بگم از این استفده کنه یعنی چی یعنی بگم مثلا مثل این هست که الان گفتم ادد مثلا یه چیزیاین الان خود استودنت رو فرستادم تو اگر نوعش رو بخوام بفرستم تو باید اینجوری می نوشتماین نوع داده شه دیگه متغیر تعریف نکردیم نوع داده استودنته اون نقشه اس اون الگوئه اس اون الگلو رو باید بفرستم تو ن اینکه یه نمونه از الگور رو بفرستم تو مثل این میمونه مثلا یکی نقشه رو میکشه نقشه یه ساختمون   میده دست افراد مختلف مثلا میده دست یه نفر یا مثلا نقش یه ماشین مثلا توی کارخانه میدم دست اون مهندس ها نقشه رو الگو رو مدل رو میگن از رو این ماشین بسازین خب یه دونه میسازن دو تا میسازن بعد ممکنه به خط های تولید مختلف این رو بدن مثلا بگن این نمونه برای تو این یکی هم برای تو این الگو برا تو و این الگلو هم برای تو یه دونه ماشین رو بهتون نمیدن که بهتون بگن از روشون یکی رو بسازمیگن این مدله این الگوته این مدل رو از روش بساز همون رو ممکنه بدن به یکی دیگه بگن این الگو و مدلته بگن از روش بساز پس ممکنه الگو رو بفرستن جا های مختلف که نمونه های مختلف رو ازش بسازن این هم الان همینه من الان نیاز دارم خود الگوم رو داخل لاستودنت ارری للیست و بهش بگم تو از ........... برای خودت متغیر تعریف کن از روی این الگو از روی این مدل بیا متغیر تعریف کن داخل یا ممکنه بفرستم برای لییست یوتیلیتی بفرستم برای نمیدونم هر کلاس دیگه ای بگم بر اساس این الگو بیا این کار رو انجام بده متغیر تعریف کن .کجا قبلا ازش دیده بودیم ؟داخل خود ارری لیست جاواما مینوشتیم ارری لیست وقتی این رو مینوشتیم جلوش یه علامت باز میکردیم که بهش میگن دایموندبعد اینجا چی مینوشتم میومدم مینوشتم نیو استدونت همچین چیزی نمی نوشتم این الان یه نمونه است من خود الگو رو مینوشتم یعنی دقیقا خود اون مدل ام رو می نوشتم نمونه ای ازش ننوتشماین اشتباه ست که استودنت بسازی بعد اسمش رو داخل دایموند بزاری این بهت ارور میده چون متغیر داری بهش میدی باید خود مدل رو بهش بدی که برات بتونه از روش داخل کلاس خودش نمونه بسازه پس منم الان میخام این قابللیت رو داشته باشم که مدل بفرستم داخل کلاس هام ن اینکه نمونه هام فقطچطور باید این کار رو انجام بدم ؟ فوق العاده راحت کافیه بیای جلو کلاست دایموند باز کنی و بعد داخلش یه اسم بهش بدی معمولا یا تی یا ئی اس یا ار هم بعضی وقتا میذارن اما تو میتونی هرچی بنویسی تو میتوونی بنویسی تایپ تو میتونی بنویسی سلام هرچی بخوای میتونی بنویسی معمولا میگم یا تی یا ئی اگر خیلی کم بیاد اس و ار هم استفاده میشه چون میتونی چند تا رو هم بگیری و همه رو با کاما از هم جدا کنممثلا بگم دو تا نوع میخام از ای و تی و بعد دو تا متغیر از نوع های مختلف تعریف کنم من فعللا یه دونه اش رو انجام میدم خب حالا اینی که تعریف کردم میتونم بیام ازش متغیر تعریف کنم مثلا همه متغیر های دیگه ای که دارم مثلا اینت کانتر و . .حالا میتونم بیام بنویسم تیاین الان دقیقا یه متیغیر از نوع تی برای من تعریف میکنه تی چیه ؟ تی اون چیزی هستش که من از اینجا بهش میدم مثلا میام مینویسم استودنت ارری لیست بعد جلوش مینویسم از نوع مثلا فرض کن استودنت ها این استودنت رو میاره میذاره جای این تی برای من و از این تی یه نمونه یک متغیر برای من تعریف میکنه که همون استودنته اگر اونجا بنویسی سیرکل میاد برات سیرکل میزنه خب اولین کاری که انجام میدیم اسمش رو تغییر میدیم بجای اینکه اسمش شیپ ارری لیست باشه یا چیز استودنت ارری لیست باشه من اسمش رو میذارم raziarrylist چون میخوام همه چیز بپذیرهبعدش میتونم حالا بیام مثلا بیام اینجا برای این اولی بگم رازی ارری لیست از نوع استودنت و مساویش رو هم اینطوری بنویسم که برای من اینجا این ها رو بزنهبرای دومی هم بیام بنیوسم از نوع سیرکل حالا رازی ارریلیستت اولی استودنت میفرسته تو و دومی سیرکل میفرسته تواگر در دایموند دومی چیزی ننویسیم خود جاوا استتنتاج میکنه و خودش مثلا اگر استودنت گذاشته باشیم استودنت میذاره ولی در نسخه های جدید جاوا این اتفاق افتاده میتونیم قرار بدیم و مشکلی هم پیش نمیاد اگرم قرار ندیم بازم مشکلی پیش نمیاد چون خود جاوا اون رو استنتاج میکنهخب الان من نوع داده رو فرستادم داخل الان باید کجا ازش استفاده کنم ؟ نکاتی رو باید رعایت کنم .من الان این استودنتی کهمثلا فرض کن تو رازی مینویسیم از نوع استودنت بعد میگم اس مساوی با نیو استودنت میتونم ازش نمونه بسازم حالا ورودی هاش رو بهم بهش بدماما شما نمیتونید به سادگی از نوع داده جنریک نمونه بسازیداگه اینطوری انجام بدین بهتون ارور میدهمن نمیتونم از نوع داده جنریکم نمونه بسازم خب حالا به چه دردم میخوره اصلا وقتی نمیتونم نمونه ازش بسازم به چه دردم میخوره به این دردم میخوره که ما میخوایم ازش متغیر آدرس حافظه تعریف کنیم . خب از اول ترم کلی ما صحبت کردیم که ما میتونم متغیر ادرس حافظه تعریف کنیم از بیرون دپندنسی اینجکشن انجام بدیم داده های مختلفمون رو و کلی کار های حرفه ای انجام بدیم اما اون جا هایی که . .. یادتونه من یه استثناهایی رو بهتون گفتم ؟گفتم یه جاهایی بهتون گفتم که احتیاج دارم نمونه بسازم داخل کلاسم درسته که ما میگیم که باید دپندنسی اینجکشن انجام بشه ولی من نیاز دارم که نمونه بسازم مث چی ؟مث اینجا که ارری لیست رو ساختمخب اینجا گفتیم که نمیتونم ازش نمونه بسازم بر اساس چیزی که گفتمخب گفتم نمیتونم ازش نمونه بسازم خب بر اساس چیزی که گفتیم ، گفتیم باید اینطوری بنویسیمش بگیم این تی باشه و بعد اینم تی باشهنمیذاره ارایه هم ازش بسازی میگه به طور مستقیم نمیتونی این کار رو انجام بدی یه روش داره اما روش خیلی خوبی نیست با استفاده از رفلکشن هاست و خیلی خوب نیست چون اولا سرعت رو میاره پایین و دوما کار اصولی ای نیست برای اینجور مسئله ها خب من نیاز دارم نمونه بسازم و اینکه نمیتونم این کار رو انجام بدم . برم از بیرون بسازم ؟اگر از بیرون هم بسازم خب اشتباهه چرا من باید کاربرم رو وقتی که میخاد ارری لیست بسازه یه ساعت هم بیاد ارایه بسازه خودش ؟اصلا فرض کنیم که بتونه اون کار رو هم انجام بدهاین پایین رو چیکار کنم این جا هم باز دارم تمپ رو میسازم اگه این رو هم اینطوری بنویسمش ارور میدهاینجا رو که دیگگه نمیشه به کاربرم بگم که کاربر برام دوباره یه ارایه بساز خودم باید بسازم این مشکلات رو چیکار کنیم این مشکل به راحتی حل میشه چطور ؟ ورودی ما کجا بود؟ متد ادد ، هیچ راه دیگه ای برای ورود داده اصلی به این کلاس نیست به غیراز ادد خب من اگر این رو تی بزارم   پس صدرصد آبجکتی که میاد داخل این کلاس از نوع تی هستش حالا اون هرچی که میخواد باشه استودنت گذاشتیصدرصد این نوع داده اش از نوع استودنته صدرصد نوع داده ای که وارد این میشه حتما حتما از نوع استودنته هیچ راه دیگه ای هم توی این کلاس وجود نداره که بتونی استودنتی رو بفرستی تو این رو هیچ جا نمیبینی به غیراز اددپس من مسیر ورودم رو محدود کردم از نوع تی حالا تی اینجا استودنته خب حالا کجا ذخیره اش کنم من که نمیتونم نمونه بسازم بجای اینکه توی تی ذخیره اش کنم از کلاس ریشه شون استفاده میکنم آبجکت ، توی آبجکت هر نوع داده ای میتونم قرار بدم و آبجکت رو میتونم ازش ارایه بسازماینجا هم که خروجیه میتونم آبجکت بزارم :اینم که ورودیمونه که از نوع تی هستش به نظرتون مشکلش حل شد ؟آبجکت مگه همه چی نمیپذیره ؟ خب این که انگار الان اشتباهه همه چی میتونم من داخل آبجکت قرار بدم درسته ؟ پس چطوری میگم الان من محدودش کردم ؟ داخل هرچی که میخاد باشه باشه اینجا ورودش رو محدود کردمداخل اصلا ابجکت گذاشتم اصلا هرچیز دیگگه ای که گذاشتم اصلا فرقی نداره مهم اینه که من بتونم تی رو داخل اون قرار بدم ممکنه این تی ای که من تعریف میکنم محدودش کنم خودش حالا جلو تر بهتون میگم اما این الان داخل کلاسمه آبجکته ولی هیچ موجودیتی از بیرون نمیتونه به این آبجکت دسترسی داشته باشه برای خودش بخواد هرچیزی رو داخلش قرار بده فقط و فقط تی میتونه داخلش قرار بگیره چون تی ورودمه پس من این رو تی گذاشتم پس به هیچ عنوان هیچ نوع داده دیگه ای رو نمیپذیره مگر استودنتاستودنت که میاد داخل این برای من داخل آبجکت قرارش میده اگر من این رو از نوع تی بذارم چی ؟این میاد یه ارور بهم میده و اگر من کستش کنم به تیبرام کستش میکنه میتونم آبجکت هم بذارم حالا تی هم بذارم این سوالی بود که دوستتون هم پرسید . تمام آبجکت ها تی داخلشونه هیچ چیز دیگه ای داخلشون نیپس من به راحتی الان رازی ارری لیست رو عمومیش کردم .اما در این  حال محدودیت هم دارم الان من نمیتونم داخل این رازی ارری لیستم که استودنت ها داخلشهبیام سیرکل قرار بدماگر سیرکل قرار بدم بهم ارور میدهولی در عین حال هم میتونم رازی ارری لیست ها رو از نوع سیرکل تعریفش کنم به خودمان بستگی داره که ارری لیستمان را از چه نوعی تعریف کنیم . حتی کلاس های خود جاوارازی ارری لیست استرینگاگه این جا که رازی ارری لیست رو از نوع استرینگ تعریف کردیم بیام و سیرکل بزنم باز بهم ارور میده میگه تو نمیتونی این کار رو انجام بدی اما رشته براش میفرستم میگم سلام و رشته رو ازم میگیرهالان من ارری لیست رو تعریف کردم دقیقا مثل ارری لیست خود جاوا حالا اون خیلی جزئیات بیشتری داره حالا عملکردش مثل همونه دیگه هم رشد میده هم میتونم ادد کنم هم میتونم گت کنم بعد گتش رو نگاه کنیدگتش رو من میگم اس مساوی است با استرینگ ارری لیست  دات گتاز نوع استرینگه اصلا نیاز به ....... هم نیستاما اگه اون رو ابجکت میذاشتماین قسمت گتش رو ابجکت میذاشتم این الان درسته که کار میکنه اما اینجا باید کستش کنمبه این صورت به استرینگ کستش کنم و باید هر دفعه این کار رو انجام بدم ولی خب چرا این کار رو انجام بدم یه بار از داخل انجامش میدم دیگه مشکلی هم پیش نمیاددرسته ؟ فهمیدین این ها رو ؟من کمپریبلش رو الان میخوام انجام بدم اینجا نمیخوام توی یوتیلیتی انجامش بدم توی یوتیلییتی بخوای انجامش بدی به صورت جنریک یه خورده فرق داره چون کلاسیه که از هزاران کاربرد مختلف ممکنه توش داشته باشیم سورت باشه نمیدونم سرچ باشه مینیمم گرفتن ماکزیمم گرفتن و کلی چیز های مختلف دگیه پس اگه یه دونه جنریک بزارم همشان باید استفاده بشه مدل جنریکش یه جور دیگه است   که بهتون میگمش پس به خاطر همین من میام اینجا یه دونه کلاس به اسم رازی سورتو این کمپریبله رو میبرم اونجا خب چیزی که قبلا داشتیم این بود دیگه پرایویت مثلا کمپیربل ازنوع ارایه تعریفش میکردیم و براش سازنده میزدیم و در کنارش هم این رو داشتیم دیگه :»البته ورودی هم نداشتیم و در کل به این صورت می شد :این چیزی بود که قبلا داشتیمش خب اون مشکلی که صحبتش کردیم این بود که الان هرچیزی که من از اون رازی سورت استتفاده کنمبعدش میگفتم رازی سورت دات سورت مثلا (خط 25 )خب الان میخوام این مشکل رو حل کنیم که نشه استودنت رو با سیرکل کامپیرش کرد اصلا همچین چیزی نداریم مگه اینکه خودم بگم یعنی قابلیتش باشه هااخودم بگماها اینجا هم یه نکته بهتون بگمتو این رازی ارری لیسته تا یادم نرفته اگر این رو براش نذاریم این آبجکت در نظرش میگیره و اگر آبجکت در نظرش بگیره میتونی سیرکل رو هم داخلش بذاری مثلا من الان اینجا توی همین رشته میذارممثلا میگم سلام اگر دایموند براش نذاری ها دایموند براش نذاری این رو آبجکت در نظر میگیره اصلا مقدار پیش فرض تی ابجکته موس رو روش نگهدارماره ببینید مستقیم اکستند ابجکته کلاس تی ای که تعریف شده نوع تی ای که تعریف شده ابجکته پس اگر شما مشخصش نکنید آبجکت در نظرش میگیره  البته در صورتی آبجکت در نظرش میگیره من اینجامن اینجا متغیر دیگه ای ازش در نظر نگرفته باشمیعنی مثلا در حد همین ورودی گرفتن باشه داخل کلاس هام نیومده باشم جاهایی ازش متغیری تعریف کنم الان در مورد این صحبت میکنم این خیلی نکته مهمی هستخودش ورودی و خروجیش آبجکت میشه مگر اینکه خودم مستقیم بهش بگم اما این چیزی هم که الان گفتم در صورتیه که مثلا یه همچین چیزی فیلدی نداشته باشم مثلا اگه تی رو داشته باشم از ایکساین دیگه داستانش یه خورده فرق داره مثلا اون چیزیکه برای مرتب سازی داریمش اینجا الان میخوام درموردش صحبت کنماگه یه همچین چیزی داشته باشیم استنتاج میکنه یعنی چی استنتاج میکنه ؟یعنی به محض اینکه اولین برخورد با یه نوع داده اتفاق بیفته بقیه جاها رو از اون نوع در نظر میگیره مثلا من اینجا تی رو در نظر گرفتممن اینجا تی رو در نظر گرفتم ادد میزنم استودنت ااولین برخورد تی رو استودنت در نظر میگیره و یک متغیر از استودنتاین داستانش یه خورده فرق داره در موردش صحبت میکنیم خودش استنتاجش میکنه حتی اگه ننویس ها الان اگه من نننویسمالان من ننوشتمشالان چوون من یه استودنت فرستادم داخل اولین بار است که این اتفااق میفته به محض اینکه برخورد این تی اون نوع داده اتفاق میفته استنتاج میکنه خودش اینم استودنت تعریف میکنه حالا در موردش بیشتر حرف میزنمبزارید این مرتب سازی رو بهتون بگم خب حالا میخوام مشکل این رو حل کنم که هر کی نتونه با هر کلاس دیگه ای مقایسه بشه چیکارش کنم ؟ خب مشکلم نوع داده امه دیگه اون نوع داده ای که دارم باید یه خورده محدودش کنم دیگه خیلی این کمپریبل عمومیه درسته که کمپیر داره اما ما که نباید بتونیم با هر چیزی مقایسه بشه اولین کاری که میکنیم جنیرکش میکنیم خیلی ساده خب مسئله ای که دارم بهتون میگم چیه میگم باید قابل مقایسه باش هاز نوع خودش ن اینکه از نوع های دیگه یا اینکه یه چیز مشترکه بینشون قابل مقایسه باشه از نوع خودش کامپیربل باشه از نوع خودش یعنی چی این حرف یعنی چی که باید سعی کنم که تغییر بدم توی این مسئله اینجا جنریک رو گذاشتمحالا دارم میگم کمپیربل باشه از نوع خودش این کمپیربلی که الان نوشتمیعنی با هر آبجکتی که کمپیربل باشه میتونه مقایسه بشه ن من این رو نمیخوام باید کمپیربل باشه از نوع خودش فقط همین یعنی چی ؟یعنی کمپیربل رو باید جنریکش کنم یه تی بزارم جلوشخب اگه این رو یانطوری بنویسم پس باید کمپیربل رو از اون ور جنریک کنم دیگه کمپیربل باشه از نوع خودش یعنی تی رو بگیر اینم از نوع خودشیعنی این کلاسه کمپیربل بشه از نوع چی ؟از نوع یه کمپیربل از نوع خودشپس این الان کمپیربل شد از نوع خودشمهم مهم مهمپس این سورتم برای کمپیربل ها هم این رو میزارم پس الان من صدرصد مطمئن هستم اگر بیام اینجا بنویسم رازی سورت بعد جلوش بنویسم استودنتصدرصد فقط در صورتی از من قبول میکنه داده ها رو میاد برای من سعی کنه مقایسه کنه که از نوع استودنت باشن کمپیربلشون خب حالا چرا پس ارور نداد چون من هنوز استدونت هام کمپیربل آبجکتنپس اینی هم که الان اینجا نوشتم در واقع نوشتم استودنت از نوع کمپیربل ابجکتی پس اینم هنوز قبول میکنه پس من استودنتم رو باید بیام بنویسم کمپیربل از نوع استودنتفقط با استدونت ها مقایسه بشه ن اینکه با ابجکتیو بتونه مقایسه بشه سیرکلمم باید کمپیربل باشه از نوع سیرکل ها و اینم از نوع سیرکل باشهاینم سیرکل باشه خب حالا من اگر این رو اجراش کنم این بهم ارور میده میگه تو نمیتونی کهبیای مثلا استودنت ها رومیاد اینجا این کار رو انجام میده میاد داخلرازی سورت میگه که رازی سورت خب این از نوع استودنته پس اینم کمپیربل از نوع استودنتهپس اینم فقط ارایه ای از نوع استودنت ها رو میپذیره ن اینکه هر نوع ارایه ای روبیاد برای من بپذیره و ارور میده میگه اصلا این امکان پذیر نیست همچین چیزی که تو میخوای انجام بدی و ازم قبولش نمیکنه دیگه اصلا کار به این نمیرسه قابل مقایسه شون کنه و مثلا حالا کلی داستان های مختلف اگر استودنتش رو هم نذارمباز استنتاجش میکنه آیتم ها روالبته اینجا چون از نوع کمپیربل اند مثلا من اگر بیام اینجا یه ارری لیستی از نوع یه ارایه ای از نوع استودنت ها داشته باشم به این بدم بعد دیگگه این رو نداشته باشم قبول نمیکنه الان من اگه بیام اینجا بنویسم سیرکلخب این سیرکل رو من به این بدم بهم ارور میده میگه این کمپیربل از نوع استودنت ها نیست تو نمیتونی همچین کاری انجام بدی اون قابلیتی که بهتون گفتم من بتونم مثلا چندین آیتم رو تو کمپیربل تعریف کردم بعد بتونم بر اساس یه کلاس مشتریکی بینشون کمپیربلشون کنم چرا چون  الان کمپیربل باشه ..... اینم انجام دادم بعد الان دایره ها با استودنت ها میتونن چیز بشن مثلا بیام این کار رو انجام بدمالان میگه این یه دایره است میگم تیس دات گت شعاش رو بعد مقایسه اش کنم با استودنتی که در قسمت کست نوشتم که بیاد و با ایدیش مقایسه بشه چرا چون خودم گفتم کمپیربل از نوع استودنته این یکی گفتم کمپیربل از نوع استودنته مثللا استودنت با یه سیرکل میتونه مقایسه بشهاما قبلیه اینطروی نبودکمپیربل از نوع خالی نوشته بودم و كمپیربل خالی از نوع چیز بود دیگه آبجکت بود دیگه من اینجا معلوم بود که اصلا با چی میخواستم مقایسه اش کنم حالا این سیرکله و فقط سیرکل رو برای من میپذیره .الان نمینشه که شعاع دایره رو با نمنره دانش اموز مشخص کرد؟جواب : ن دیگه چون الاناین بر اساس کمپیربل سیرکل من نوشتم و نمیتونم این کار رو انجام بدم چون این رو نوشتم نمیتونم این کار رو انجام بدم . قابل مقایسه بر اساس خود سیرکله یعنی هر دایره با یه دایره دیگه مقایسه میشه مثل این میمونه مثلا من بهتون بگم فرض کن دو تا للیوان مثلا دارم با یه دونه موس مثلا مثلا فرض کن این لیوان رو با این موس میخوام مقایسه کنم خب این تو حالت معمولیش چیز درستی نیست مگر اینکه خودم بگم بر چه اساس مثلا میگم فرض کن لیوانه قابل مقایسه اس با موس ها چطوری میگم قابل مقایسه است ؟مثلا میگم ارتفاع این لیوانه با ارتفاع این موسه قابل مقایسه باشهبعد دیگه با هم قابل مقایسه نیست دیگه یعنی خود دایره الان نمیتونم با دایره مقایسه اش کنم اگر اینجا هم بنویسم از نوع استودنتدیگه نمیتونم با دایره مقایسه اش کنم یه دایره با یه دایره دیگه قابل مقایسه نیست بستگی به خودت دارهحالا ممکنه این اصلا یه چیز بی ربطی هم باشه ها خب دایره که با دایره باید قابل مقایسه باشه ولی خب بستگی به تعریف خودتون داره یه جایی میخوای دو تا ابجکت با دو تا دنیای مختلف رو با هم مقایسه کنی خودت میتونی به طور مستقیم بیای بگی این ابجکت با این نوع ابجکت قابل مقایسه میشه یا اینکه با خودش مقایسه میشه یا با یک نوع دیگه مقایسه میشه یا گروهی از ابجکت ها با هم مقایسه میشنیه کلاس یه سوپر کلاس کلی مثلا در نظر بگیرینکاری که ما الان انجام دادیم همه چیز رو مشخص کردیم ابهام ها رفع شدن رفع ابهام کردیم گفتیم این با این مقایسه میشه همین تموم نمیتونیم با چیز دیگه ای مقایسه اش کنی که اون ابهام ها به وجود بیاد هر کی به هر کی باشه هر چیزی رو با هرچی بخوای مقایسه کنی ن نمیتونی که مقایسه کنی من میگم این رو با اون مقایسه میکنم اگه این رو گفتی پس ابهامی وجود نداره پس مشکلی پیش نمیاد پس وقتی که من میام داخل سیرکل میگم این بر اساس استودنت مثلا باید باشه ازم قبول نمیکنه که کمپیربلم از نوع سیرکل باشه بهم ارور میده کمپیربلی بنویس که بیاد برات با استودنت مقایسه کنه پس صدرصد استودنت ازم میخاد من اینجا خودم باید بیام کستش رو انجام بدمممکننه با خودتون بگین اصلا این چه کاریه اون ابجکته رو اصلا مینوشتیم خب اینجا باز همون ابجمکتش بودمن میتونستم دوباه بیام به استودنت کستش کنم میتونستی انجامش بدی اما ابهام داشت اگر کاربر این کار رو انجام نمیداد چی تو برنامه ات رو نوشتی توسعه اش دادی کتابخاانه اش کردی دادیش دست مردم دارن استفاده میکنن کست نمیکنه اشتباهی میاد کست میکنه به دایره خب بهت ارور میده دیگه دیگه اون برنامه ات اجرا میشه خبر نداری میاد کار میکنه میزنه این کتابخانه ای که به من فروخت خرابه فلانه پول منم برد و . .. هزار تا حرف هم بهتون میزنه برنامه تون غیر استاندارد میشه دیگه ابهام دارهاماا الان تو ابهام ها رو رفع میکنی میگید اگر هر نوع داده ای که میخاد باهاش مقایسه کنی رو بنویس اگر نوشتی تو کامپیربلت دیگه اجازه نمیده چیز دیگه ای اینجا بنویسی اینجا بنویسی سیرکل بهت ارور میدهباید قابل مقایسه از نوع استودنت باشی که برنامه ات ابهام نداشته باشی خب اگه سوالی هست بپرسین اگر ن برای امروزتون کافیه</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Fri, 25 Feb 2022 18:24:18 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه پانزدهم &gt;&gt;پراپرتی ها و ایتریتور  و همچنان ادامه پروژه</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D9%BE%D8%A7%D9%86%D8%B2%D8%AF%D9%87%D9%85-%D9%BE%D8%B1%D8%A7%D9%BE%D8%B1%D8%AA%DB%8C-%D9%87%D8%A7-%D9%88-%D8%A7%DB%8C%D8%AA%D8%B1%DB%8C%D8%AA%D9%88%D8%B1-%D9%88-%D9%87%D9%85%DA%86%D9%86%D8%A7%D9%86-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-qj5jujygjnvx</link>
                <description>جلسه قبل راجع به ایتریتور صحبت کردیم امروز میخوام حالت های مختلف استفاده از ایتریتور رو بهتون بگم که کامل براتون جا بیفته فکر میکنم این جلسه قبلی که تمرین ها و سوال های امتحانه رو براتون حل کردم اینترفیس ها دیگه براتون جا افتاده باشه که چیه و چطوری ازشون استفاده کنیم کلاس های ناشناس و کلاس های ابسترکت فکر میکنم که این ها براتون کامل جا افتاده اگر تو این ها جایی برای ابهام هست همین الان بپرسیما چیزی که قبلا درباره ایتریتور ها صحبت کردیم این بود بیایم یه حلقه فور ایچ طراحی کنیم کدمون رو توی حلقه فور ایچ استفاده کنیمفور ایچ چیه ؟ توی زبانی مثل سی شارپ عین این چیز رو داره یعنی تو کلمه فور ایچ رو مینویسیو کاراتون رو توی ان انجام میدین اما توی جاوا همه این ها رو یکی کردن دقیقا همچین کدی که در 73 هست رو مینویسیم اونجا هم همچین کدی هستاگه این سینتکس رو بنیوسی میشه فور ایچ اگر اون یکی سینتکس معمول رو بنویسی میشه فور اما اگر فور ایچ باشه یه سری قوانین و یه سری اصول براش تعریف شده که باید رعایت شه اولا اون ابجکتی که میخوایم توش فور ایچ حلقه زده بشه حتما باید ایتریبل بشهایتریبل بودن یعنی چی ایتریبل بودن یعنی اینکهخب دو تا اینترفیس داشتیم یکییکیش ایتریبل بود و دیگری ایتریتور بود .خیلی ساده به زبان عامیانه بخوام بهتون بگم حلقه فور ایچ این رو به من میگه تو اگر میخوای یه ابجکتی رو من بیام داخلش برات حلقه بزنم کار ندارم لیسته یا للیست نیست یا هرچی که هست تو یه الگوریتم پیمایش به من بده من متناسب با الگوریتم پیمایش تو جلو میرم این حلقه ای که اینجا داریم یه الگوریتم پیمایش پیش فرض توشهچیه ؟ از صفر از یه شمارنده ای شروع میکنهیه کاری بهش میدم اگر براش دایموند بزاریم میتونیم نوعش رو هم تعریف کنیم . من یه کاری تعریف میکنم براش که اون کاره دو تا متد داره یکیش هز نکسته و یکی هم متد نکسته که باید حتما این ها رو داشته باشی خود حلقه فور ایچمون هم با این دو تا متد کار میکنه نکست و هز نکست بخاطر همین این ها رو میخاد در واقع به طور مستقیم هم نمیاد با این ها مستفقیم بیایم بگیم همین ها کافیه نمیگیم باید ایتریبل باشه اگر ایتربل باشه داخلش هه حتما ایتریتور وجود دارهبه سمت یه تارگتی حرکت میکنه و با یک گام هایی گام بر میداره یا یکی یکی یا دو تا دو تا و .. . جلو میره یا میاد رو به عقبپس معلومه که یه الگوریتم از یپش تعریف شده برای این حلقه فور داریم که یه شمارنده بهش میدیم یه حد نهایی بهش میدیم و یه گام بهش میدیم و ممکنه شمارنده از یه عدد بزرگ شروع بشه و به سمت پایین تر یا گگام هاش ضرب بشه و .. . شرط هاش تغییر میکنه ولی به هر حال یه الگوریتمی داره یه ساختاری از پیش تعریف شده براش هستاین حلقه فورشه حالا این داره به من میگه میگه مگه خودت نمیخوای یه ساختار و الگوریتم برای پیمایش داشته باشی علاوه بر ایننمیخوای این طوری باشه میخوای پیمایش خودت رو داشته باشی میگه من این واسط رو برات در نظر گرفتمتو اگر ایتریبل باشی میتونی الگوریتم خودت رو در نظر بگیری برای پیشمایشت مثلا من اومدم استودنت رومیخوام پیمایش کنم توی استودنت اما ن روی درس هاش میخوام یه سری عدد تصادفی توی استودنتم وجود داشته باشه توی اون ها پیمایش کنم و اون عدد صحیح ها رو به من بده اصن کاری به هیچ لیستی هم ندارمما قبلا رو یه سری از درس ها این کار رو انجام میدادیم حالا میگم کاری به درس و لیست و این چیزا ندارم میخوام هی برای خودم عدد تصادفی تعریف کنم میگه تا کجا میخوای این کار رو انجام بدی میگه مثلا فرض کن ده بار نمیدونم مثلا به اندازه ای دیرندوم دات نکست دابل میخوام از نوع دابل باشهمیگه خب اینات هم باید دابل باشن دیگهیعنی داخل دایموند ها بجای کورس دابل میذاریم در داخل ایتریتور ها دابل مینویسیمدر داخل مین هم دابل قرار میدیم خب حالا اجراش میکنم قبلی ها رو هم کامنت میکنمخب الان این دانشجوئه ایدیش یکه به اندازه ایدیش میاد برای من عدد تصادفی تولید میکنه حالا حلقه فور ایچ من کار میکنه و اجراش میکنم و روی ابجکتم میاد و اینجوری تکرار میزنهمن میخوام اینطوری تکرار بزنه من الگوریتمم اینه درسته که الگوریتم خیلی کاربردی ای نیست ولی خب ما همین طور میخوایم مثال بزنیم منظورم اینه که میشه یه همچین چیز هایی برای خودت تعریف کنی و این طوری نیست که حتما باید لیست باشه و بر اساس یه لیست این کار ها رو انجام بدی این الان میاد برای من فور ایچ عدد تصادفی تولید میکنهخب ای دی که من اینجا داشتم عدد تصادفی تولید کرد روی این حلقه فور ایچ به اندازه ای دی استتودنتم میاد و عدد تصادفی برای من تولید میکنه حالا میگم یه چیز کاربردی ای نیست اما میخوام بهتون بگم که لازم نیست که حتما لیست باشه فقط مهم اینه که شما الگوریتم پیمایش داشته باشین از اون حلقه فور اولیه که یه ساختار ثابت و از پیش تعریف شده داره رسیدیم به یه حلقه فوری کهمیتونی ساختار اینجاش رو خودت تعریف کنی با استفاده از اینترفیس ایتریبل این امکان رو بهت میده خودت ساختار خودت رو تعریف کنی و در واقع ساختار حلقه فورت رو تغفییرش بدی خیلی پیچیده اش نکنید برای خودتون فقط این رو در نظر بگیرید میخوای یه ابجکتی توش پیمایش انجام بدی خب اون ابجکتت رو مثلا استودنت بیا ایتریبلش کن و وقتی ایتریبلش کنی ازت میخواد که حتمااین سه تا رو پیاده سازی کنی ما کاری به دو تای پایینیش نداریم این یکیش برای ما مهمهاین رو باید حتما پیاده سازی کنید که من برای اینکه پیاده سازی کنم اومده از یه متغیر کمکی هم استفاده کردم و این دو تا متد رو توش نوشتم الگوریتمم اینه هز نکستم و نکستم خودش دیگه برام متناسب با این برایم پیمایش میکنه هزار تا کار مختلف میتونی انجام بدی میتونی بگی وقتی داری پیمایش میکنی مثلا یه چیزی هم چاپ کن یه خط رو هم چاپ کنمثلا اینطوری یه خط رو هم چاپ کنه هرچند کار درستی نیست و وابسته اش میکنه به کنسول حالا میگم که میتونی این کار رو انجام بدی دیگه به راحتی هر فرمتی که بخوای میتونی حلقه فورت رو خودت بسازی دیگه و خیلی هم ساده است دیگه کارش مثل همون حلقه وایل بود که نشونتون دادم هر کدام از این ها یه دونه ایتریتور دارنمن الان بیام بنویسم ایتریتور از نوع دابل مثلا ای تی ار مساوی است با مثللا فرض کن اس تی دات ایتریتور من اگر این رو داشته باشم خودم میتونم بزارمش داخل یه حلقه وایل چون هز نکست داره دیگهبگم تا زمانی که هز نکست داری برو ایتم بعدیاینجا یه دابل تعریف کنم همون کد های من رو صدا میزنه این الان دقیقا میاد کد های من رو صدا میزنه عدد هاش رو میگیره و چاپش مکنه ولی خب لازم نیست این کار رو اننجاما بدیم حلقه فور خودش این کار رو انجام میدههش مپ ایتریبل هست یا نیست برای اینکه بفهمیم هش مپ ایتریبل هست یا نیست یا هر کلاس دیگه ..چیکار میکنیم ؟ کنترل کلیک میکنیم و روش کلیک میکنیم و میبینی که از یه چیزی به اسم ابسترکت مپ و این هم از مپ ارث برده و در نهایت می بینیم که خودش ایتریبل نیست خود شبه طور مستفقیم ایتریبل نیستبرای اینکه بقیه مسیر هاش رو هم بریم که مطمئن شیم که ایتریبل هست یا ن همین کار رو هم برای اینترفیس های هش مپ هم انجام میدیم خودش درسته که نیست اما شما میتونید داخل ایتم هایی که توش قرار میگیره داخل خود ایتم ها حلقه بزنید چطوری ؟مثلا بگم هش مپ از نوع اینتیجر و مثلا استرینگ بعد میام مینویسم مثلا حالا هش مپ و بعد میگم هش مپ دات ولیو داره که از نوع کالکشنه و یه کی هم داره کلید هاکه اونم از نوع ست هستش که هر دو این ها ایتریبل اند کالکشن ها ایتریبل هستند خب ارری لیست هم زیر مجموعه ای از کالکشن هاستمارکر چیه ؟ بزارید به برسیم به سریالیزیبل بهتون میگم مارکر چیه اینترفیس مارکر چیه بهتون میگم .این اورراید هایی هم که نوشته میشه اینا آنوتیشن بهشون گفته میشه که ساخته شدن برای جایگزین شدن اینترفیس های مارکر یعنی در واقع دارن نقش همون مارکر ها رو بازی میکنن یعنی علامت گذارعلامت میذارن یه سری کلاس ها یه سری متد ها رو علامت گذاری مکنن اما خب خیلی وسعت بیشتری دارن مثلا اینترفیس های مارکرحالا این ها هم یه جوری اینترفییس اند که بهشون میگن آنوتیشنولی خب حالا ما اینترفیس هایی هم داریم که فقط مارک میکنن یعنی علامت میذارن مثلا میاد این رو علامت میذاره این کلاس رو این سریالیزیبله کلونبلله درگبله برای اینکه مارکش کنی علامتش بزنی و بعدش خیلی کاربرد های مختلفی داره بهتون میگم که چیه فعلا یه چیزی توی ذهنتون باشه اما این آنوتیشن ها خیلی وسعتشون بیشتره هم میتونن کلاس ها رو مارک کنن متغیر ها متد ها همه چیز رو میتونن مارک کنن حالا میریسیم بهشون البته انوتیشن ها رو نمیرسیم مارکر رو میرسیم انوتیشن ها خودشون درسشون خیلی زیاده پس خیلی ساده استت دیگه ایتریتور و ایتریبل خیلی ساده است هر آبجکتی که بخوای داخلش پیمایش کنی ایتریبلش میکنی کاری نداری لیسته لیلسیت نیست یا هرچیزی که هست اگر ایتریبلش کنی و الگوریتم پیمایشتو بنیوسی برات میچرخه همین به همین سادگینیاین برای خودتون عجیب غریبش کنید مثلا یه کار دیگه ای که میتونید انجام بدین من مثلا میخوام این همون درس باشهدابل ها رو دوباره به درس تبدیل کردیمخب حالا کاری که میخوام انجام بدم اینه که مثلال میخوام توی درس ها پیمایش کنم اما اون درس هایی که زیر ده شده یعنی حلقه فور ایچم اینطوری کار کنه بگه هر موقع حلقه فور ایچ زد لیست درس هایی که کمتر از ده گرفته رو بیاد برای من چاپ کنه یا اینکه تصادفی بده یا هر چیزیمن مثلا لیست درس هایی که کمتر از ده شده رو میام در نظر میگیرم چطوری این کار رو انجام میدم ؟ من که نمیخوام لیست اصلیم رو خراب کنم میخوام فیلتر بزنم رو اینالبته یه روش حرفه ای تر هم وجود داره من نمیخوام با فیلتر ها و این چیز ها درگیرتون کنم خیلی معمولی و ساده می نویسیمیش پس من نمیخوام این رو خرابش کنم(لیست درس ها )پس میام عین همین رو کپی میکنم یه دونه دیگه ازش که دانشجو هایی که کمتر از ده شدن رو در این برای منذخیره کنهبعدی میام داخل ایتریتورم موقعی که میخاد شروع کنه جایی که هنوز وارد نکست و هز و اینا نشده لحظه شروعش رو در هز نکست و تو نکست نمینویسیم !اگر اینجا بنویسیم هر دفعه از اول تولیدش میکنه من میخوام بار اولی که ایتریتور رو صدا میزنه مثل همین کدی که همین الان خودم نوشته بودماینا گرفتم بعدش اومدم حلقه زدم یعنی این لحظه باید این کار رو انجام بدم خب چیکارش باید بکنم میام اون هایی که کمتر از ده هستنمیام تو ایتریتورم از یه فور ایچ دیگگه استفاده میکنم بله میتونید تو در تو در هم از هم استفاده کنید . میگم تو لیست درس ها بگرد توی لیست درس ها بیا بگرد اگر ای دات گریدش کوچیک تر از ده است این رو اضافه اش کن به سی اسهمه چیز رو داخل خودش دارم تعریف میکنم جمع و جوره و همه چیز کنار همدیگه است و بیرون کسی دیگه درگیر نمیشهکلاس نوشتن ها شما دیگه طراحشین شما باید کلاس هاتون جوری باشه که هم خودتوون بتونین استفاده کنین هم اعضای تیمتون هم اینکه کسای دیگه کدتون رو بذارین رو اینترنت و گیت هاب و . . یا حتی برای فروش بذارین و میخواین بقیه ازش استفاده کنن پسمیاین داخل کلاستون همه چیز رو اماده میکنین هر چیزی که لازم هست رو اماده میکنید که از بیرون اونا درگیر یه سری چیز های اضافه نشن فقط استفاده کنن خب حالا من مثلا همچین استفاده ای در نظر گرفتممیام میگم نرسیدی به سی اس دات سایز روی سی اس بیا برای من لیست همه درس های کمتر از دهش رو داره دیگه میگم سی اس دات گت سی پلاس پلاسهمشون هم باید از نوع درس باشن حلقه ام هم باید از نوع درس باشهمیاد برای من چاپش میکنه حالا فقط لیست درس هایی که کمتر از ده شده رو میاد برای من در نظر میگیرهحالا من میخوام توی درس هایی که دانشجوی شماره صفر داره حلقه بزنم اونایی که کمتر از ده هستش رو برام چاپ کنه بریم ببینیم پیدا میکنه فقط سخت بهش نگاه نکنید فقط اینطوری بهش نگاه کنید که میاد روی الگوریتم پیمایش خودتون پیمایش انجام میده میاد یه دونه ابجکت میگیره باید حتما ایتریبل باشه پس اگر ایتریبله حتما ایتریتور داره و ایتریتوره الگوریتم پیمایششهخب ببینید که الان درس هاییک ه کمتر از ده هستش رو اومد برای من چاپ کرد یه سری درس هم داره کهخب این از ایتریتور و ایتریبل پس کلی کار های مختلف دیگه هم میتونید انجام بدین دیگه حالا بسته به خودتون کلی چیز های مختلف میتونی بیای انجام بدی ایتریبل های مختلف تعریف کنی و کلی کار های حرفه ای خب حالا کاری به این ها نداریممن همه این ها رو کامنتشون میکنمیا اینکه بذارین یه مین دیگه بسازیم یه مین دیگه برای شیپ ها و کاری به این نداشته باشیمخب در ادامه میخوایم درباره پراپرتی حرف بزنیم فقط میخوام یه دید سریع و کوتاه بهتون بدم در مورد پراپرتی ها روز دوشنبه عمیقا وارد بحث تئوری و بنیادش میشیم که اصلا چطوری ساخته میشن که اگه در زبان های دیگه میخواستین بسازینشون بتونین این کاررو انجام بدین امروز فقط یه اشاره ای بهشون میکنم و از چیز های اماده ای که توی خود جاوا هست استفاده میکنم . برای پراپرتی هامون و یه نکته دیگه هم خدمتون بگم پنجشنبه هفته اینده و پنجشنبه دو هفته اینده کلاس جبرانی داریم بیشتر حل مسئله انجام میدم حتما حضور داشته باشید .خب چیزی که پراپرتی تعریف کردیم این بود یه دونه فیلد با ستر و گتر هاشالان این فیلد به همراه ستر و گتر هاش معناش میشه پراپرتی و وقتی میام دو تا ستر و گتر براش میذارم و مثلا میام یه شرطی هم براش میذارم مگم که ار اگه بزرگ تر از صفره بیا این کار رو برای من انجام بد هدر غیر این صورت اصن ارور بده دارم این رو تبدیل میکنم به یک ویژگی برای کلاس دایره ویژگی شعاع بودن شعاعمون مثبتهفیلد بودن با ویژگی بودن فرقشون همینه که مقادیرشون کنترل شده است و برای ما تبدیلش میکنه به یه سری رفتار هاخب این چیزی بود که قبلا یادش گرفتیم و وظیفه کنترل مقادیر به دست کیه ؟چه کسی کنترل مقادیر رو انجام میده؟کلاس سیرکل این کار رو برای من انجام میده ما یه مدل پراپرتی داریمما یه مدل پیشرفته تر پراپرتی رو هم داریم در جاوا در سی شارپ هم داریم و .این مدل پیشرفته پراپرتی دو تا قبلیت به من میده میگه تو همین پراپرتی معمولی رو هم میتونی داشته باشی یعنی خود سیرکل میتونه مدیریت کنه اما یه مدل پیشرفته تر میتونی داشته باشی و اون اینه که یه کلاس دیگه برات کنترلش کنه خودش کنترلش نکنهیعنی در واقع بیام سیرکل لرو ویژگی ارش رو وصلش کنم به یه ویژگی از یه کلاس دیگه هرچی تو اون کلاس نوشته شد مستقیم به این هم منتقل بشه و اون این رو کنترل کنه که چی داخلش میاد مثل چی ؟ مثل محیط گرافیکی مثلا یه تکست فیلده بعد من یه کلاس مثلا دارم یه لیستی از استودنت ها و چیز های مختلف دارم بعد توی یکی از استودنت ها یه ویژگی داریم به اسم نیم یه ویگزی داریم به اسم لست نیم یا مثلا یه ویژگی داریم به اسم اوریج مقدارش .بعد من میخوام این رو توی محیط گرافیکی استفاده اش کنم خب برای اینکه این کار رو انجام بدم من اولا فرض کن میخوام کاربرم به صورت گرافیکی  متوجه این بشه که الان اگه داده اشتباه وارد کرده درستش کنه داده اش اشتباههمیتونم بیام دستیت براش شرط بنویسم اگه اینطوری شد مثلا اول اون رو چک کن ببین تسکته داده اش درسته اگه داده اش درست نیست ارور بده بعد ارور دادی حالا کاربر میاد تصحیحش میکنه بعد تصحیحش کرد داده جدید وارد کرده حالا داده جدید از اون مرحله رد شد حالا دوباره داخل کلاس خودم هم یه بار دیگه میام و بررسیش میکنمچون من مثلا اعتماد نداشتم و میگم مقداری که از اون تکسته امده الان داده معتبره ؟ اینجا مثلا شرط گذاشتم و کار تکراری و نهایتا میاد اینجا از هم جدا هستن و گسسته اند بینشون انگار یه گپی وجود داره من میتونم خیلی بهتر این کار رو انجام بدم مگه هر دوتاشون یه کار نیست میتونم بیام بگم این قابلیت خودش رو دارهاما من این قابلیت رو بهش میدم که بتونم وصلش کنم به ببقیه کلاس هام بقیه ویژگی های ببقیه کلاس ها یعنی چی ؟ مثلا وصلش کنم به ویژگی تسکت یه دونه تکست فیلد گرافیکی هرچی تو اون نوشته شد مستقیم تو این هم نوشته بشه و بعد اون رو کنترل کنم بیام بگبم اون تکست فیلده اگر اشتباه وارد شد قرمز رنگش کن اگر درست وارد شد که هیچ اگر درست وارد شد مقدارش ست میشه چون این دو تا به هم وصل هستن این هم ست میشه اتوماتیک این کار انجام میشه بعد ن فقط یه دونه تو میتونی ده تا آبجکت مختلفت رو وصل کنی به همون یه تکسته و اون یه تکست هرچی بگیره این ها هم همون مقدار رو میگیره یا مثلا توی محیط گرافیکی فرض کن من میخوام بگم اگر روی یک آبجکتی کلیک کردم مثلا دایره ای موقعیت جغرافیایی اش چه کلیک کردم چه کلیک نکردم چه هرچی شد وصل بشه به موقعیت موسم که هرجا برم اونم دنبالش بیاد . و کلی چیز های مختلف دیگه مثلا فرض کن ابجکت گرافیکی رو در نظر میگیرم یه مستطیل دیگه این پایین دارم بعد مثلا میگم اگر این مستطیله خورد به این یکی مستطیله قسمت ایکس این به اضافه یه مقداری با اون ایکس قبلیه این باعث میشه چی بشه؟ انگار ابجکت ها دارن برخورد میکنن این یکی اون یکی رو هول میده رو به پایین و به هم وصلش ون میکننمثلا این الان اینطوری یه عدد 3 و اینم یه عدد 3میگم هر موقع 3 اولی به دومی خورد ایکسشون یکی بشه و دیگه هرچی ایکس اولی رو تکان دادم اون یکی هم تکان بخوره جوری که اینگار به هم برخورد کردن . یعنی اینطوری میتونیم برخورد تعریف کنیم و کلی چیز های مختلف دیگه حالا من چند تا مثال سرگرم کننده و حالت بازی رو دارم بهتون میگم شما کلی چیز های مختلف رو میتونین تعریف کنید . مثلا یه چیز دیگه که ترم پیش اون بچه های توی اون گروه برنامه نویسی بودن در نظر گرفتیم این بود که مثلا یه سری حالت پاور پوینت بود دیگه خب یه سری علاین منت داشت دیدین تو پاورپوینت که یه سری نقطه چین میکشه و علاینمنت میکنه ایتم ها رو با هم دیگه علایمنت میکنه بعد ما میتونیم بگیم هر موقع این ابجکت گرفته شد و درگ شد و مثلا حالا وارد یک محدوده ای شد و زون بندی کرده بودیم وارد یه محدوده ای شد مختصات مثلا ایکسش  با مختصات ایکس اون یکی مثلا وصل بشه و اینجا یه خطی بینشون کشیده میشه و این رو بیاری اون ور خطه هم باهاش حرکت میکنه مثلا دیدین که ابجکتته رو اینجا گذاشتی ابجکته رو من میکشم الان خطش از این جا تا اینجاست بعد برین تو پاور پوینت چک کنینابجکته رو میکشین این ور خطه باهاش میاد طولش اضافه میشه و باهاش میاد حالا من میتونم دستی این کار رو انجام بدم و لی راه حل بهترش اینه که بیام و طول این رو وصل کنم به ایکس این یکی بعد هرچقدر ایکس این یکی حرکت میکنه طول اون یکی هم باهاش حرکت میکنه همه چی به هم وصل میشه این فوق العاده چیز جالب و مهمیه و توی ام وی سی به شدت ازش استفاده میشه چون لایه ویوت رو میتونی وصل کنی به لایه مدلت و مستقیم تاثیر بذاری روی مدل هات این از لحاظ کاربردشون حالا چطوری تعریف میشن من برای تعریففشون خب الان تعریف کردم برای این که اون ها رو هم تعریف کنم از یه مدل دیگه باید استفاده کنم باید بنویسم دابل پراپرتی مثلابرای تعریف عدد اعشاری دابل اگر بخهوام اونطوری پرارپرتی هایی رو تعریف کنم باید اینطوری بنویسمیا مثلا بنویسم اینتجیر پراپرتی یا بنویسم استرینگ پراپرتیاگر از کلاس های خودم بخوام بنیوسم چی ؟مثلا توی کلاس استودنتام دیت دارم اگه بخوام از دیت پراپرتی تعریف کنم چی ؟ اون رو چیکارش کن ؟ از یه چیزی استفاده میکنیم به اسم آبجکت پراپرتی و اسم کلاس خودم رو توی دایموندش مینویسماین میشه یه پراپرتی از کلاس خودم مثلا توی سنسور هام هم خیلی خوبه فرض کن برای یه سنسوری یه کلاسی نوشتی برای درایوری .اون اطلاعات رو سنس میکنه بعد تو میای چندین کلاس مختلفف داری برای جاهای مختلف برنامه ات شبکه است نمیدونم چیز های مختلف این رو میای بایندش میکنی وصلش میکنی به اون داده سنسوره هر موقع داده سنسوره تغییر میکنه این ها هم باهاش آپدیت میشه باهاش اتوماتیک این اتفاق میفته حالا من میخوام از دابلش استفاده کنم مینویسم دابل پراپرتی و ارار رو هم عوض میکنم و این طوری مینیوسمش و حالت قبلی رو که براش در نظر داشتم حذف میکنم .خب این هم الان کلاسه و کلاس ها هم باید حتما نمونه سازی بش میتونی بیای دابل پراپرتی ابسترکت رو ایمپلمنتش کنی حالا مثلا کلاس ناشناس یا کلاس فیزیکی براش تعریف کنی یا اینکه ن از یه چیز آماده خود جاوا استفاده کنی سیمپل دابل پراپرتی این اگه بنویسی خودش نمونه سازی پیش فرض داره برای اینتجر هم داریم سیمپل اینتیجربرای همشون داریماین ها دیگه اشتباهه و دیگه ازم قبول نمیکنهححالا من ید بیام ستر و گتر براش بنیوسم ستر و گترش فرق داره با اون که میگیم قبلا دو تا تعریف میکرد الان اگر اینتر رو بزنم سه تا برام تعریف میکنه یه دونه اش اضافه اساین کد دقیقا کد قبلیه اس اما تو میتونی از طریق این سومی این کلاست و این فیلدش رو این پراپرتیش رو که درست تره وصل کنی به یه پراپرتی از کلاس دیهچرا بهش گفته میشه پراپرتی؟فیلده ولی بهش گفته میشه پراپرتیبخاطراینکه این قابلیت رو داره که کلاس های دگیه کنترلش کنن ومقادیرش کنترل شده باشه واقعا مفهوم همون ویژگیه رو داشته باشه اما شاید خیلی براتون جا نم یافته که درونش چه اتفاقی داره میفته که ما داریم بهش میگیم پراپرتی در جلسه بعد ادامه توضیحات داده میشهاینجا هم از گت استفاده میکنم که برای اینکه مقدارشون رو بگیرمبرای تو استرینگ هم همینطوراین تا اینجا من یه دونه کلاس دگیه هم اینجا دارم به اسم تست که این رو هم نوشتمش میخام ار سیرکل رو وصل کنم به تستایکس تست عین همون نوشتم نوشتم دابل پراپرتی از نوع ایکس ستر و گتر هاش و توی ستش هم شرط گذاشتم که گفتم اگه ایکس بزرگتر از صفره این کار رو برای من انجام مید ه دیگه داخل ایکس هم هیچ شرطی ندارم حالا چطوری ازش استفاده کنمميام مينويسم تستمينويسم سيركل دات ار پراپرتی دات بایند که یعنی وصل شو به چی ؟ به تست دات ایکس پراپراپرتی باید حتما هم نوع باشن اگر هم نوع نباشن از یه حالت پیشرفته ترش ابید استفاده کنی میتونی بیای از یه حالت پیشرفته ترش استفاده کنی و میتونی مپش کنی در واقع ولی ما نمیخوایم از این استفاده کنیم میخوایم از هم نوع بودنش استفاده کنیم خیلی کار های حرفه ای میتونیم انجام بدیم میتونیم دابل رو وصل کنیم به استرینگ یا مثلا جنسیت رو وصل کنیم به استرینگ یا جنسیت کاربر هات رو وصل کنی به تسکتی که استرینگهو اینجا دیگه لازم نیست داده هات رو بنیوسی زن مرد زن مرد مینویسی صفر یک باینریه دیگه صفر و یک براش مینویسی و تو دیتا بیست مینیوسی با حجم خیلی کم وقتی که اومد این ور بایندش میکنی اما توی بایندش هم مپ انججام میدی میگی اگه مثلا صفره بنویس فرض کن مثلا زن اون یکی بنویس مرد و هرچیزی و برات داده هات رو مپ میکنه هرچیزی که اینجاست مستقیم میفرسته تو تکست ها برات یا لیسته یا هرجایی یا مثلا تیک میزنه نقاشی میکشه یا ایکون براش بزار ایکون زن بودن ایکون مرد بودن خب الان من این رو نوشتم امتحانش کنیم من به هیچ عنوان دست به سیرکل نمیزنم بعد میام مینیوسم ست ایکس مساوی با نوزده بعد میام این پایین سیرکل رو چاپ میکنم میگم ارش رو چاپ کن ارش رو تغییر ندادم ها دارم ایکس تست رو تغییر میدم اما ببینید در اوج زیبایی میاد برای من چه چیزی رو چاپ میکنهخب نوزده رو برام چاپ کرد من هیچی نذاشتم داخل سیرکلم خودم به صورت مستقیم اومدم این ها رو وصل کردم حالا هر موقع تو بیای ایکسه تست رو تغییر بدی سیرکل ار پراپرتیش تغییر میکنه حالا تو فکر کن این رو بچسپان به هزار چیز مختلف میتونه چندین کلاس مختلف هم بیان و به این وصل بشن تو طرف رو هم میتونی بایند کنی بایند دو طرفه اشیعنی اگر آر رو تغیر بدی این ایکسه تغییر کنه و اگر ایکس رو تغیر بدی ار تغیر کنه اما این نکته رو هم باید در نظر بیگیری اگر من این مدلی بایندش کنم بعدا بیامبنویسم سیرکل دات ست ار بهم ارور میده دیگه نمیذاره دستی انجامش دی قفلش میکنه برات الان من بایند اننجام دادم دیگه این ست کردنی که اینجا وجود داره قفل شده دیگه اجازه نمیده که من خودم دستی بیام سیرکل رو ستت کنم بخاطر همینه که میگم کنترلش میکنه فقط و فقط تنها راهش اینه که از طریق ست ایکس بهش مقدار بدی اگر بایندش کردی اما اگر بایندش نکنی ن اگر بایندش نکنی میتونی سیرکل رو ست کنی هیچ مشکلی هم پیش نمیاد ولی به محض بایند کردنش تننها مسیروروردی مقادیر بهش ست ایکس تسته دیگه هیچ راه دیگه ای نمیذاره که بهش مقدار بدی ..</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Fri, 25 Feb 2022 18:20:38 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه چهاردهم &gt;&gt;ادامه ioc3 اینترفیس ها</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%DA%86%D9%87%D8%A7%D8%B1%D8%AF%D9%87%D9%85-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-ioc3-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%81%DB%8C%D8%B3-%D9%87%D8%A7-tvzxjo13sbom</link>
                <description>سه تا ایونت داریم یکیش افتر کلاک یکی پر کلاک و دیگری هم تسک فینیش این ها یه بار نوشته میشن برای همه تسک ها اعمال میشه ان تسک فینیش رو نمیخوام برای خود اسکیژولبل تایمر تعریفش کنم میخواما برای هر کدام از تسک ها ایجاد بشم مثلا بیام بگم نیو سند ایمیل تسک و بعد نمونه ساززی کنم برای سند ایمیل و بعد یه کاما بزنم و اینونتش رو اضافه کنم بگم اینم ان تسک فینیششهخب به نظر شما باید چکارش کنم به نظر شماالبته شاید یه اینترفیس جدیدی هم لازم داشته باشیم .این جا خودم گفتمش این یعنی چی ؟یعنی یه نمونه ناشنانسا رو میفرستم داخل سند ایمیل میفرستم داخل سازنده اشیعنی اینجا خیلی ساده بیام و ان تسک فینیش رو در کلاس تسک ایجاد کنم و بعدش بیام و این رو اضافه اش کنم به سازنده اشو ستر و گتر هم براش میذارم .ان تسک فینیش از نوع ایونت هندلر اومده داخال سازنده امحالا این میگه همه سازنده هات باید همه این فیلد رو داشته باشنخب من این رو از اول تولیدش میکنماینم برای هردو تاشسورتم اکستند از نوع تسک و اینم باید اونجوری بشهخب اینجا در تسک باید هر دو باشن هم تایم استمپ هم ایونت هندلفرکال تسک هم همینطور فقط سازنده اش رو تغییر میدیم حالا اینجا موقعی که میخوایم ازش استفاده کنیمبرای همشان جدا این کار رو انجاما میدمخب این طوری هر کدام جداگانه ایونت خودشون رو دارن همه این ها رو درسته که تعریف کردیم اما الانن صداش نمیزنهاما اسکیژولبل تایمر این رو صدا نمیزنه چون دارهتسک فینیش اینجا رو صدا میزنهمن این رو باید از این جا برداارمو این ها رو هم بردارم و بعدش بیام اینجا و بگم خود همین تسکهگت ان تسک فینیشش و گت هندلر رو بزنه به همین سادگی این اللان کار میکنه و هر کدام از تسک ها ایونت هندلر خودشون رو دارن فهمیدین یا براتون مبهم بودهخب بریم سوال 2سوال دوسوال دوم مربوط میش به مرتب ساازیالگوریتم مرتب سازی رو به گوننه ای   تغییر بدین که امکان مرتب سازی بر اساس چندین پارامتر مقایسه ای رو پشت سر هم داشته باشه به چه معنی به این معنی اگه من بیام اینجا این کار رو انجام بدم بگم لیست یوتیلیتی لیست استودنتن ها روتو گام اول بر اساس معدل اما اگه معدلشون با هم برابر بود بر اساس آی دیهدف اصلیش این باشه که بر اساس ای دی مرتب کنه اما اگه دو تا استودنته معدلشون یکی بود بر اساس پارامتر دوم بررسییشون رو اانجام بده مثل خهیلی از این برنامه ها دیگه که چند تا پارامتر براش در نظر میگیری بر اساس قیمت ببر اساس محبوبیت و . . ..حالا ما اینجا نمینخوایم زیادیش کنیم و دو تا پارامتر رو در نظر میگیریم هدف اصلی اولی اما اگه اولی با هم برابر بودن بیاد از دومی استفاده کنه البته همین الان میتونیم یه جوری بنویسیمش که تا بی نهایت همینطوری بپذیرهمیتونم بیام اینجااگهاس یک دات اوریج مساوی مساوی است با اس دو تاد اوریججحالا اگه این ها با هم بربر بود بودن بر اساس یه مقایسه کننده دومی انجامش بدهکمپریتور میگه که این رو باید بفرستم داخل لیست یوتایل سورت اما نمیخوام این مدللی بفرستمش باید دستی بفرستمش و یه خورده شلخته است میخوام بدمش به لیست یوتیلیتی که خودش این کار رو برای من انجام بدهاین کامپریتور اولمه میارمش بیرونمتغیر سی یک رو بیرون نوشتم الان دو تا متغیر سی یک و سی دو رو دارم اللان بیام و بگم بر اساس سی یک و بر اساس سی دوخب الان باید چیکارش کنم ؟اوللا باید برم داخل سورتبجای یه کامپریتور دو تا کامپریتور بگیرماولی رو بگیرم سی یک و دومی سی دو بعد اینجا خودم بیام وبگم ریجستر کنم و یه سری کار ها انجام بدم که اگه سی یک نتونست انجام بده و مساوی بودن از سی دو استفاده کنه چطوری ؟ باید برم کمپریتورم رو تغییرش بدم یکمی بیام بگم کمپریتور استودنت یک رو بگیر استودنت دو رو هم بگیر یه کامپریتور دومی رو هم بگیر این از خودشه ها گفتم از خودت دوباره بگیرزنجیره وار میکنه و میره داخل هم دیگه خب داخل یوتیلیتی هممیگم بیبا کمپریر کن اییتم ای رو با ایتم جی اگر نتونستی از سی دو استفاده کن حالا سی دو چیهاین ها رو هم جدیدیش کنم چون الان فیلد سومی رو هم دارننو برای این یکی هم باز بگم سی دو حالا برم ای دیش رو بیارم و بگم ریتورن کناین شکلیکامپریتور دوم هیچ کاری برای من انجام نمیده در واقعحالا میام اینجا میگم اگر این ها با هم برابر بودنسی یک و سی دو رو با هم کمپپیر کن و قسمت سومش رو نال میکنیم این دیگه تهشه اگهگ بخوام بگم از این بیشتر نرو بهش نال میدم بعد میتونم بیام شرط بذارم اگه نال نیست یه کمپریتور بعدی هم برای این وجود داره بیا بر اساس اون کامپریتوره عمل کن حالا دیگه میتونم زنجیره وار مشخص کنمخب این شد سی یک و اون یکی هم شد سی دوالبته که این کلی مشکلات داره و اون اصول و اساسی که همیشه داشتیم رو نداره اما خب یه خورده جلو تر بریم بهترش میکنیم این الان این کار ها رو اننجام میده میتونستم این کار ها رو هم انجام ندممیتونیم این طوری هم درستش کنیم برای کمپریتور اولیه یه شرط گذاشتم گفتم اگه مساوی مساوی همدیگه ان از کمپریتور سی دو استفاده کن اس یکی ای دی اس دو ای دیالالن هم یه متغیر سی سه درست کردم و گفتم اگه بر اساس ای دی با هم برابر بودن بریم سراغ متغیر سی دو و مثلا اوریج رو مقایسه کنیم و اگر بر این اساس هم اوکی و برابر بودن میریم سراغ متیغر سومی که میتونه هر چیزی باشه .البته یه روش بهتر و سخت تر هم هست که حالا بعدا درباره اش با هم حر ف میزنیم مثل همون چیزی که بهش اشاره داشتیم اما یه سری کمبود ها داره و کامل نمیشهخب حالا من دو تاش رو گذاشتم و کاری بهش نداریم از این بیشتر این الان دو تا  سوال حلل شد یکی اسکیژولل تایمر بود یه جوری تغییر ش دادیم هر کدام از تسک ها خودشون ان تسک فینیش داشته باشن و اینم الگوریتم مرتب سازیمون بودیه جوری تغییرش بدیم که این امکان وجود داشته باشه که بر اساس دو تا تا پارامتر مقایسه بشه حالا من چرا اومدم این رو گذاشتم داخل ازا این کمپریتور ها ؟برای اینجا اصن نیازی نیست کمپریتنور براش براش بنویسیم برای اینجا اصلا نیازی نیست این کمپریتوررو برای این نوشتم خواستم اون حالت اولیه رو براتون بگم ولی خب یه مقداری حس کردم براتون سخت باشه اینجا شرط بزار و بگو همین ها رو با هم مقایسه کن ریتورن کن این ها رو با همایعنی نیازی به کمپریتوره ندارم ها همینم جواب میده ولی اون زنجیره واره بخوام انجامش بدم دیگه جواب نمیده خیلی پیچیده اش نکنیم بر اساس یه شرط سومی خب این هم از مرتب سازیبریم سراغ سوال 3سوال سوم .خب یه کار دیگه هم میتونیم انجام بدیم و یه سوال تمرینیمن ناللان این جا از هش مپپ استفاده کردم توی اسکیژولبل تایمر و هر تیکش میاد این کار رو برای من انجام میده و این تسکه رو برای من ران میکنه و اجرا میشه و تمام میشه توی شبیه سازی ها خب من بینیش رو ایننطوری نوشتم نگاه کنین اومدمتوی لحظه دهاز 7 تا ده از ده هیچی نداریم تا بیست بعد از اون طرف از بیست تا بیست و پنج اون گپ بینش خیلی زیاده ولی من میخوا ولی از اون طرف باید منتظر شم یکی یکی این ها رو تمام کنه توی دنیای واقعیمون باید همینطوری باشه یعنی یه برنامه ای باشه که توی یه زمان خاصی باشه توی همون زمان انجام بشهمیخوام یه شبیه ساز بنویسم یه سیسیتمی رو تست کنیم نیازی نداریم که ده ثانیه واقعا وایسیم که ببینیم چی میشه فقط اینو میخوای که توی لحظه ده یه افتاقی بیتفه توی لحظه بیست یه اتفاق دیگه بیفته میخوای تست کنی نمیخوای که واقعا توی این زمان ها واقعی مثلافرض کن ساعت واقعی بیاد فرض کن ساعت سه و سی دقیقه بیاد یکار یکنههمچین چیزی رو الان نمیخوایم ما تو دنیای شبیه سازی شاید بخوایم کار کنیمخب چطوری میتونم این گپ های بینشون رو حذف کنم ؟ و فقط داده هام اجرا بشن چیز دیگه ای اجرا نشه میتونم به جای اینکه از هش مپ ااستفاده کنم ناز اراایه استفاد کنم اما قبلشبعد از اینکه این ها رو ریجستر کردم ااراایه ام رو بیام بر اساس تایم استمپ ها مرتبش کنم و بعد بیام توی هر تیک این ساعتی که میخوره یه دونه از این اجرا شه کامل هر تیکی که خورد بره مستقیم سر ده بعد مستقیم بره ده بعد مستقیم بره بعدی دیگه نیاد تیکه دونه دونه رو بزنه یهو بره دههش مپ رو کامنت میکنیم و ار ری لیست از نوع تسک رو مینت نویسمیبعدش دیگه تو ریجسترم نمنیام تایم استمپ براش بذارم اینم کامنتش میکنممیام میگم تسک دات اد تسک رو ادد کن هیمن دیگه تایم استمپش رو نمیذارم اما وقتی میخوام اجراش کنم قبلش میام دیگه به صورت تایمر هم نیمخواد براش در نظر بیگریم بگیم به صورت حالا یه تایمری باشه دیگه این طوری نمیخوامحالا میتونیم تایمر هم بذاریم و هر کدام از اون تیکه هاش زمان رو داشته باشه میام از لیست یوتایل استفاده میکنم میتونیم از اون چیزی که تو خود جاوا هست استفاده کنیم و اما چون ما ارری لیستس رو نمیتونیم بپذریم نمیتونمن از این استفاده کنم پس من این رو فعلا بر میدارم از کالکشن سورت استفاده میکنم که داخل خود جاواست یه خورده دیگه بریم جلو تر سورت ارری لیست رو هم انجام میدیم میگم تسک ها رو بیا مرتب کن بر اساس این کمپریتور   ولی این جا سه تا میگیره من باید سه تا بنویسم سه تا خروجی داره اینته مثل خودمون بولین نیست میگگم اگه او یک دات گت تایم استمپ چیز کوچیک تر پیدا شد ریتورن کن یک روبعد میگم الس ایفاین رو برعکسش میکنم و این رو هم منفی یک میدممیگم یه بار مرتبش کن بعد بیا اسکیژول کن این تایمره رو  خب حالا توی هر تیکش دیگه من نمیام از این شرط ها بذارم این شرط ها رو بر میدار همشان رومیام یه شرط دیگه میذارم قبلی هارو همه کامنت میکنم خیلی راحت میگم تسک دات گت کلاکدات ران ودات گت تسک فینیشش و گت هندلر کلاکاین دیگه اون گپ هاش رو نشان نمیده هر کلاکش یه دونه تسک رو میخونه اون تسکه تایم استمپ هاش فرق داره دیگه هر کلاکش یه دونه تسک رو میخونه اون تسک تایم استمپ هاش فرق داره اما این کلاکه رو دیگ داره برای من اشتباه نشان میده کلاک واقعی اونی که من اینجا خودم تعریف کردم برا اینکه این رو درست بهم نشون بده این رو اینطوری مینویسم میگم این برابر باحالا این جا ارور چرا داد ؟چون میگه کلاک اصن نداره من باید شرط بذارم اگر تسک دات کنتین اگه این رو دارهاگه کلاک کوچیک تر از دات سایزه بیا کلی این کار ها رو انجام بده در غیر این صورت ساعته رو هم کنسل کنه خب ببین چقدر جالبه دیگه گپ های زمانی رو نشان نده   دیگه مستقیم میره سر کلاکش   کلاک پنجمی باید اجرا شه دهمی باید اجرا شه و . .</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Fri, 25 Feb 2022 18:17:29 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه سیزدهم &gt;&gt;ادامه ioc3 این قسمت حلقه فور ایچ و جزیئات..</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D8%B3%DB%8C%D8%B2%D8%AF%D9%87%D9%85-xkxygzbuzhso</link>
                <description>اگه کلاسمون ابسترکت باشه خب نمیشه ازش نمونه بسازیم از اون طرف هم اگه پرایویت کنیم سازنده اش رو بازم نمیشه ازش نمونه بسازیم فرقش چیه ؟ببینید اگر من یه دونه کلاس رو ابسترکتش کنمچند تا فیلد خیلی ساده براش میگذاریم و نمیخوایم کسی از این نمونه بسازهدو تا راه دارم یکی اینکه ابسترکتش کنماگه ابسترکتش کنم و بعد در مین بنویسمکلاس تست را و بخواهم نمونه سازی اش کنم نمیذاره ! و اجازه نمیده که من از تست نمونه بسازم . خب این از ابسترکت !بریم و ببینیم اگه سازنده رو پرایویت کنیم چه اتفاقی می افتداروری که اینجا میده میگه تو نمیتونی ازش نمونه بسازیاما قبلیه که مال ابسترکت بود میگه اصلا نمیتونی ازش نمونه بسازیاما این میگه تو اجازه نمونه ساختن رو نداری اما میشه ازش نمونه ساخت حالا چطوری ازش میشه نمونه ساخت ؟داخل خود کلاسه میشه ازش نمونه بسازم و اتفاقا یکی از الگو های طراحی خهیلی مهم به اسم سینگلتون که هرچند یه سری مشکلات رو داره یه سری مزایا هم داره توی مباحث پیشرفته تر میتونید درباره اش بخونید اگرم وقت بشه شایدم یه اشاره ای بهش داشته باشیم سینگلتون به این معنی هست که تو یه دونه کلاس فقط یه دونه نمونه ازش بسازی اما توی همه جا بتونی بهش دسترسی داشته باشی تو خیلی از جا های مختلف اونی که ما میامدیم کلاس ناشناسی میساختیم اصن کلا یک بار مصرف بود یک بار ازش نمونه می ساختیم استفاده میکردیم تمام میشد .اما این اینطوری نیست از اون کلاسه یک بار نمونه می سازه و هر موقع هر کسی ازش نمونه بخواد همون نمونه رو بهش میده میگه قبلا یکی این نمنونه رو ساختهچطوری؟میام مثلا همچین چیزی مینویسم : متد اینستنس رو مینویسم و داخلش میایم میگیم ریترون کن : قبلشم یه فیلد از نوع خودش میسازیم (فیلد تست را ساختیم ) میگیم اگر تست برابر است با نال ازش یه نمونه بساز و بگو تست مساوی است با نیو تست اگر نال باشه یه دونه ازش میسازه و تمام دیگه هیچ وقت ازش نمیسازه و بعد میگه تست رو پس بدهحالا هیچ کسی حق نداره از تست نمونه بسازه اما تو میتونی یه همچین کدی بنویسی(متغیر تستی که تعریف کردیم به همراه متد اینستنس باید هر دو استاتیک باشه چون نمیتونیم )در اینجا هر چند t  که بخوایم ایجاد کنیم هرچند تا هم ایجاد کنیم باز همان یه دانه رو بهمان میده این بهش میگن الگوی سینگلتون و خیلی کاربرد های مختلفی داره ولی و یه سری مشکلات هم البته داره حالا ما کاری به این هاش نداریم اما برای جواب به سوال دوستتتون خواستم این رو بگمفرق اینکه سازنده رو پرایویت کنی با اینکه ابسترکتش کنی اینه که اگر پرایویت کنی به این معنی هست که خارج از کلاس کسی حق نداره ازش نمونه بسازه اما داخل میتونی ازش بسازی اما اگه ابسترکت باشه هیچ کسی دیگه ای حق نداره ازش نمونه بسازه علاوه بر اون ما توی کلاس های ابسترکت یه سری قوانین تعریف میکنیم دیگهزیر مجموعه ها صدرصد مجبور باشن به این که حتما این رو پیاده سازیش کننخب این فرق این دو تا بود و تمام . یه دونه ازش نمونه میسازه میفرسته بیرون. دیگه هیچ وقتت ازش نمونه نمی سازه .کد هایی که ما می نویسیم به ترتیب دارن اجرا میشنو هزار تا کلاس هم با هم درخواستش بدن فرقی ندارهیه دونه ازش ساخته میشه اولی که ساخته شده دیگه تمامه یه دونه ازش نمونه می سازه و تمامهاما اگه منظورتون مالتی ترد هستش اونجا از یه سری کارای سینس کردن و بلاک سینکرونایز و از این جور چیز ها استفاده میکنیم .یه بلاکی داریم به اسم سیکرونایزیه همچین بلاکی داریم برای این کار ها ازش استفاده میشه یه خورده مباحث پیشرفته است مربوط به مالتی ترد هستش و به درد مباحث پیشرفته میخورده اگر برنامه نویسی مالتی ترد رو بخواین انجام بدین اونجا ازش استفاده میکنین و خیلی جا ها مثلا تو خود جاوا هم خیلی جا ها ازش استفاده میشه مثلا همین ارری لیسته بزارین یه جا بهتون نشونش بدمخب بگذریم امروز میخوام یه چیز خیلی خیلی جالب بهتون بگم خیلی با دقت گوش بدین از اینترفیس های خود جاوا میخواهیم استفاده کنیم به همین خاطر یه خورده دقتتون بیشتر باشه با دقت بیبشتری گوش کنین که مطالب براتون جا ببیفته هرجا سوال داشتین از من بپرسید خب ببینید من جلسه قبلیخب کلاس تست رو برمیگردونیم به همون چیزی که بوداز این :به اینو تست رو به اینترفیس تغییر دادیمتو جلسات قبلی در مورد خب سورت کردن و این جور چیز ها حرف زدیم و اومدم و اون ارری لیست دات سورت خود جاوا رو بهتون گفتم و امروز میخوایم با یه مدل جدیدی از حلقه ها کار کنیم به اسم حلقه فور ایچخب یعنی چی حلقه فور ایچ ؟ببینید قبلا ما این کار رو میکردیم که این یه استودنته که من استودنت ها رو اضافه کردم و لیست درس هم براش گذاشتمدر کلاس استودنت یه سری چیز ها رو حذف میکنیممن یه لیست درس هم براش گذاشتمحالا میگم چیه یه دانشجویه یه سری ویژگی ها داره لیستی از درس ها رو هم داره حالا من اینجا اومدم برای هر دانشجو از درس های تصادفی که یک دانشجو مکنه 4 تا باشه دیگری 14 تا باشه خلاصه که تصادفیه و این درسا رو هم اینطروی گذاشتم با نمره هایتصادفیخب حالا کاری به اینش نداریم من میخوام الان دانشجو ها رو اینجا وارد کردم حالا میخوام تو این دانشجو ها یه سری حلقه بزنم و یه سری کار ها باهاشون انجام بدم و معدلشون رو باهاشون جمع کنم ضرب کنم میخوام به معدل هر دانشجو مثلا دو نمره اضافه کنمحللقه رو میزنم و ای مساوی با صفر میکنم و سایز دانشجو هام یعنی استودنت 3 و ای پلاس پلاساین چیزی بود که کلاسیک قبلا انجام میدادیم بعد خب من دو تا کار میتونم انجام بدم اولین کار اینه هکه منبه این صورت بنویسمش الان یه خورده سخته دیگه هی هر بار باید بنیوسیم استدنت 3 دات گت اوریج و .. .بتره یک کار دگیه انجام بدم بیام یه متغیر تعریف کنم بگم کاستودنت 3 گت ای رو بریزم داخل استدونت اس مان و بعد برای بقیه شون خیلی ساده بزنم اس دیگه خیلی مرتب تر و منظم تر ممکنه ده ججای دیگه پایین تر هم نیاز داشته باشمخب الان من چهار بار ازش استفاده کردم اگه از قبلی ها میخواستم استفاده کنم خیلی بی نظم و طولانی می شد خسته کننده بود و خوانایی برنامه رو میاورد پایین این کاری که میخوایم انجام بدیم فقط برای راحتی کار هست ن اینکه بگی سرعتی رو بالا میبره و . . .ن هیچی نیست هیچ فرقی نداره چه اینجوری بنویسیش چه اون قبللیه یکی هستتخب حالا بعد از اینکه من این رو نوشتم بازم انگار یه خورده شلوغ تره میتونم یه کار دیگه انجام بدم این رو جاوا این امکان رو به من میده میگه مگه تو نمیخوای این کار رو انجام بدی ( منظورش تعریف اس و قرار دادن استودنت 3 در اون هستش )خب این کار رو انجام ندهاین شمارش رو اصن حذف کنم یگگه این استودنت تعریفت رو ببر داخل پرانتزو این رو حذف کنبجای مساویه یه دونه دو نقطه بذارببینید چقدر جمع و جور شد ! خب اون شمارش ها کجا انجام میده؟ خودش داره انجام میده خودش کیه ؟ارری لیست بالا به کمک فوره داره اننجامش میدهیعنی فوره به کمک این ارری لیسته داره انجامش میده اما چطوری این کار رو انجام مید هداخل این فور چی داره که میتونه بیاد این ارری لیست رو این کار ها رو باهاش انجام بده این اللان چه اتفافقی میفتهاین به  این معنیه که یکی یکی هرچی استودنت تو ارری للیستت هست به ترتیب بذار تو اس بعد بیا این کار ها رو باهاش انجام بده و بعد برو ببالادومی رو بزار داخل اس و این کار ها رو باهاش انجام بده بعد برو بالا دوباره و دوباره و دوباره و همینطور تا اخر میگه این کار ها رو بیا انجام بدهاین حلقه از اینترفیس استفاده میکنه یادتونه بهتون گفتم که ما از اینترفیس ها برای ایجاد گذرگاه عمومی و با در نظر گرفتن یه سری قوانین داخل سورتمون بود دیگه میگفتیم دیگه همه میتونن وارد این سیستم بشن وارد این ابزار بشن اما در صورتی که قانون مان رو رعایت کرده باشن ران داشته باشنو یا مثلا برای مرتب سازی فرض کن کمپیر داشته باشن یا کمپریتور داشته باشن که بفرستی تو به عنوان یه ابزار جداالان برای حلقه فور از این استفاده شده داخل جاوا امده اند اومدن گفته اندداخل این حلقه فوریه اینترفیس داریم به اسم ایتریبل به عنوان گذرگاه عمومیشه داخل ایتریبل یه فیلدی وجود داره به اسم ایتریتور که اونم یه اینترفیسهاگر من ایتریبل رو بنویسماون قسمت اسدونت 3 ایتریبل رو داره به عنوان گذرگاه عمومیشوقتی واردش میشی یه چیزی داره به اسم ایترتور که اونم یه اینترفیسه یه سری چیز های دیگه هم داره فور ایچ وو . . که برای کار های پردازش موازی و این جور چیز هاست که ما کاری بهش نداریماینش برامون مهمه که از اینش داره اسفتاده میکنهاین ایتریتوره یه اینترفیسه که اگر بریم داخلش دو تامتد اصلی داره یکی هز نکست و دیگری نکست و بالای هز نکست هم یکی هست که مربوط به مبحث جنریک ها هست حالا بعدا بهش میرسیم ولی فعلا این دو تاش خیلی برای ما مهمه یه سری چیز های دیگه مثل ریمو و . . . داره که ما کاری بهشومن نداریماون استثنا هایی هم که گفتیم اینترفیس های جاوا داره یکیش این دیفالته ها ما اینترفیس هامون پیاده سازی ندارن اما این اینترفیسش دیفالتی داره این فرق داره با اون چیزی که ما صحبتش رو میکردیم تو اینترفیس های کلاسیک همچین چیزی وجود نداره حالا ما فرض میکنیم از نوع کلاسیکه است خباین دو تاش برامون مهمه یک ایتریبل داریم ک گذرگاه اصلی حلقه فورمونه و یه دونه ایتریتور داریم که داخل ایتریبلله و و یه متده متد ایتریتورخب حلقه فور این کار هایی که من انجام میدم رو انجام میده میگه :یه ایتریتور تعریف میکنم از نوع استودنت اسمش رو میذارم ای تی ار از اون جایی که ارری للیستم ایتریبله خودش هر کسی وارد این فور ایچ بشهباید ایتریبل باشهاگه این ارری لیست رو نگاه کنم میبینم از ابسترکت لیست ارث برد هاگه اون رو باز کنم میبینم از ابسترکت کالکشن ارث برد هاگه برم داخشاینترفیس کالکشن رو امده ایمپلمنت کردهو وقتی اون رو هم باز کنیمایتریبل رو میبینم همان ایتریبلی که بهتون گفتم خب پس سلسه مراتبش کاملا درستهپس من یه ایتریبل میپذیرمو ایتریتورش رو میگیرم این حلقه فور این کار خط 79 رو برای من انجام میده   بعدش میگه این ایتریتور دو تا متد داره هز نکست که داخل ارری لیست پیاده سازی شده اند و نکست چیکار مکینن اینا ؟اگر من بیام بنویسم اس یک مساوی با ای تی ار دات نکستو چند بار این رو کپی پیستش کنمهر بار این نکست صدا زده میشه یه استودنت میگیرهخب بذار این ها رو من پاک کنم این ها چیز های اضافه فاندالان ببینید داخل استودنت چی دارهزهرا صفر احمدی صفر دوازده نود سه و بعد هم زهرای یک احمدی یک و دو و سه تا الی اخرالان هر موقع این نکست صدا زده میشه یکی از اون زهرا ها میاد زهرای صفر احمدی صفر هر موقع نکست رو میزنی خودش یکی رو میشماره داخل این ایتوریتورارری لیست خودش این کار رو انجام میدهخب میتونیم از یه حلقه وایل استفاده کنیم براش تا کجا تا زمانی که به تهتش برسه که باید داخل پرانتز وایل از هز نکست استفاده کنیمبیا یکی یکی استودنت ها رو بردار تا زمانی که بعدی ای وجود دارهاین هز نکست هم داخل همون ایتریتوره که داخل استودنته در واقع پیاده سازی شده اند و تو میتونی همینن کدت رو الان ادامه اش رو بنویسیاما در واقع این آمده فشرده اش کرده تو این خط کد :یعنی خط 89 برابر است با این قسمت :دیگه خودش میاد این هز نکست رو صدا میزنه و نکست و این جور چیز ها رو مثلا من خودم میتونم الان یه حلقه فور بنویسم میتونم یه حلقه فورایچ بنویسم که که بیاد این کار ها رو برای من راحت تر انجام بدهخیلی لازم نیست که ما این کار ها رو انجام بدیم فقط میگم میتونی بنویسی فقط میخوام بهتون بگگم چطوری میشه نوشت البته خب ما کلمه کلیدی نداریم براش من مجبورم بیام از کلاس براش استفاده کنم میام یه دانه کلاس براش میذارمبه اسم رازی فورمیخوام حلقه فور ایچی که داخل جاوا هست رو شبیه سازی کنمطوری ک این چیزا رو داخل لخودش انجام بده و مخفی باشن ححلقه فور چی میگیرفت ؟ ایتریبل ها رو میگرفت من هم میام همین کار رو انجام میدم میام یه متد استاتیک براش میذارم و اسمش رو میذارم فور ایچو ورودیش رو ایتریبل میذارمفرض کنیم که برای استودنت هاست چون منچون هنوز جنریک ها رو بهتون نگفتمف نمی تونیم عمومی تعریفش کنیمفرض میکنیم برای استودنت هاست میگیم ایتریبلخب این برای قسمت های اینجاشاما بدنه اش رو چطوری من تعریف کنم ؟ بدنش چیه؟ یه کاره دیگه کار رو چطوری میفرستادیم داخل یه دونه کلاسیه اینترفیس براش میذاریممیام اینجا و یه اینترفیس براش میذارم به اسم فورتسکداخلش هم میذارم وید ران و چون جنریک بلد نیستیم ورودیش رو همان استودنت در نظر میگیرمبعد میام داخل رازی فور میگم این ایتریبل رو بگیرحالا میام این کدی که اینججا نوشته بودمهمه این ها رو میارم داخل :و این هم میذارم ایتریبل که میدانیم ایتریبل ها همه ایتریتوتر دارنو بعد که همه این کار ها رو انجام داد فور تسک رو صدا بزن و دات ران رو انجام بده و اس رو بهش بده این میشه حلقه فورمونچطور ازش استفاده میکنم ؟ میگم رازی فور دات فور ایچ استودنت 3 رو بهش میدم میشه بدنه بدنه حلقه فورم ون رو باید اینطوری بذارمالان این انگار دقیقااین دو تا دقیقا کار مثل هم رو انجام میدن بالایی رو ما خودمون شبیه سازی کردیم که مث پایینی کار کنهیه ارور داشت که بخاطر اکسپشن هستش و وقتی اکسپشن رو برداشتیم اوکی شدخب این از این جنبه اشاینکه ایتریتوترشون چطوری کار میکنه رو میگم بهتونخب این ایتریتورش رو میگیره و داخلش انجام میشه و از طریق این کد هز نکست و نکست میتونم بررسی کنم که به اون تعداد دانشجو هام رسیدم یا ن اگر نرسیدم خب یکی یکی میام جلو خب این حالت ساده اش بودخب برای بدنه حلقه ام هم از یک کار استفاده میکنماین یک کاره که فرستاده شده داخل ولی خب من نمیتونم این مدلی بلاک بزارم و مثلا سینتکس جدید تعریف کنم این تو خود جاوا اینطوری نوشته شدهمن برای اینکه این رو شبیه سازی کنمن از یه اینترفیس استفاده کردم گگفتم یه تسکی رو میخوام بفرستم داخلخب تسکه رو اومدم از طریق فور تسک که همان اینتترفیس قبلیه است که اسمش عوض شدهیه متد ران داره که استودنت میده که میاد داخل ران ر و صدا میزنه و استودنت رو بهش میدهحالا اینجا هر موقع همچین کدی نوشته بشه هر بار داخل این حلقهیک دانشججو جدید پیدا شه متد ران صدا زده میشه متد ران کدامه ؟اینپس این به ازاری تمام آیتم ها صدا زده میشه تا زمانی که شرطه نقض بشه وقتی که شرطه نقض بشه دیگه استودنتی وجود نداره و دیگه رانی صدا زده نمیشهپس هر دفعه که ران رو صدا میزنهمیاد داخل این و کد رو برام اجرا مکنه دقیقا مثل حلقه فور ایچ داره عمل میکنه برای منخب ما که نمنیخوایم بیایم و این کار رو انجام بدیم واقعا این برای یادگیریمون بود که بدونیم فورئه چکار میکنهمن برعکسش به دردم میخوره یعنی چی ؟یعنی اینکه من بتونم کلاس هایی که خودم تعریف میکنم رو بدم به فور ایچ و این کار ها رو برای من روشون انجام بدهمثلا کد اینجا که داره دانشجو ها رو برای من اضافه مکنه و برای هر دانشجو هم داره یه سری درس اضافه میکنه من میخوام یه همچین کدی بنویسم بگم مثلا کورس داخل یه دونه دانشحو هامثلا دانشججو رو بیارم بیرون بگم مثلا فقط رو اون دانشجو چهارمیه میخوام انجام بدم بیا برای من لیست درس هاش رو بیار و نمره اش رو اضافه کن و بعد دو نمره به درس هاش رو هم اضافه کن و بعد مثلا سی رو چاپ کنالان این ارور بهم میده میگه استودنتتت ایتریبل نیستمیگه استودنتتت ایتریبل نیست و فور ایچ نمیتونه روش عمل لکنه که فور بیاد به صورت فور ایچ روش حلقه بزنه و این کار ها رو باهاش انجام بدیمحالا درس چیه ؟ درسم اینطوریهلیستی از درس ها اینجا تعریف کردم گتر و ستر براش نذاشتم چون نمیخوام کسی از بیرون بهش دسترسی داشته باشه به صورت مسقیم به همین خاطر متد براش نذاشتم و یه دونه متد ادد براش گذاشتمو حالا میخوام بیام بگم دانشجو ی چهارم همه درس هاش رو بیا برای من حلقه بزن دیگه نمیخوام بگم بیا درس هاش رو بگیربعد ارری لیسته دیگه میتونم رو درس هاش فور ایچ بزنم اما من نمیخواام دسترسی مستقیم داشته باشه چون من بهتون یه حالت خیلی پیشرفت ترش هم نشون میدم پس چیکارش کنم؟باید بیام و استودنت رو ایتریبل کنم چطوری؟ خیلیل ساده مینویسی ایتریبل از نوع درسمیه باید قوانینش رو رعایت کنی قوانینش چیه؟این سه تاست که اون دو تای پایینیش رو من کاری ندارماین ایتریتورش برای ما مهمه حلقه فور با این داره کار میکنهخب این چی میخواد؟ یه ایتریتور از نوع درس میخواد من این رو ندارم باید به عنوان یه فیلد بیام براش تعریف کنممیام مینویسم پرایویت و ایترتور و خب باید ناشناسی براش تعریف کنم و یه کلاس ناشناس براش میزنم دو تا متد توشه این دو تا متد رو من باید پیاده سازی کنمیکیش میگه ایا بعدی وجود داره و یکیش هم میگه بعدی رو بهم بده خب برای اینکه بدانم بعدی وجود داره باید با سایز درس مقایسه کنم پس من به یه شمارنده نیاز دارم میام اینجا و مینویسم سی مساوی با صفرو میگم اگر سی کوچیک تر از لیست درسام هست برش گردانو نکستم هم میشه :به همین سادگی این میشه ایتریتورم حالا این ایتریتور رو باید بیام اینجا پسش بدم و بگم این ایتریتورمه و سی رو قبلش باید صفر کنم دیگهچون هر دفعه میخواد ایتریتور رو بزنه من میخوام از اول شروع کنه خب الان این ایتریتور رو بهم میده همینالان اگه بیام اینجا و این رو نگاه کنم میبینم ارورش رفع شده در صورتی که قبلا.ارور داشت اما الان ارورش رفع شده ببینیم واقعا کار میکنهخب ببینید اینجا الان میخاد حلقه بزنه رو درس هایی که روی دانشجو وجود داره درس هاش چین ؟هشت تا درس داره مت صفر تتا مت هفت خب به هر کدامشان میخواد دو نمره اضافه کنه الان سی شد چی ؟ مت صفر دقیقا داره همون چیزی که من میخواستم رو انجام میده میگه به گریدش دو تا اضافه کنخب این الان شده 13 و چاپش هم میکنیم اینجا میبینم که داره چاپش میکنه من دارم رو خود استودنت حلقه میزنم اما درس ها رو دارم چاپ میکنم چرا ؟ چون ایتریتورم رو درس ها تنظیم شده پس حلقه فور ایچم میاد رو درس ها عمل لمیکنهو میاد همه هشت تا درس رو برای من بهشون دو نمره اضفه کرد و چاپ کرد ببینید چقدر کد های جالب و حرفه ای میشه تعریف کردخیلی کد های جالب و حرفه ای با این سبک برنامه نویسی حرفه ای میش ه تعریف کرد خیلی کد نویسیتون رو حرفه ای میکن ه اصن استانداردش میکنهچقدر ساده است الان میتونی تو خیلی جا ها ازش استفاده کنیدو تا حلقه فور ایچ بزنی که یکی رو همه دانشجو ها باشه و داخلی هم برای درس های دانشجو باشهبه این صورت ببینید توی دو خط کد خیلی ساده اول میایم اساسا کارمون رو انجام میدیم بعدش میایم راحت ازش استفاده میکنیم قدرت ای او سی ها اینه ها وقتی میگم اینترفیس ها یکی از زیبا ترین و قدرمتند ترین ابزار های شی گرایی هستن به خاطر همچین کار هاییهمثلا برای آرایه های دو بعدی عالیه مثلا فرض کن من الان دو تا حلقه نوشتم من میخوام همه لیستت تمام دانشجو ها رو بیام و چاپ کنم تمام دانشجو هایی که وجود دارن لیستشون رو میخوام چاپ کنم از یه ارری لیست اختصاصی استفاده میکنم یه ارری لیست حرفه ای تر استفاده میکنم از این ارری لیست خود جاوا استفاده نمیکنم چطوری ؟مثلا میام این کار رو انجام میدممثلا میخوام حلقه اش کنم مثلا با یک حلقه همه درس ها رو برای من بیاد و سرچ بزنهمیام و کلاس رازی ارری لیست رو ایجاد میکنمو اکستندش میکنم از نوع ارری لیست خود جاوا چون جنریک بلد نیستیم اون رو استودنت در نظر میگیریمدو تا متد  داخلش بود یکی ایتریتورش بودمن این رو میخوام اور راید کنمنمیخوام این ایتریتور رو پس بده میام اینجا خودم ایتریتور اختصاصی تعریف میکنم برای استودنت هام بعدش میگم استودنت ایتریتور مثلا و پیاده سازیش هم میکنمچیکارش باید بکنم؟باید هز نکست داشته باشم و از اون طرف دیگه این رو پس نمیدم ب  جای اینکه این رو پس بدم ایتریتور خودمون رو پس میدیمحالا اینجا باید چیکار کنه باید تمام دانشجو هایی که داخلش هست رو ببینه ایا دانشجویی هست اگه دانشجویی هست ببینه اون دانشجو درسی داره یا ن از اون جایی که استودنتمون ایتریبلهکارمون یه خورده ساده است اگه دانشجویی هست ببینه اون دانشجو درسی داره یا ن از اونجایی که استودنتمون ایتریبله کارمون یه خورده ساده است چون هز نکست و اینا رو داره دیگهمثلا من خیلی راحت میتونم بیام اینجا دو تا شرط بزارم بگم اگر لیست آیتم هاشمیتونم از ایترتورش هم استفاده کنم بزار از ایترتور خودش استفاده کنمبگم ایا خود این هز نکستی داره یا ن اگر این هز نکست داره بعد بیاد داخل ریتورن کن استودنتی که حالا این داره بگم ایتریتوردات نکستاول میگم ایتروتور این ارری لیسته بعدی داره ؟ میگه اره میگم اگه بعدی داره بیا ببین اون بعدیش درس بعدی داره ؟ن بذار که من دستی درستش کنم اینجوری انجامش بدیم اشتباه میشه من یه شمارنده براش تعریف میکنم به اسم سیو کاری به این نداریم و اول میگیم سی کوچیکتر از سایزه از سایز این ارری لیست هم کوچیکتره بعدش بیام بگم گت کن سی پلاس پلاس دات ایتریتور دات هز نکستیه همچین کدی می نویسماگر طولش طول این آیتم ها از سایز ارری لیستم کمتر ه خب قابل قببوله پس حالا بیا چیکار کن ؟ ببین درسی داره یا ن اگه درسی هنوز براش مونده ترو پس د بده در غیر این صورت فالس باید پس بدهاما اگه خوب درسی براش وجود داشته باشه باید بیاد نکست بزنه برای اون درسهالبته این سی پلاس پلاس ندارهقسمت نال سی پالاس پللاس دارهو نکست میزنیماز نوع استودنته ایتریتورش از نوع درسه ولی این اشتباه میشه نمیذاره این کار رو انجام بدیمباید خودمون تعریفش کنیمهمه رو به نوع درس تغییر دادیمبزارید ببینم میشه جدا بنویسمش اینو از نوع درس مینویسماره میذارهمیگه با هم تداخل دارن و نمی ذارهحالا من میخواستم تو این انجامش بدیم ولی یه خورده اذیت میکنه اگر من این رواینطوری بذارم :توی ارری لیست خودمون انجامش میدیم باید خودمون یک ارری لیست بنویسیم و در واقع بیایم و این رو پیاده سازی کنیمبجای اینکه ارری لیست رو پیاده سازی کنیم باید اینرو پیاده سازی کنیمولی جزییات اون زیاده نمیخوام در گیر اون بشیم از این ارری لیست خودمون استفاده میکنیم .استودنت ارری لیستمیام از این استفاده میکنم فرقی نداره درستش اینه که بیایم ابسترکته رو پیاده سازی کنیم ولی اون ارری لیسته یه خورده جزیاتش زیاده نمینخهوام درگیر اون بشین پس اینجا مینویسمشمینویسم ایتریبل از نوع درسو پیاده سازی این سه تاو این رو هم میذاریم برای ایتریتورشو سی اش رو هم صفر میکینم همین این الان درسته دیگه الان یه هز نکست داره یه گت داریم یه ایتریتور و هز نکست این الان میاد و همه رو میگردهفرض کنید الان میخوام از اریی لیست خودم استفاده کنم میگم استوتدنت ارری لیست مثلا فرض کنید یه سری داده هم توشه حالا کاری به این نداریم من الان میتونم بیام بگم درس دو نقطه توی این استودنت ارری لیستو این الان دیگه کار میکنه و لیست تمام درس های تمام دانشجو ها رو برای من میاد در نظر میگیره  توی یه حلقه نوشتمش بجای اینکه توی دو تا حلقه بنویسمش توی یک حلقه نوشتمشاگه بخوایم واقعا ارری لیست واقعی باشه باید بیایم به جای اینکه این رواز ارری لیست ارث بری کنیم میایم از ابسترکت لیست ارث بریش میکنیم اما توی ابسترکت لیست یه سری متد پیاده سازی نشده هست که باید بیایم اونا رو هم پیاده سازی کنیم که من نمی خوام درگیر اون بشیم</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Fri, 25 Feb 2022 00:35:45 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه دوازدهم &gt;&gt;ادامه مبحث اینترفیس ها</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D8%AF%D9%88%D8%A7%D8%B2%D8%AF%D9%87%D9%85-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D9%85%D8%A8%D8%AD%D8%AB-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%81%DB%8C%D8%B3-%D9%87%D8%A7-tocj4sl3trtg</link>
                <description>پاسخ به چند سوال :سوال اول : اگر من یه اینترفیسی داشته باشم ارث بری بینشون اصن چه نیازی هست ، میتونم بین اینترفیس ها ارث بری انجام بدم بین کلاس ها و اینترفیس ها ایمپلمنت انجام بدم چرا من نیاز دارم بین اینترفیس هام ارث بری انجام بدم ؟دقیقا به همان دلیلی که بین کلاس هاتون ارث بری انجام میدین چرا میاین بین کال تسک و تسک ارث بری انجام میدین ؟ خب این تسکه یه مرحله عمومی تره دیگه شما میتونین این رو در نظ بگیرینو از این گذرگاه عمومی توی کلاس هاتون استفاده کنین و مجموعه ای از تسک های مختلف زیرمجموعه هاش رو بفرستین داخل برای اینترفیس هاتونم یه همچین چیزی هست اما خب ن به این معنی که من مثلا اینترفیس های مختلفی رو بفرستم داخل نبیشتر با این دید در نظر گرفته میشه که من میتونم یه اینترفیس عمومی تر داشته باشم که زیر مجموعه اش اینترفیس های جزیی تری داشته باشم که هر کدوم از اون ها دارن اون اینترفیس رده بالا تره رو در واقع اکستندش میکنن یعنی متد هاش رو واسط هاش رو به ارث میبرن .من میگم ایونت هندلر یه واسطیه که یه سری اجرا یه سری قوانین رو از یه واسط دگیه داره به ارث میبره الان من میتونم بیام اینجا بنویسم بگم اکستند کنه فرض کن کمپریتور رو مثلامیتونم این کار رو انجام بدم اکستندش میکنه یعنی چی ؟ایونت هندلره خودش یه واسطیه که یه قانونی توشه اما خود این ایونت هندلره قابل مقایسه هم هست یعنی یه مقایسه کننده هم میتونه باشه ، قوانین مقایسه کننده بودن رو هم میتونه داخل خودش داره به این دلیل دیگه لازم نیست مجددفرض کن اگه متد کمپیر رو اینجا نوشتی دیگه لازم نیست تو ایونت هندلر هم اگه نیازی داری بهش اونو بنویسی   تنها وقتی اینکار رو بکنم دو تا متد هستن توی هر دو تاشونه که دقیقا یک کاری انجام میده اما از هم جدان و به هم ربطی ندارن بعد من بعدا نمیتونم فرض کن یه کلاسیه ایونت هندلر رو ایمپلمنت کرده بفرستم داخل کامپریتورولی الان میتونم کلاس ایونت هندلر رو ایمپلمنت کرده هم بفرستم داخل یک گذرگگاهی که از نوع ایونت هندلره هم میتونم به یکی عمومی تر که کمپریتوره یعنی این قابلیت ها رو برای من دارهمیتونی اکستند کنیاما بین اینترفیس هاست ها بین اینترفیس ها نمیتونی ایمپلمنت کنی اینترفیس هات قابل ایمپملنت نیستندخب این یه نکتهنکته دیگه : اینترفیس هاتون و کلاس هاتون رابطه بین اینترفیس ها و کلاس هاتون مثلا فرض کنین من حالاآمدم استودنت رو ایمپلمنت کردم از نوع کمپریبلسوال بعدی که پرسیده بودین که قسمتی از اون جزوه بود کتاب بود یه متنی نشان دادین گفته بود که من میتونم  یه اینترفیس رو توی یک کلاس انتزاعی به ارث ببر م اما نیازی نیست اصن پیاده سازیش کنم الان به اون هم میرسیم اما این نکته هم اینجا خیلی مهمه اگگر من یک کلاس معممولی داشته باشم ابسترکت نباشه و این جزییات انتزاعی و این جور چیز ها رو نداشته باشیم یک کلاس کاملا معمولی ایمپلمنتش کنم باباید حتما صدرصد متدش رو حتما پیاده سازی کنم در غیر این صورت بهم ارور میده   اما اگه تو یک کلاس انتزاعی باشم مثل شیپ و ایمپلمنت کنم کمپیربل رواگر این رو هم ننویسم بهم ارور نمیده چون خود کلاس شی پیه کلاس انتزاعیه یک کلاس انتزاعی یعنی چی ؟ یعنی متد هایی به صورت اینترفیس مثل ایریا توش بنویسی حالا این داره چی میگه ؟میگه اینپلمنت کن کمپیربل رو خب چون خودش ابسترکته پس هیچ اججباری نمیده که تو حتما باید متد هات بدنه داشته باشن ، پیاده سازی داشته باشن الان این رو در واقع به ارث برده اما کجا به من اجبار میده ؟وقتی میام سیرکل رو اکستند میکنم از شیپالان خود شیپ فقط یه دونه داره به اسم ایریا یه قانون داره به اسم ایریا باید حتما پیاده سازی شه اما یه قانون هم داره از کمپیر بل میگیره که اینجا پیاده سازیش نکرده اگه پیاده سازیش میکردم اینجا داخل سیرکل نیازی نبود دوباره پیاده سازیش کنم دل بخوای بود اگر دوست داشتم میومدم پیاده سازیش میکردم اما اگر این رو اینجا ننویسم الان من یه متد بدون پیاده سازی دارم یعنی یک قانونی دارموقتی میام توی سیرکل میگه ایریا رو نوشتی درستهاما تو باید حتماکمپیر کمپیربل رو هم پیاده سازی کنی داخل خود شیپ این پیاده سازی نشده پس تو باید پیاده سازیش کنی و میاد اینجا پیاده سازیش رو ازت میخواد اینم یه نکته خیلی مهم اما اگر من اینجا پیاده سازیش کنمدیگه دلبخواهیه یه بار حتما باید پیاده سازی شه الان اینجا دل بخواهیه دیگه من اگهگ بخوام توی سابکلاس هام پیاده سازیش میکنم نخواهم هم دیگه به ارث میبرم از شیپ پیاده سازی رو دارم به ارث میبرم هر چند اینجا هم گفتم ایمپپلمنت کن کمپیر بل رونکته سوم اینه که شما توی جاوا یک بار از یک کلاس فقط میتونین ارث ببرینهر کلاس یک بار میتونه از یک کلاس دیگه ارث بری کنه  نمیتونه همزمان بیاد اینجا از شیپ   و کال تسک به صورت همزمان ارث ببر هنمیتونه این کار رو انجام بدهنمیتونی چندین کلاس رو یک جا ارث بری کنی میتونی بیای الان شیپ روبرای سیرکلنمیتونی بگی هم از شیپ ارث ببره هم از کال تسک ارث ببره خودش بهم ارور میده میگه نمیتونی این کار رو انجام بدی  خب اماا من میتونم این کار رو انجام بدم بگم این مثللا از نوع کالل تسک باشهحالا باید سازنده هاش رو یکسان کنیمو بعد سیرکل هم کال تسک رو داره به ارث میبره هم داره شیپ رو به ارث میبره یعنی زنجیره وار میتونی کنار هم نمیتونی به صورت زنجیره وار و سریال گونه میتونه به ارث ببره نمیتونی به صورت موازی کنار همبیای بگی مثلا فرض کن سیرکلت هم داره شیپ رو به ارث میبره هم کال تسک رو به ارث میبره حالا من نمیگگم کال تسک یه چیز بامعنی چرا نمیذاره این کار رو انجام بدی چون اگر شما بیای مث سی پی پی این اجازه رو به شما بدهتوی سی پی پی مجبوره که این اجازه رو بده چون توی سی پیپی یه چیزی جدا به اسم اینترفیس نداره برای تعریف اینترفیس ها باید از کلاس های انتزاعی استفاافده کنی و توی انترفیس ها تو میتونی چند گانه انجام بدی الان میخوام بهتون بگم که چرا میتونی انجام بدی توی کلاس های معمولیتون مثالی که جلسات قبلی هم بهتون گگفتم این بود :فرض کنیم این یک کلاسهتست و من یه متد روش تعریف میکنم  مثلا همین متدی که فرض کن متد مثلا a  هیچ چیزی هم نداره مثلا ورودی هم ندارهمن همین ای رو میارم داخل شیپ میگم شیپم ای رو داره مثلا یه سیستم دات اوت میزنم و میگم شیپپو اون یکی مثلا میام داخل تستمینویسم مثلا تست خب فرض کنیم این کار رو میتونی انجاما بدی بیای داخل لسیرکل بگی این هم شیپ رو به ارث میبره هم تست رو به ارث میبرهفرض کن این کار رو اجازه داری انجام بدی هرچند بهت میگه نمیتونی انجامب دی فرض کن توی سی پی پی هست و الان شدهخب باین کلاس سیرکل خودشم نیامده اون متد ای رو اور راید کنه این متد ای رو اور راید نکردهاین رو ندارهالان باید بیادای تست رو به ارث ببره یا ای شیپ رو به ارث ببرهو اگر من بنویسم سی رکل دات ای بیاد برام چاپ کنه ای و بیاد برام چاپ کنه شیپ این یعنی چی ؟این یعنی ابهام ابهام به وجحود میاره و چون ابهام به وجود میاره دشمن مهندسی ماست و توی جاوا وقتی پیشرفته شد حذفش کردن حالا میگم چرا حذفش کردن پس این تا اینجا الان نمیدونه سیرکل ای شیپ رو باید به ارث ببره یا ای تست رو و این وسط ابهام به وجود میاد و قاطی میکنهخب جاوا اکستند چند گانه رو اجازه نداد اما چرا ایمپلمنت چند گگانه رو اجازه میده ؟ بخاطر اینکه فرض کنین بازم این تستی که اینججا نوشتم اینترفیسهوقتی که اینترفیسه بدنه ای وجود ندارهاینترفیسه و بدنه ای وجود نداره فرض کنیم ایونت هندلر هم ای رو دارهالان این هم ای رو دارهبعد الان میام میگم سیرکل اسکتند نکنه این چیزا روحالا بزاریم شیپ رو اکستند کنه و بعد ایمپمنت کنه ایونت هندلر کاما تست رو این رو اجازه میده بهم  چرا چون من الان موس رو اینجا نگه میدارممیگه یه دونه چیز هست به اسم هندل و یه دونه هم داره به اسم ای خب حالا میام اینجا برای خودم مینویسماس اوت سیرکلحالا اینجا به نظرتون ابهام وجود داره یا ن ببینید توی اینترفیس ایونت هندلر هیچ بدنه ای نداره فقط اسمشهتوی تست اای هیچ بدنه ای نداره فقط اسمشه قبلی بدنه هاشون با هم فرق داشت نمی دونست کدومشون رو به عنوان پیاده سازی اصلی در نظر بگیره امااین دقیقا همینه :کپی اینه  صدرصد همینه پس تو اصن هیچ امکانی نداره فرض کن بدنه اشتباهی براش در نظر بگیری به همین خاطر ابهامی توش وجود نداره وقتی که تو میای میگی اور راید کن ای رو فرقی نداره ای از این داره میاد از اون داره میاد یا از هزار اینترفیس دیگه داره میاد فقط اسمشه بدنه ای نداره که الان بگم کدومشون رو اجرا کنم اسمشه اسمشونم دقیقا یکیه پس من وقتی ایمپلمنت میکنم برای همه اینترفیس هایی که ای رو دارن ایمپللمنت شده پس مشکلی نداریم اما تو سی پی پی خب ما این قابلیت رو نداشتیم و از اون طرف این خیلی قابلیت مهمیه که من بتونم چندین اینترفیس رو ایمپلمنت کنم در واقع تو سی پی پی اینطوری نبود تو سی پی پی من فقط یه کلاس انتزاعی داشتم و باید با کلاس انتزاعیم هم اینترفیس ها رو تعریف میکردم و هم از اون طرف هم کلاس های دیگه ام رومیامدم و تعریف میکردم توی جاوا و سی شارپ اومدن این مشکل رو حل کردن حالا تو سی شارپپ باز یه سری چیز ها هست به طور خاص حرف من جاواست توی جاوا این مشکل رو حل کردنگفتن کلاس های انتزاعی رو  به دو دسته تقسیمش کنید یک سری هاشون بشن انتزاعی محض یه سری هاشون بشن انتزاعی ترکیبی مثلا بیان این شیپی که اینجا هستانتزاعی ترکیبی هستش در واقع میتتونی فیلد توش تعریف کنی میتونی ستر و گتر و این جور چیزا توش تعریف کنی متد هایی که پیاده سازی دارن تعریف کنیو در کنارش هم این رو داری یه متد انتزاعی یه قانون میگه این ها رو داشته باشین توی اسم این ها رو بزاریم کلاس های انتززاعی اما برای انتزاعی های محض اسمش رو عوض کنیم بذاریم اینترفیس و در نهایت اینترفیس به وجود میاد و برای قسمت ابسترکت های محض ما هیچ ابهامی نداریم میتونی ارث بری چند گانه انجام بدیم برای قسمت انتزاعی های ترکیبی ما ابهام داریم چون یه سری متد توشون تعریف شدهممکنه توی اون یکی ها هم تعریف شده باشه و پیاده سازی دارن و نمیدونه کدام پیاده سازی رو بیاد به ارث ببره به همین دلیل جاوا یک مرحله دقیق تر از سی پی پی است سی پی پی بخاطر ارث بری چند گانه اش ابهام داره خب این هم این نکته خب چطوری کلاس های مختلف رو به ارث ببرم و اینا نمیتونی اون چیزی که شما الان پرسیدین ، نمیتونی مثلا یه کلاس داشته باشی که چندین کلاس دیگه هم به ارث ببره مثلا فرض کن اینتطری باشه و هم اونطروی بابشه نمی تونی این کار رو انجام بدی سلسله مراتب باید به صورت سریال توش تعریف شده باشه اگر بخوای به طور موازی چند گانه بودن رو داشته باشی باید در غالب اینترفیس تعریفش کنی و در غالب اینترفیس پروتوکل هاتو تعریف کنی متد ها و فیللد هایی که مثلا فرض کن حالا داشته باشی دیگه باید زیرمجموعه براشون در نظر بگیریو داخل همین کلاس شیپت مثلا بنویسیش باید حتما سریال باشهدر مورد کلاس های یه بار مصرف :این میشه کلاس یک کلاس ناشناسه یعنی چی یعنی فایل نداره اسم نداره یک بار مصرفه یک بار پیاده سازیش میکنه و نمونه سازیش میکنه و تمام اما چرا این کلاسه چرا نمیگم اینترفیسهبخاطر اینکه این دقیقا همچین اتفاقیهببینید الان این کمپریتوتر اینجاست مثلا تو سورتبیام یک کلاس تعریف کنم این دقیقا همچین اتفاقی میفته مثلا میزنم استودنت کمپریتورو میام ایمپلمنت میکنم فرقی نداره اینی که من نوشتم با اونی که اون ور نوشت شده یکی هستش فقط این اسم داره رسم داره میتونی بهش ادرس دهی کنی میتونی ازش نمونه سازی کنی حالا فرض کنید اینجا کدش نوشته شدهاون کدی که اون ور بود اینه دیگهاین کدی که اینجاستمیشه کدی که اینجاست دقیقا همینه فقط الان مقایسه کن هر دو رو داری اما این :قبلش یه امپلمنت کمپریتور داره و یه اسم دارهاما تو اسم رو نداری اینجا ولی به جاش یه نیو کمپریتور داری این نیو کمپریتوراین نیو کمپریتور یعنی اولا بیا یک کلاس ناشناس بساز و بعد ایمپلمنت کن کمپریتور رو و بعد نیو کن از اون کلاس ناشناس پس کلاس داره می سازهعین همینه این الان کلاسه که ایم=لمنت کرده کمپریتور رواینم الان کلاسه به طور ناشناس این نیو کمپریتوره رو دارهایمپلمنت میکنه کلاس ناشناس رو از کمپریتور و بعد نیوش میکنه و یک بار ازش نمونه میسازه بخاطر همین بهش میگیم این یک کلاسه درسته؟یه لحظه من بیام داخل اکسپلوررخب تا اینجا بزارید یه چیزی بگگم اینترفیس ها بهتر جا بیفتهتا اینجا با کمپریتور آشنا شدیم از اون طرف اومدیم خودمون کامپریتور رو پیاده سازی کردیم ازش اسفتاده کردیم این کد ها رو باهاش نوشتیم و دیدیم که چثقدر عالی و خوب مرتب سازی رو داره برای ما انجام میده و هیچ مشکلی هم نداشتیم اما خب من بهتون گفتماره یه خورده پیچیده گی داره اینترفیس ها چیز ساده ای نیستن بخاطر همین خیلی تاکید میکردم که خیلی خیلی با دقت بخونیدش و استفاده از اینترفیس ها هم خیلی بهتون کمک میکنه که پروژه های خیلی درجه یکی رو بنویسید اما خب به تجربه هم نیاز داره یعنی باید یعنی باید اینقدر کد بنویسید که تجربه ات کامل تو این زمینه زیاد بشه و بدونید کجا باید ازشون استفاده کنید و لازم هم نیست همیشه خودت بیای اینترفیفس بنویسی و اینجور چیز ها یه زمانی میای و ازشون استفاده میکنی از اینترفی سهایی که ببفقیه نوشتن از اینترفیس هایی که داخل جاوا هستن مثلا چی ؟مثلا من میتونم بجای کمپریتور هایی که خودم نوشتم جاوا خودش کمپریتور داره میتونم از اون استفاده کنم و خب من الان دارم ارایه مرتب میکنم یه ارایه از استودنت ها جاواا خودش این کد رو داره دیگه   شما میتونید از این کد استفاده کنید البته شما استفاده نمیکنید مگه اینکه خودم بهتون بگم چون هدف ما آموزشی هستش دیگه باید خوتون بنویسید اگر بهتون میگم مرتب سازی و اینا کمپریتور و اینا رو باید خودتوون بنیوسید   الگوریتم مرتب سازیش رو باید خودتون بنیوسید   اما برای بعدا تون که میخواستین برنامه نویسی رو انجام بدین نیازی ندارین که این کار ها رو انجام بدین همه رو ریز بیای بنیوسی یه جاهایی نیاز داری مینویسی و یه جاهایی هم استفاده مکیکنی   مثلا من ارری لیست سورت خود جاوا استفاده کنم استودنت هام رو بهشان بدم مثلا یه استودنت یک و یک کاما بزارم دقیقا مث کدی که خودم نوشتم از نیو کمپریتور خود جاوا باید استفاده کنم کمپریتور خود جاواست جاوا دات یوتایل از این استفاده میکنم دقیقا مثل کمپریتور خودمانه ما هم همین رو داشتیم دیگه دقیقا مث همینه میتونی بیای از این کمپریتور استفاده کنیالبته برای ما بولین داره پس میده سه تا حالت در نظر بگیرید این الان دو تا حالت رو داره پوشش میده و این خیلی چیز نیست خیلی کامل نیست یه جاهایی بهتون ارور میده باید بیاید و سه تا ایف بفزارید بگید اگر و .... نکته مهم حلقه فور ایچ هستش حلقه هایی که تا اینجا داشتیم اینطوری بودن دیگه ای مساوی با صفر ای کوچیک تر از مثفلا ده یک کاری رو ده بار انجام بد هاما من یه جاهایی یه همچین حلقه هایی دارم که با ارری لیستت انجام میدم میگم ارری لیست استودنت از نوع استودنت ها استودنت مثلا صفر مساوی با حالا هرچی فرض کنیم الان اینجا به اندازه دات سایز استودنت سه دات ادفرض میکنیم دانشجو هام هم اضافه شدن سایز که نداره من اینجا میزنم ده چون ارری لیسته هرچند تا که بخوام میتونم توش ذخیره کنم حالا میخوام اطلاعاتش رو بازیابی کنم قبلا باید این کار رو میکردیم ای مساوی با صفر ای کوچیک تر مثلا ففرض کن استودنت 3 دات سایز ای پلاس پالس بعدش مثلا میومدم چاپ میکردم میگفتم سی اوت اس اوت استودنت مثلا سوم گت اندیس ای ام اش بعد مثلا فک کنم چاپ کردم الان میخوام بیام پایین تر حالا میخوام مثلا دو تاشون رو مثلافرض کن حالا این یه دونه مثلا بیام بگم  ست کن مثلا اوریجش رو بیاد چیزی که هست دوباره باید بیام این رو بنیوسم میخوام بگم هرچی که اوریجش هست رو بیاد به اضافهف سه اش کنباید هی بنویسی استودنت سه گت ای یه راه ساده تری هست یه راه خیلی ساده تری هستمیتونستم بگم استودنت اس مساوی باشه با این :بعد اینجا میگفتم اس رو چاپ کن اس رو مثلا ست کن اس رو اوریجش رو بگیر به اضافه 3 کن این رو می تونستم انجام بدم کدش خیلی خوانا تره دیگهاما راحت ترش رو هم میتونم انجام بدم   چطوری داخل جاوا میتونی این رو (خط 71 ) برداری و بجای کلاین هامیذاری اینجااینم بر میداری بجای مساویش دو تا نقطه میذاریاین دقیقا همون کار قبلیه رو برای من انجام میده به این میگن حلقه فور ایچ یعنی چیمیاد خودش داخلش یه مکانیزمی داره که بر اساس همین اینترفیس ها داره پیاده سازی میشه چطوری کار میکنه ؟ایاین حلقه میاد خودش داخل استودنت هات (ارری لیستت )یکی یکی استودنت هاش رو بر میداره میذارهاینجا اون شمار ای پلاس پلاس و اینا رو همه و همه رو داخل خودش انجام میده  تو دیگه لازم نیست داخل اینمثلا فرض کن تو کلی جا ها مختلف فمیخوای از این فوره استفافده کنی توت قبلی باید مینوشتی ای برابر با فلان و کلی طول میکشید دیگه اگه مثلا ده تا از این حلقه ها میخواستی بنویسی کلی طول میکشید جاوا اومده این رو راحت کرده گفته من توی این ارری لیسته پیااده سازی کردم اون اینت و فلان و چیز هاش رو تو نمیخواد این جا هم اونا رو بنویسییه همچین کدی رو بنویس من یکی یکی داخل اون مکانیزمم میشمارم و استودنت ها رو میذارم داخل این متغیر اس برات و بیا ازشون استفاده کن بهش میگیم فور ایچاینترفیسش چیه؟یه انترفیسی به اسم ایتریبلاز انیتر فیس اینتریبل استفادهف مکیکنم و دو تایکی اتریبله یکی ایتریتوره داخل ایتریبلم ایتریتور دارم در اصلمیخواستم امروز بهتون کامل بگمش ولی خب چون یه خورده سوال هاتون زیاد بود دیگه نرسیدمو اینطوری بهش میشه دسترسی داشته باشیایتریتور بنویسی ایتی ار مساوی بعد بنیوسی استودنت 3 دات ایتریتوراین الان اون شماره کننده شه در واقع دیگه تو میتونی بگی ایتره هز نکست وجود داره بعد نکست بعدی ر وبهم بدهدر واقع خود فور این کار رو انجام میدهحالا این حلقه فور ایچه یه کد عمومی هستش شما خودتون میتونید بیاید برنامه هایی رو بنویسید مثلا فرض کن چه برنامه ای بنیوسمفرض کنید من لیستی از دانشجو ها رو دارم دیگه من لیستی از دانشجو ها رو دارم که داخل این دانشجو ها للیسیتی از درس ها وجود داره دیگهگ من نمیخوام بیام حلقه بزار مکه بشماره و بیا دیکی یکی درس هاش رو بهم بده میخوام بیام اینجچا همچین کدی بنویسم فرض کنیم درس رو داریم بگیم مثلا درس هاشفرض کن سی داخل استودنت بگم درس هایی که توی استودنت هستشمیگم درس های استودنت شماره سوم رو درس هاش رو بهم بده حالا ففرض کنیم درسش رو داریم جلسه بعد این رو کامل بهتون میگمشنمیخوام ذهنتون با مطالب جدید تر پر شه که اماده باشید برای امتحانتونجلسه بعد یک کلاس درس اضافه میکنی مو بعد میایم یه همچین کدی مینویسمیمثل اون کدی که نوشتم بیاد خودش حلقه بزنه تو درس هایی که دانشجو دارهدیگه لازم نباشه که کلی بیام بنویسم فور اینتاین در واقع برای ساده سازیه همون کار رو انجام میده فقط برای ساده سازی کدتون هستش  مثلا اگه در ده جای مختلف ازش استفاده میکنید دیگه نمیخواد توی همشان حد بزاری و یکی یکی اندیس بگیری اصن این داستان ها رو دیگه نداری خودش اون کار ها رو داخلش داره انجام میده فقط ساده سازیه هیچ چیز دیگه ای نداره</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Wed, 23 Feb 2022 21:23:55 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه یازدهم &gt;&gt;ادامه ioc3</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%DB%8C%D8%A7%D8%B2%D8%AF%D9%87%D9%85-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-ioc3-pz1cqlmlbt48</link>
                <description>ادامه ای او سی سطح 3پرفورم میگه به من ربطی نداره که چه داده ای امده داخل . وابستگی به نوع داده وجود نداره دیگه فقط این برای من مهم است که باید حتمااون نوع داده ای که اصلا برای من مهم نیست چیه حتما متد کمپیر داشته باشه . همین داشته باشه برای من کافیهپس ای او سی سطح یک چی بود ؟ وابستگی به نمونه ای از یک داده خاص رو حذف میکرد .ای او سی سطح دو و یک چی بود ؟ علاوه بر نمونه ای از یک داده وابستگی به یک نوع داده خاص رو هم حذف میکرد . و وابستگی به یک نوع داده عمومی تر رو ایجاد میکرد .ای او سی سطح دو دو چیکار میکرد ؟ وابستگی به نوع داده خصوصی رو حذف میکرد .و به نوع داده عمومی وابستگی ایجاد میکرد و یه سری قوانین رو هم تعریف میکرد . یعنی میگفت این قوانین رو هم باید داشته باشه .حالا ای او سی سطح دوم وابستگی به نوع داده رو کامل حذف میکنه میگه اصلا برای من این ینست بگی این عمومی تره خاص تره یا هر چیزی نوع داده خاص و عمومی و این چیزا رو ما نداریماینجا میگه فقط فقط برای من مهمه که تو کامپیر داشته باشی . هر نوع داده ای هستی مشکلی نداره اگه کمپیر داشته باشی میتونی وارد این بشی و من عملیات مرتب سازی رو انجام میدمدو جلسه قبل ترم هم یه نمونه از این انجام دادیم امدیم داخل اسکیژوبل تایم رازش استفاده کردیم برای ایونت هندلر ها ازش استفاده کردیم .چطوری ازش استفاده کردیم؟امدیم داخل اسکیژوبل تایمر و سه تا متغیر تعریف کردیم از نوع ایونت هندلر ها و ستر گتر هاشون رو هم براشون قرار دادیم .اینا چی به من میگن ؟ میگن اصلا برای من مهم نیست که چه کاری رو میفرستی داخل از چه کلاسی یا از چه نوع داده ایه ، هر نوع داده ای میتونه باشهفقط باید کار رو در غالب چیزی به اسم هندلر تعریفش کنه اگه کار رو در غالب متدی به اسم هندلر تعریف کردی من میتونم اینجا پرکلاکش رو اجرا کنم یا ان تسک رو انجام بدم یا افتر کلاکش رو اجرا کنم متناسب با اون چیزی که ست میکنم برای این ها پس اینم همون اینترفیس هاست . حالا من ایونت هندلر رو اینجا استفاده کردم .باید بدونید که کجا از کلاس های ابسترکت استفاده کنم کجا از اینترفیس ها استفاده کنم کلاس های اابسترکت هم تقریبا همچین کاری برای من انجام میداد امروز میخوایم فرقشون رو بیشتر با هم بررسی کنیم ببینیم که چطوریه فرقشونچرا من اینجا اومدم از کلاس تسک استفاده کردم ، از کلاس تسک ابسترکت و داخل آن هم متد ران رو دارم چرا اینجا این رو تعریف کردمو چرا در اسکیژوبل تایمر ایونت هندلر ها رو نیومدم در کلاس قبل تعریف کنم . کسی میدونه ؟دلیل های مختلفی دارهیکی از دلیل هاش اینه که مفهومش اینه دقیقا من نیاز ندارم هر نوع داده ای رو به عنوان تتسکم بپذیرم فقط بگم ران اگه داشته باشی دیگه کافیته من این رو نمیخوام من میخوام کسایی وارد اینبشن که زیرمجموعه تسک باشن زیر مجموعه تسک بودن فقط به این معنی نیست که متد ران داشته باشی به این معنیه که علاوه بر متد ران یه چیزای دیگه هم داشته باشه مثلا من فیلد تایم استپ براش گذاشتم حالا من خیلی ساده انجامش دادم ممکنه کلی چیزای دیگه هم اینجا وجود داشته باشهمن فقط یه چیز کوچیک ازش انجام دادم گفتم یه تایم استمپی داره این رو نمیتونم تو اینترفیس بنویسم چرا ؟چون تو اینترفیس ها نمیتونی متغیر و این جور چیزا تعریف کنی یا کار های از پیش تعریف شده انجام بدی مثلا من میگم این تسکه و بعد امدم ست کردن و ایناش رو اینجا نوشتم یه متد دیگه هم اینجا براش مینویسم حالا هرچی که باشه مثلا من اینجا اسمش رو میذارم تست .کلی کار داره انجام میشه کلی چیزای مختلف دارم انجام میدم در اصل پیاده سازی دارم میگم تسک بودن به این معنی نیست که یه چیزی ران داشته باشه باید ااین ها رو هم به ارث ببره تایم استمپ داشته باشه ستر و گتر هاش وجود داشته باشه فرض کن هزار خط کد داره انجام میشهمتد تست رو به ارث ببره این ها رو که به ارث برد ران رو هم خودش پیاده سازی کنه به صورت یک اینترفیس این در واقع همون اینترفیس هستش به این دلیل اینجا ای ای سبز رنگ رو میزنهدقیقا همین ای سبز رنگ اینترفیس هاستس وقتی یک متدی رو داخل یک کلاس ابسترکتش میکنیم این در واقع مثل همون اینترفیسه برات رفتار میکنه اما فرقش با اینترفیس اصلیمون اینه اینترفیس به طور محض فقط یک متد براش مهمه اما توی کلاس ابسترکت یه سری چیز های دیگه هم به ارث میبره پیاده سازی دارن متد هایی که پیاده سازی ندارن چیز هایی که دارن به صورت اینترفیس در نظر گرفته اند رو میتونی توش استسفاده کنی اماا باید یه سری چیز های دیگه هم توش داشته باشی تایم استمپه یه سری کار های از پیش تعریف شده است اینا رو هم باید به ارث ببره که من به یکی از اون تسک ها بگم تسکه اما تو اینترفیس ها همچین چیزی نیست تو اینترفیس ها فقط و فقط متد داریم تو اینترفیس های کلاسسیکی که داریم توی جاوا یه سری چیز ها بهش اضاف شده حالا ما کاری به اون نداریم ما اینترفیس کلاسسیک رو داریم میگیم .پس فقط میتونیم متد تعریف کنیم هیچ چیز دیگه ای نمیتونیم تعریف کنیم این به طرو مححض فقط قوانین رو تعریف میکنهاما اون یکی یه سری چیز های دگه هم داره یه سری کار های دیگه هم میتونی انجام بدی داخل کلاس شیپ بود داشتیم   که من دارم این ها رو مینویسم به صورت ابسترکتمثلا ببینید اینجا مثلا متد تو استرینگ داره کالر داره کوردینت داره کلی چیز های دگه متغیر داره دیگه شیپ بودن به این معنینیستس که تو فقط یه اریا دااشته باشی باید این ها رو هم به ارث ببری و بعد اریا هم به صورت یک واسسط تعریفش کنی خب الان سیرکل شیپ رو به ارث برده ایمپلمنت کرده کمپیربل رومن میتونم برای اینترفیس ها چندین اینترفیس پشت سر هم با کاما بنیوسم مثلا یکی از اینترفیس های داخل خود جاوابه این صورت که باید متد هاشون رو هم پیاده سازی کنیم پس میتونی چند تا اینترفیس روپشت هم بنویسی و اینا رو ایمپلمنت کنی اما کلاس ها رو نمیشه انجام داد  چرا نمیشه انجام داد ؟ الان میخوام در موردش صحبت کنم خیلی با دفقت گوش کنید مشکلی که سی پی پی داشت و میتونستی ارث بری چند گانه داشته باشی ارث بری چند گانه که در سی پی پی داشتیم مشکلات اساسی داشت چون ابهام به وجود می اورد و ابهام دشمن مهندسی است همه ما هم این رو میدونیم مثلا من تو این شیپ میام یه کلاس دیگه تعریف میکنماین سیرکله دیگه من سیرکل رو از شیپ ارث بری کردم میخوام از یه چیز دیگه هم ارث بریش کنم یه کلاسی به اسم تست مثلا میام مینویسمداخل شیپ متدی به اسم ایریا داشتیمحالا ففرض میکنیم که این متد رو که الان هم نوشتیم وجود داره و تست هم همین رو داره من که نمی دونم سیرکل کی رو به ارث برده که مثلا ران داره نداره ران هم اینجا داره از کلاس های مختلف از شرکت های مختلف فرض کن یه کتابخانه از اینتنرنت گرفتم یه کتابخانه هم خودم نوشتم و از کلاس های جاوا استفاده کردم هر دو متد ران رو دارن بعد پیاده سازی هم میکنن مثلا الان داخل لشیپ این پیاده سازی داره مثلا فرض کن کلی کد اینجا نوشته شدهداخل تستش هم همینطور فرض ضکنیم ارث بری چند گانه میتونه انجام بده و تست رو اینجا به ارث میبردفرض کنیم ارث بری چند گانه رو مثل سی پی پی میتونم انجام بدم اولا ارور بهم میده که نمیتونم اکسستند کنی یعنی چند تایی نمیتونی انجام بدی چرا نمیذاره انجام بدم ؟کسی متوجه مشکلش شد ؟که چه مشکلی داره چرا این الان مشکل داره و جاوا نمیذاره این کار رو انجام بدم وسی پلاس پلاس ساین رو داره و همه میگن این یکی از مشکلات سی پی پی هستش هر چند یه جاهایی هم مثلاخیلی به درد بخوره توی سی پی پی ولی خب اینجا ن چون اونچا چیزی به اسسم مسستقیم اینترفیس نداریم اگه بخوای اینترفیس تو سی پی پی تعریف کنیم باید یه کلاس انتراعی محض تعریف کنیم یعنی بیای فقط اینجا فقط متد های ابسترکت توش تعریف کنی اونجا باید داشته باشه همچین چیزی ابهام داره افرین نمیدونه که کدوم رو باید الاان به ارث ببره الان ران شیپ رو به ارث ببره یا ران تست رو به ارث بببره ما قبلا میگفتیم اگر ران داخل خود سابکلاستم بنویسی رانی که داخل خود سابکلاست هست رو میاد و اور راید میکنی داخل اون یکی اما اینجا اصن من رانی ندارم یه دونه ران از شیپ داره میاد یه دونه ران هم از تست داره میاد کدامش رو به ارث ببره اونی که داخل شیپه به ارث ببره یا اونی که داخل تسته اجراش کنه پس ابهام داره یه ابهام فوق العاده مهمه حل این ابهام بااعث شد کلاس های انتزاعی که داخل سی پی پی هستن به دو تیکه قسمت بشن کلاس های انتزاعی محض و کلاس هایی که اینجا داریم اسسم کلاس سهای انتزاعی محض عوض شد و شد اینترفیس یعنی اینترفیس های دقیقا همونن یعنی اون ابهامه رو اومدن رفع کردن توی سی پی پی میتونستی این کار رو انجام بدی  ولی موقع اجرا مشکل ساز بود برات کدام رو به ارث ببره این یا اون یکی پس ابهام دشمن مهندسیمونه خب به همین دلیل اجازه نمیده جاوا ارث بری چند گانه انجام بدیم برای اون قسمت چند گانه اش تو اگه میخوای این کار رو انجام بدی با استفاده از اینترفیس ها انجام بده اما خب ممکنه بگی اینترفیس هم همین مشکل رو داره ایمپلمنت میکنم  کامپیربل روو میام اینجا و این کلاس تست رو تبدیلش میکنم به اینترفیس و اون متد کمپیری که اون ور بود مثلا این متد ران اصنمیتونم این متد ران رو بزنم یا این متد کمپیری که هست .فرض کنیم متدی کمپیر دقیقا به همون شکل داره الان هم کامپیربل هم تست دقیقا یک چیز رو دارن من اینجا اگه بنویسم کمپیربل یا بنویسم تست چرا باید چرا اوکیه ؟مگه این همون مشکل نیست ؟الان درسته که هر دو کمپیر دارن اما پیاده سازی ای وجود نداره فقط اینترفیسسشه گفته اینترفیسش اینطوری باشه حالا اصن ارث نمیبره اینترففیس این اصن پیاده سازی نداره وقتی میام میگم ایمپلمنت در واقع داره هر دو تاشون ایمپلمنت میشهپیاده سازی اینجاست .فقط اسمشون رو داره از اون میگیره حالا اسمش رو چه از اون بگیره چه از هزار تای دیگه اینترفیس بگیره مگه فرقی داره ؟ چیز داخلشون نیست که فرفی داشته باشه همون کلاس ها .توی کلاس ها من اگه این کلاس بود و توی شیپم از یه کلاس دیگه ران مینوشتم توشون کد مینوشتم کد پر توش بود من نمی دونستم کدوم کد رو باید اجرا کنم اما الان این کد نیست داخلش حالا این اسمه عنوانش هستحالا از این بیاد یا از اینترفیفس دیگه هیچ فرقی نداره به این دلیل من میتونم اینترفیس ها رو چند گانه ایمپلمنت کنم کلاس ها رو نمیتونمخب این سورتی که اینجا نوشیم یه خورده مشکلات داره خب خیلیل مشکلاتش رو حل کردیم اما هنوز یه سرسی مشکلات داره مشکل اصلیمون چیه ؟سسورتی که من اینجا نوشتم و داره استودنت ها رو مرتب میکنه اگر من بخوام همین سورته استودنت ها رو بر اساسس سیه پارامتر دیگه برای من مرتب کنه همه لیست هایی که بر اساس استودنت هستن صدرصد بر اساس اوریج مرتب میشناگر این رو تغییر بدم توی صد جای مختلف استسفاده کرده باشم همشان بر اساساگه این جا رو تغییر بدم همه جاهایی که ازش استفاده کردمتبدیل میشن از اوریج به چیز مد نظرمون مثلا ای دی اما من مثل همین چیزی که توی ویندوز هست داخل خود ویندوز هم داریم دیگه مثلا من میام بر اساسس تاریخ مرتب میکنم بر اساس ای دی بر اساس اسم . آفرین دیتیلز بزنی بر اساس سچیز های مختلف میتونی مرتب سازی انجام بدی اینجا من نمیتونم استودنت رو بر اساس چیز های مختلف بررسی کنم همیشه باید یه جور مرتب کنم ولی خب من همچین چیزی که نمینخوام میخوام بر اساس چیز های مختلف مرتبش کنم و این یه نکته و نکته دیگه اینکه چه نیازی هست که اصن از سورت بیام و نمونه بسازم شاید بگین خب چون استیت داره و یه استیت از ورودی میگیره من میتونممن میتونم یه سریس از کلاس ها رو بدون استسیت هم بنیوسمش الان این با استیتهمیتونم همین رو بدون استسیت هم بنیوسم دیگه چطوری؟فرقی داره که من این رو اینجا میذاشتمفرقی داره به نظر شما ؟ ببینید اینطوری بود اول یه استیت براش گذاشتمببینید اینطوری بود اول یه استیت براش گذاشتم به عنوان ورودی گرفتم و بعد ستر و گتر براش گذاشتم خب چه فرفقی داره خب من همین رو اینجا میذاشتم و هیچ کدام از این ها رو هم لازم نبودالان من این رو بدون استیتش کردم کلاس های بدون استیت رو گفتم میتونیم چطوری بنویسیمشون؟ اصن نیازی به نمونه سازی ندارن استاتیکشون میکنیم و اجازه نمنونه سازی رو هم ازش بر میداریم دو تا روش برا ی اینکه اجازه نمونه سازی به یک کلاس ندیم وجود داره یکی کلاس های انتزاعی هستش یکی هم اینکه سازنده اش رو پریویوت کنم سازنده هر کلاسی رو پرایویت تکنی دیگه کسی نمیتونه ازش از بیرون نمونه بسازه از داخل میتونی ازش نمونه بسازی اما از بیرون نه اما کلاس های انتزاعی فرقی نداره چه داخل چه بیرون هر جایی باشه اصن نمیتونی ازش نمونه بسازی و این رو ما میدونیم کلاس های انتزاعی کلی ویژگی های خاص دارن میتونی متد های انتزاعی توشون تعریف کفنی یا مثلا به عنوان گذرگاه عمومی ازشون استفادفه کنی و کلی کار های دیگه  اما اگر سازنده این رو من پرایویتش کنم از بیرون دیگه هیچکسی نمیتونه این رو نمونه سازی کنهچطوری ازش استفاده کنم ؟دیگه لازم نیست این کار ها رو انجحام بدمکافیه که فقط بیام اینجا نمونه اش رو بردارم و بنیوسمسورت دات پروفم استی لیستدیدی چقدر قشنگ شد ؟ اصن نمونه سازی نمیخواد الان همین رو مرتب میکنه برای اینکه یه خورده جالب تر باشه اسمش رو هم تغییر میدیم اسم این کلاسه رو تغییر میدم اسم این کلاس رو میذارم   . یعنی ابزار هایی که برای لیست استفاده میکنی و داخل اینکه بخوام پرفورم بنیوسم اسمش رو میذارم سورت و برای ااینکه همه جا اتفاق بیفته فبا شیفت و اف شیش این کار رو انجام میدم .دقیقا مث مث ، مث هم پراایویت هستالان ببین چقدر قشنگ شدمیگم لیست یوتیلیتی   انگار جعبه ابزارتو داری صدا میزنی که این جعبه ابزار آچر فرانسه بیاد این کار رو انجام بده لیست یوتیلیتی ابزار های لیست سورت کن برام استی لیست رواما اون مشکل دومیه رو باید چیکارش کنیم؟مشکل دوممون این بود من باید حتما از کمپیر استفاده کنم خب وقتی یه چیزی وابسته میشه خب الان وابستگی ایجاد شده الان کلاس استودنت وابسته شده به متد کمپیر اگه به یه چیزی وابستگی ایجاد بشه باید چیکار کنم ؟باید وابستگی رو از توش بیرون بیارم دیگه وابستگی رو باید از توش بیرون بیارم چطوری این کار رو انجام میدم ؟برای اینکه وابستگی رو بیبرون بیارم به مفاهیم دوباره فکر میکن م ببینید این چیزی که من اینجا نوشتم از لحاظ مفهفومی به یه شکل دیگه هم میتونم بنویسمشاگر شما مفاهیم یه پدیده یا موجودیت رو در دنیای واقعیتون درست درکش کنید میتونید کلی کد های حرفه ای و کللی کار های حرفه ای انجام بدین مثلا چی من میخوام مرتب سازی رو از دو دیدگاه بررسیش کنم دیدگاه اولم اینه که استودنت ها قابل مقایسه اند میگم استودنت ها قابل مقاییسه اند خودشون قابل مقایسه اند میگم استودنت یک مقایسه شه با استودنت دو مثل این میمونه مثلا فر ض کن من بیام این کار رو انجام بدم یعنی این چیزی که من الان تو سورت نوشتم اینطوریه میگم فرض کن ده تا دانشجو پای تخته جمع شده بر اساس معدل میخوام این ها رو مرتب کنم بعد من که خودم الگوریتم مرتب سازی ام میگم دانشجو یک مقایسه شو با دانشجوی دوو در صورتی که بر اساس پارامتری که بر اساس اون معدله میدونید جاتون رو عوض کنید بعد میگم دانشجوی یک مقایسه بشه با دانشجوی 3 با چهار با پنج با شش و بعد میام میگم دومی با این ها یعنی میگم خودت مقایسه شو اما یه کار دگیه هم میتونم انجام بدم بگم فرض کن ده نفر پای تخته هستند و بعد من یکی دیگه ام بیارم بگم تو مقایسه کننده این هایی یه للیست بهش میدم میگم بر اساس این لیست بیا این مقایسه ها رو برای من انجام بده به اون نفر واسط این رو میگم که این دانشجوی یک و دو رو برای من مقایسه کن و یک دو و یک و سه و یک و چهار و تا یک وهفته و . . دو سه و دو چهارو . . . همه این ها رو به اون میدم مقایسه کنه به خود دانشجو ها نمیدم دانشجو ها اصن نیازی نیست بدوننن که الان چطوری خودشون رو جابه جا کنن درستش اینه میگم این لیست رو نگاه کن بر اساس این لیست اینها رو مقایسه کن نتیجه رو به من بده که من اجراشون کنم پس دو حالتل میتونیم انجام بدیم .یکی اینکه خود دانشجو ها خودشون رو مقایهس کنن یکی اینکه یه واسطی در نظر بگیریم و اون واسطه بیاد برای من این مقایسه ها رو انجام بده یه شخص واسط کهب ه اون شخص میگیم کمپریتور مقایسه کننده و دو تا دو تا دانشجو ها رو بهش میدم میگم اینا رو با هم مقایسه کن پس دیگه دانشجو ها خودشون درگیر این نمیشن که چی رو با چی مقایسه کنند بر اساس چه پاراامرتی پس اصن این درست نیست که بیام بگم تو قابل مقایسه ای اینا رو از اینجا باید اصن بردارم نباید خودش اصن قابل مقایسه باشهیکی رو باید بیارمکه اون مقایهس ها رو انجاما بده وقتی این قابلیت رو داشته باشم که بتونم یه نفر رو بیارم که این مقایسه ها رو برای من انجام بده نمیتونم ده نفر دگیه هم بیارم که بر اساس ده تا پارامتر دیگه برای من مقایسه انجام بدن؟ دانشجو ها بر اساس محدودیت های کد نویسی که داریم یه دونه میتونن (فک کنم پاسخ به سوال یکی از دانشجو ها بود ) یا میتونه بر اساس معدل باشه یا بر اساس چیز های دیگه نمیتونم بر اساس چیز های مختلف این کار رو انجاما بد م اما مقایسه کننده های مختلف میتونم بیارم که این کار ها رو برای من انجاما بده پس به جای اینکه کمپیر باشم یه چیزی تعریف مینم به اسمکمپریتور و اینترفیسو اینجا باید چیکار کنم بولین رو مینیوسم دوباره و متد مقایسه اش رو هم مینویسم اما یه دونه نمیگیره دو تا میگیره دو تا از چه نوعی میگیره فعلا فعلا من از نوع استودنت مینویسمش اشتباهه ها ولی باید بریم به ای او سی چهار که کاملش کنیم فعلا من باید اینطوری بنویسمش اس یک و اس دو فعلا هاااا  بعدا این رو درستش میکنیمدرستش اینه که از جنریک ها استفاده کنیم و بجای استودنت تی بزارم حالا بعدا این رو درستش مکینم خب بعد از اینکه این کار رو انجام دادم من فقط میخواموقتی این کار رو انجام بدم این عکس باللایی رو نمیخاد بنویسیاین رو هم نیخواد دیگه ایمپلمنت کنی دیگه پس حالا چطوری از این استفاده کنم وقتی که میخوام داخل مترب سازیم لیست دانشجو ها رو بیگرم فعلا اینو میگم که استودنت میخوام مرتب کنم لیست یوتایله فقط استودنت مرتب میکنه بعدا درستش مکینم میگم لیست ااستودنت ها رو بیگر یه کمکی هم بیگر کمکیتو از نوع کمپریتور بگیرو بعد نگو این خودش رو با اون مقایسه کنه همین حرفی که زدیم رو بگوبگیم مقایسه کننده مقایسه کن اولی و دومی روپس یک کمکی رو هم گرفتم از اینجا حالا موقعی که میخوام ازش استفاده کنم حالا من فعلا دایره ها رو بر میدارم نمیشه دیگه دایره ها رو مقایسه کنیم فعللا وقتی که میخوام مرتبش کنم کاری که انجام میدم اینطوریه  میگم این لیست استودنت ها رو بگیر از یک کلاس ناشناس برای مقایسه کننده اش استفاده میکنم میگم اینطوری هم مقایسه اش کن میگم اس یک دات اوریجش با اس دو دات اوریجشاین یه دونه حالا میخواام یه بار دیگه استودنت ها رو بر اساس ای دی مرتب کنم میگم این رو بگیر با یه کامپریتور جدید گت ای دی گت ای دی وابستگی حذف شد . ببینید چقدر کد ها جالب و حرفه ای میشن وقتی بنیاد این چیز ها رو بدونید چطوریهقبلا نمیتونیستیم اما الان مرتب سازی کن بر اساس هزار تا کمپریتور مختلف خب حالا میگم الاان مشکلاتی داره بعدا کاملش میکنیم این یه مثال دیگه از اینترفیس ها فرقش چی بود با اون یکی ؟قبلیه به عنوان یه گذرگاهی اینجا در نظرش میگیرفتمی و خود اون نوع داده ای که میخواستی باهاش کار کنی با اون از طریق اون وارد میشداما اینجا اینطوری نیست نوع داده ات رو جدا میگیری و دومی رو به عنوان یه ابزار میگیریش قبلیه به عنوانا یه ابزار نبود قبلیه داخلش خودش بود اما این به عنوان یه ابزاره مثل اینه مثلا فرض کن من بهت میگم این لیوانه رو بگیر با این قاشقه بعد اون قاشقهرو میای اون لیوانه که چیزی داخلش هست رو همه میزنی قبلیه اینطوری بود که خوود لیوانه یه همزنی داخلش باشه از این لیوان حرفه ای ها هست یه همزنی داخلش هست برای قهوه است نمیدونم چیه ?ولی این یکی جداست ابزارش رو جدا میگیری میگی این ابزاره بیا برای من این کار رو اانجام بده که مرتبش میکنه برات یه بار این میاد بر اساس استودنت اوریج مرتب میکنه یه بار هم میاد بر اساس ای دی ها مرتب میکنه و دفعه بعدی ممکنه قبلیه رو به هم بریزه من میتونم این کار رو حالا حرفه ای تر هم انجام بدم برای اینکهبخهوام بر اساس پارامتر های پیچیده تر انجام بد مبیام اینجا بگم اگه این مثلا بزرگ تر هاین کار رو انجام بدهاما اگه مساوی هستن   بیا مثلا فرض کن بر اساس ای دی انجام بده اگر ای دیش فلانه بیا بر اساس نام انجامش اول این رو اجرا میکنه مرتب میکنه بعد میاد اینجا بر اساا س ای دی مرتبش میکنهبرای اینکه یه لحظه هم ببینیمش من اینجا یه سیستم دات اوت االکی بنویسم ببینیم چه اتفاقی میفته ببینیم واقعا این کار رو برامون انجام میده یا ن ولی خب میگماین الان فقط استونتن رو برای من مرتب میکنه بریم به ای او سی چهار سیرکل رو هم مربت میکنه البته اگه همینجا هم ابجکت بزنم میتونه اون کار رو انجام بده ولی خب باید یه کستینگی انجان بدیم</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Mon, 21 Feb 2022 21:30:13 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه دهم &gt;&gt;ioc3</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D8%AF%D9%87%D9%85-ioc3-iacmw1cpwwkm</link>
                <description>گفته از کانتر یعنی از این جایی که هست یعنی آخری ، بیا شروع کن تا زمانی که بیاد و برسه به این اندیس دواول i+1 رو یعنی خط 58 (مورد چهارم ) که به علاوه یک که میشه میاد یه خط پایین تر یعنی خط 59 وقتی میگه برابر با شیپ ای قرار بده یعنی بیارش خط 59خب الان چهار منهای یک شده و شده 3 حالا 3 به علاوه یک میشه چهارمیگه توی شیپ چهارشیپ ای رو قرار بدهیعنی به این صورت وبعد برای شماره دو هم همین کار رو میکنیمحالا اندیسمون چنده ؟ اندیسمون دو بوده اندیس bbb رو توی دو ذخیره اش کن . .خب بذاریه بار امتحانش کنیم من الان میام از این استفاده میکنم یه نمونه از شیپ ارری لیست در مین به اندازه 15 تایی میسازم چون متد گرو ندارم و بعد متد ادد استفاده میکنم و :یه چهار تا دیگه هم اضافه میکنمخب حالا میخوام یک دانه اینسرت کنم و میگم تو اندیس دو یه دونه مستطیل اضافه کنبعد از اینکه این ها انجام شدن کانترت رو باید یه دونه اضافه کنی چون یه دونه دانشجو بهش اضافه شدهخب الان من این رو یه لحظه اجراش میکنم ببینیم واقعا شیفتش میده یا چ : خب این الان ساخته شده نگاهش هم میکنیم هنوز هیچی توش نیست :این رو اضافه میکنه یه دونهدو تا سه تا و چهار تا خب الان این چهار تا اضافه شدنچهار تا دایره اضافه شدن توی این خانه ها . . .حالا میگه اینزرت کن میرم داخلش ببینم چه اتفاقی میفتهمیرم داخل ایندکسم ، ایندکسی که ازم میخاد چیه ؟ خونه دوم اندیس دوم این مستطیل رو قرار بده کوچیک تر از کانتره ؟ اره درستهپس میاد داخلمیگه از کانتر شروع کن تا زمانی که i که الان شده چهارتا زمانی که بزرگتر از اندیسه اس یعنی تا زمانی که بزرگتر از دو هست . ای رو یکی یکی کم کنخب میگه ای به اضافه یک که میگه بیا خونه پنجم الان اگگه شیپ رو نگاه کنیم یه لحظهخونه چهارم نداره ای چنده ؟اها کانتر رو باید یکی کمش کنیمکانتر سایزمونه یه دونه کمش کنیم میشه 3+1 که درسته . .خب بزار از اول اجراش کنم . .چون کانتر یه دونه داره اضافه میشماره وقتی . .. میکنی تهش یه دونه اضافه میکنهخب ببینید الان شیپ رو نگاه کنید :الان من گفتم توی خونه دوم باید بیاد رگتنگل رو برای من قرار بده خونه دوم اینجاست دیگه :یعنی الان این و پایینیش باید یه دونه برن پایینخب میگه از کانتر منهای یک شروع کن یعنی از 3ای از 3 شروع میکنهمیگه ای به علاوه یک یعنی خانه چهارمش که وجود نداره هنوز میگه این رو برابر با شیپ ای قرار بدهشیپ ای مون چنده ؟ این دایره است با شعاع چهار میگه اون آخری رو یکی ببر جلو خب الان ببینیم رفت ججلو یا ن :خب یه دونه رفت جلویعنی اینه دیگه این یعنی اینجا هم کپی شد الان خونه شماره دو رو هم باید بیارم ججای سومی خب یکی ازش کم کردهمساوی قبلل از ایندکس رو هم نذاشتم که باید میذاشتم پس دوباره اجراش کنیم . چون خود اندیسم باید یکی ببره جلو دیگه چند تا چیزه دیگه ، یه سری منها و مساوی این جور چیزا رو باید درست بذارینخب این الان دیگه باید درست باشهاون اولی رو برد حالا دومی دومی رو هم باید ببره پایین یه لحظه نگاه میکنم ببینم چه اتفاقی افتاده چهار امده اینجا هفتم اومده اینجاحالا تو خانه دوم باید مستطیل رو قرار بدم :خونه دوم یعنی اندیس دو رگتنگل و قرار میدمشیپ اینا رگتنگلدایره دایره مستطیل دایره دایره و قشنگ اینزرتش کرد بین اون ها یکی هم باید به کانتر اضافه کنم دیگهچون یه دونه آیتم جدید اینزرت شده درسته ؟فقط اون شرط گرو کردنش رو هم باید بذارید دیگه چون اگه جا نداشته باشه ارور میده ایندکس اوت اف باند میزنه یا اوت اف رنجخب امروز میخوام یه چیز بیش از اندازه مهم رو یعنی خیلی خیلی خیلی مهم رو یاد بگیریم یکی از زیبا ترین و قدرتمند ترین ابزار هایی که توی شی گرایی باهاش کار میکنیم و به شدت جالب و عالیه در واقع تکمیل کننده تمام چیز هایی هستش که تا الان یاد گرفتین اما خب خیلی چیز جالبیه خیلی به شدت کاربردیه و توی خیلی از برنامه هاتون میتونید ازش استفاده کنید .چیز هایی که بتهتون میگم وابستگی به جاوا نداره من فقط دارم با جاوا میگمش چون جاوا خیلی زبان جذابیه آدم خیلی راحت میتونه باهاش کار انجام بده ادم خیلی چیز های حرفه ای و و مثلا ابزار ها و امکانات جالبی داره و سبک کد نویسیش مرتب و منظم هستش . اما این مطالب که بهتون میگم به هیچ عنوان وابستگی به جاوا نداره . این چیزا که درباره ioc  و اینجور چیز ها دارم بهتون میگم اتفاقا خیلی خیلی بیشتر توی طراحی وب سایت ها ازش استفاده میکنن مخصوصا اون هایی که asp.net اگر اشنایی داشته باشن این واژه ها رو خیلی شن یدن اگر اشنایی داشته باشن دپندنسی اینژکشن و .. برین یه فیلم اموزشی خارجیش رو نگاه کنین ببینین درمورد چی داره حرف میزنه .. .همش درباره همین مفاهیم هستش . .خب بریم برای ioc3 چه ابزار هایی دارم برای تعریف مسئله تا اینجا چی رو یاد گرفتیم شما به من بگین تا اینجا برای تعریف کردن یه موجودیت چی رو داریم؟که بعدا در قابل ioc1  و ioc2  و اینا معرفیش کردیم ؟انتزاع حالت کلیشه دو تا چیز بهتون گفتم وقتی میخای یه چیزی رو تعریف کنیم چی میگیم با اون واژه های مفهومی که بهتون گفتمجواب : has a  و is a  این عمومی سازی و اینجور چیز ها این ها چیز هایی هستن که هدف ما هستن اما برای تعریف یک موجودیت دو تا چیز خیلی مهم داشتیم یا اینکه یه سری ویژگی داره یا یه سری ویژگی دیگه رو از یکی به ارث میبره یه سری ویژگی رو خودش داره که میشه has a  یه سری ویژگی رو به ارث میبره میشه is a  مثلا میخای بگی تلویزیون چیه میگی تلوزیون فلان ویژگی ها رو خودش داره و یه سری چیز های دیگه هم از طریق is a  به ارث میبره مثلا میگیم تلوزیون یک وسیله الکترونیکی است ، این میشه اون is a  اش نمیای دیگه جزییاتش رو بگی خازن داره مقاومت داره و . . و هزار چیز ریز داخلش رو بگی میگی تلوزیون is a  وسلیه الکترونیکی و has a  یه سری ویژگی های خاص خودش این چیزیه که ما توی دنیای واقعی مون داریم علاوه بر این یه چیز دیگه هم داریم و واسط  یا همان اینترفیس پس یکی اینکه یه سری ویژگی ها رو داره یه سری ها هم is a  داره میگیره یه جاهایی واسط داره بین دو موجودیت از چه لحاظ ؟یکیشون باید یه گذرگگاه بذاره و اون یکی از طریق اون واسط به این ارتباط برقرار میکنه مثال دنیای واقعیش چیه ؟ مثال دنیای واقعیش گوشی ها و وسیله های برقی که داریم درسته ؟ تلفنتون مثلایوزر اینترفیس یعنی واسیط بین کاربر و اون برنامه تون این هم همون مفهوم واسط هستش اما این واسطی که ما میخوایم در نظر بگیریم واسط بین موجودیت هاست اون واسطی که اسمش یوزر اینترفیسه واسط بین من کاربر و یک برنامه کامپیوتریه حالا من میخوام واسطی رو در نظر بگیرم بین موجودیت ها بین دو موجودیت از دو دنیای مختلف من و برنماه کامپیوتری هم از دو دنیای مختلفیم دیگه من یه انسانم و اون هم یه برنامه کامپیوتری هستش واسط یعنی یه چیزی که بین من انسان که از یه دنیای دیگه هستم و اون برنامه کامپیوتر که دنیای خودش رو داره یه ارتباطی برقرار میشه حالا من میخوام بین دو تا موجودیت از دو تا دنیای متفاوت همچین ارتباطی رو برقرار کنم سیستم عامل هم مثال خوبی در این زمینه است .که واسطی است من میتونم از طریق سیستم عامل بی نهایت برنامه مختلف رو از روی سخت افزار اجراش کنم دقیقا میشه یه واسط حالا تو دنیای واقعیمون چیه ببینید شما وسیله های برقیتون مثلا به تلفن تون میگین برق داره ؟یا تللویزون تون برق داره ؟ نمیگین برق داره میگین تلویزیونتون از طریق یه واسطی برق میگیره و ازش استفااده میکنه وصله به برق با برق کار میکنه ولی برق نداره ک خودش برق جز تلوزیون تون نیست تلویزیونتون اون ساختارش چیزی که میسازدش یه سری وسیله های الکترونیکی هستن و یه سری چیز های مختلف اما برای اینکه کار کنه به برق نیاز داره یعنی به یک دنیای متفاوت از طریق چی ؟از طریق واسط پریز برق و سوکت شارژر پس تلفنتون یا تلویزوینتوون یه سوکت داره میشه گفت یه دونه سوکت داره که از طریق اون سوکت از طریق یه پریز وارد گوشی شما میشه دنیا هاشون کاملا متفاوته و ربطشون اینه که من از این میتونم تو این یکی استفاده کنم. بی نهایت تلفن مختلف دارید از اون طرف بی نهایت روش مختلف داریم برای تولید الکتریسیته یکی توربین بادی و دیگری انرژی گرمایی زمین و . . . هزاران شکل مختلف تولید اکتریسیته میتونید داشته باشید از اون طرف بی نهایت حالت مختلف برای وسیله های مختلف الکترونیکی داریم که میتونن از برق استفاده کنن تلوزیونه یخچاله موبایله کامپیوتره هزاران چیز مختلف دیگه اینا چطوری با اون دنیا ارتباط برقرار میکنن فقط از طریق یه سوکت و یه پریز این میشه واسط بین اون دو تا دیگه به من ربطی نداره که پشت اون پریزه چیه از توربین بادی میاد یا هسته ای میاد اصن به من ربطی نداره من برام مهمه از طریق این گذرگاه برق وارد سیستمم میشه درسته ؟فقط یه سری قانون برای من مهم هست یه دوشاخه باید داشته باشیم به اون اندازه ای که مثلا فرض کن از اینجا تا ااینجاا اندازه اشه از این ور هم گوشی موبایلم مثلا یه سوکت داره و سوکتش این شکلیه و . ..اگر این قوانین رو داشتی دیگه به من ربطی نداره که از کججای دنیا داری میای اصن نیازی ندارم بدونم که از کجا میای حالا من میخوام داخل کامپیوترم وبین آبجکت های شی گراییم همچین رابطه ای برقرار کنم همچین واسطی برقرار کنم یه همچین چیزی داشتیم تقریبا درسته ؟داخل مثلا اسکیژولر بود دیگهاینجا من الان یه تتسک اینجا گذاشتممیتونم هزاران شکل مختلف تسک رو بفرستم داخل و یه سری قوانین روش تعریف کردم باید حتما این گت تایم استمپ رو که داره باید حتما ران خودشون رو پیاده سازی کننحق ندارن از خود نوع تسک نمونه بفرستن تو این قوانین رو تعریف کردم گفتم ولی باید زیرمجموعه تسک باشه اما کسی حق نداره از خود تسک نمونه بسازه ابسترکتش کردم و و حتما باید ران رو هم خودشون پیاده سازی کنن مشکلش چیه این یه همچین چیزی انگار هست اون واسطی که میگیم انگار هستمشکلش اینه که به اندازه کافی عمومی نیست باید حتما حتما زیر مجموعه تسک باشن یعنی باید تسک باشنیعنی باید حتما حتما این ویژگی ها رو هم به ارث ببرن یه کلاس باید باشه یعنی یه آبجکت یه نوع داده هست در واقع یعنی باید حتما زیرمجموعه این کلاسه باشن پس به اندازه کافی عمومی نیست برای من و از لحاظ مفهومی هم درست نیست من میخوام یه مرحله این رو عمومی ترش کنماما قوانین هم داشته باشم . عمومی تر باشه اما قوانین روش تعریف شده باشه مثلا فرض کن توش دانشگاه رازی فقط استودنت ها میتونن برن توش ازمایشگاه درسته؟باید حتما ااستودنت باشن اما یه سری قوانین هم روشون تعریف میشه مثلا سر کلاس پیشرفته باید استودنت های رشته کامپیوتر وارد بشن ما به این میگیم استودنت هایی که حالا قوانین هم روشون تعریف شده باید حتما کامپیوتری باشن اما استودنت باشن یا مثلا فرض کن سالن مطالعه سالن مطالعه فقط میگیم استودنت ها بیان دیگه فرقی نداره که استودنت کدام رشته باشه . . قوانینی نداره مث همون ioc2.1 هستش اما مثلا فرض کن میگم چی فرض کن خیابان ها رو در نظر بگیریم میگیم توی این خیابان ها هم انسان ها میتونن حرکت کنن هم ماشین ها اما قوانین وجود داره باید قوانین شهری رو رعایت کنن مثلا یکی از قوانین ما این است که توی خیابان اشغال نریزیم ولی قوانینه دیگه امافرقی نداره که از کدام نوع است یه مکان عمومی تره   اما قوانین هم روش تعریف شده دانشگاه یه مکان نیمه عمومی بود و باید حتما یه زیرمجموعه کلاس خاصی ورود پیدا میکرد اما اینجا اینطوری نیست همه کس میتونن رفت و امد کنن ماشین میتونه بیاد موتور میتونه بیاد ادم میتونه بیاد حالا یه سری قوانین هم در نظر گرفته میشهبرگردیم به مثال برق مییگم تو این پریز برق فقط و فقط کافیه که دوشاخه داشته باشه دیگه از اون ور وصلش میکنی به خودت وصلش میکنی به کامپیوترت وصلش میکنی به گوشیت یا یخچالت به من ربطی نداره واسط رو رعایت کن دیگه هر کاری میخای باهاش بکن دو شاخه داشته باشن حالا تو خودت رو بزن به برق برق بگیردت به من ربطی ندارهاما کجا به یه همچین چیزی نیاز دارم ؟من داخل اسکیژولبل تایمر من میخوام تسک بیاد داخل واقعا نمیخام که هرچی بیاد داخل پس کاری به این نداریم .بجای میخام یه مثال دیگه بزنم مثال دیگه ام چیه ؟ میخوام مرتب سازی عمومی بنویسم مربت سازی عمومی یعنی چی ؟یعنی هرچی که بهش بدی میتونه مرتب کنه پکیج سورت رو براش در نظر میگیرم و میام یک کلاس براش مینویسم به اسم سورت خب حالا سورت میخاد چی رو مرتب کن ؟ وقتی که میاید سورت رو بررسی میکنید میبینید که ... فرقی داره که تو میخای لیوان مرتب کنی یا مثلا خودکار ها رو مرتب کنی بر اساس رنگ یا بر اساس جنس یا لیوان ها رو بر اساس اندازه انسان ها رو مثلا بر اساس معدل دانشگاهیشون نمیدونم بر اساس سنشون سگ ها رو بر اساس نژادشون فرقی داره که بر اساس چی میخای مرتب کنی ؟ هیچ فرقی نداره اینجا پس نباید بیام زیرمجموعه کلاس خاص رو در نظر بیگرم اگه اون طوری بود خب کلاس آبجکت رو میذاشتم و میگفتم بیا اما ابجکت به شدت عمومی هست هیچ قوانینی براش تعریف نشده اینی که الان میخوایم در نظر بگیریم یه جورایی ابجکته اس اما قوانین روش میذاریم میگیم هرکی باید عیب نداره مشکلی نداره اما یه سری قوانین باید داشته باشه قانونی که برای مرتب کردن نیاز داریم به نظر شما چیه جنس و نوع و ایناش رو که گفتیم اصن ربطی نداره من میخوام دایره باشه مانیتور باشه حیوان باشه انسان باشه هیچ فرقی نداره نوع و جنسش هیچ فرقی نداره يه چيزي كه ميخوام تو اين آبجكت ها ميخوام مقايسه شون كنم بايد وجود داشته باشه قانونش به نظر شما چيه كه من بتونم يه چيزي رو مرتب كنم5 تا ليوان به شما ميدم ميگم مربتشون كن چطوري ميتوني ليوان ها رو مرتب كني ميگم بر اساس اندازه همين كه قابل مقايسه باشن كافيه اصن ربطي نداره كه ابه ليوانه حيوانه يا هرچي كه باشه فقط بتوني با هم مقايسه شون كني بر اساس پارامتر قابل مقایسه مثلا من گفتم دیگه مثلا یه قابلمه با یه لیوان این دو تا رو میتونم بر اساس چی مقایسه شون کنم ؟ میتونم بر اساس ارتفاع مقایسه شون کنم بگم این دو تا رو بر اساس ارتفاع میخوام مقایسه شون کنم فقط همین برای من کافیه که قابلیت مقایسه رو داشته باشه اما فعلا تو این چیزی که میخوام در نظر بیگریم نوعش رو هم باید از یک نوع باشند (فعلا نوع را نیز در نظر میگیریم )باید قابل مقایسه باشند . خب حالا قابل مقایسه بودن رو من چطوری تعریف میکنم ؟فقط واسطش برام مهمه باید یه گذرگاهی داشته باشم الان یه لیستی از آبجکت هام رو میخوام مثلا از نوع ارایه هم باشه مثلا اسمش رو میخوام بذارم آیتمز این نوعش رو هم الان باید مشخص کنم من یه لیستی از آیتم ها لازم دارم که بعد این آیتم ها رو مرتبشون کنم با یه مثلا فرض کن چی بذاریم پرفورم مثلا یعنی شروع کن عمل کن وحالا اینجا باید چی انجام بدم ؟ مرتب سازی رو باید انجام بدم دیگه قبلا مرتب سازی رو چطوری انجام میدادیم ؟فرض کنیم میخوام از نوع استودنت میخوام اننجامش بدمخب پس الان من باید یه ستر براش بذارم و یک گتر و سازنده هم براش بزنم که لیست رو بگیره دیگه بعد میخواستم مرتبش کنم یه همچین کدی مینوشتم و یه حلقه ساده مینوشتیم . و یه دونه دیگه دوباره حلقه میخوام خب بعدش شرط میذارم اگر آیتم های i  ام کوچیکترشون پیدا شد توی آیتم های j  ام بر اساس یک پارامتری الان میایم و مینویسیمش بیاد چیکار کنه؟ تمپ رو برابر با آیتم آی ام قرار بده آیتم آی ام رو برابر با آِتم جی ام قرار بده و ایتم جی ام رو هم برابر با تمپ قرار بده بر اساس چی ؟اینش مهمه مثلا من اینجا میگم بر اساس اوریجشونمشکلاتش رو بیایم با هم بررسی کنیم ببینیم که واقعا چقدر مهمه که بتونم از یه گذرگاه عمومی تر استفاده کنم مشکلاتی که داره چیه وابستگی سورت چیه به نوع داده وابسته است یک و مشکل پارامتر مقایهس ای دارهیعنی اگه بخوام بر اساس یه چیز دیگه ای مرتب سازی انجام بدم مثلا:اگه بالایی پرفورم بای اوریج باشه و پایینی پرفورم ای دی باشه یعنی برای هر کدام از پارامتر ها م باید بیام و یه متد بنویسم که بر اساس پارامتر های مختلف بیاد برای من مقایسه انجام بده که این سخته که بیام این ها رو تغییر بدم ولی این ها یه دونه نوع داده است اگه کلی نوع داده مختلف داشتم اون موقع چیکارش میکردم اون موقع بر اساس چی این ها رو مقایسه میکردم یا اگه چیزی باهش اضافه میکردم باید کلی اینجا تغییرات انجام میدادم پس یه چیز اشتباهه پس الان وابستگی یکی نوع داده اشه و یکی هم پارامتر مقایسه ایمه خب برای حلش چیکار میکنیم ؟ برای حلش از کلاس انتزاعی استفاده میکنیم این راه حل اول مون بجای اینکه بیایم از این ها استفاده کنیمیه کلاسی هم تعریف میکنم به اسم پرسون مثلا خب وقتی پرسون رو تعریف کنم یکمی حل میشه تا اندازه خوبی وابستگی اش از بین میره اما خب بازم مشکلاتی هنوز دارم  مثلا اگه بخوام دایره تعریف کنم چی استودنت و دایره رو چطوری زیر مجموعه یه کلاس بذارم اصلا کلاس مشتری نمیتونم براشون در نظر بگیرم مگه مثلا بذارم آبجکت و آبجکت هم دیگه خیلی خیلی عمومیه و به کارمون نمیاد پس نمیتونم از سطج 2.2 استفاده کنم به چیز بهتر احتیاج دارم به این نیاز دارم که کلاس هام رو به نوع وابسته نکنم وابسته به این نکنم که از چه نوعی داره میاد داخل فقط قانونه برام مهم باشه قانونم چی باشه؟ این آیتم هایی که میاد داخل قابل مقایسه باشن قابل مقایسه بودنشون یعنی چی یعنی منبجای اینکه این طوری بنویسمش و بگم مقایسه کن این ها رو نمیتونم به نظرتون این طوری بنویسمش به نظرتون ؟ بگم که داخل این آیتمه یه متدی وجود داشته باشه به اسم کمپیربگم این آِیتم آِی مثلا فکر کن ترو فالس به من پس بدهاینی که اینجاست همین کار رو برای من انجام میده و این رو ببریم داخل متد و بجای اینکه گت اوریج و گت آی دی و گت چیز های مختلف داشته باشیم اینطوری نباشه و یه دونه متد مشترک براش در نظر بگیرم به اسم کامپیر داخل اون کامپیره بیام و بگم بر اساس اوریج انجام بشه یا چیز های دیگه مثلا بیام اینطوری بنویسمش :بعد بیاماینی که الان اینجا نوشته بودم رو بیارم داخل متد و بگم اس یک رو بر اساس اوریج و اس دو رو هم بر اساس اوریجج و بعد این ها رو ریتورن کنو یعد دویازه برم در داخل شرط و بگم کمپیر کن ایتم ای رو و ایتم جی رو درسته؟ میتونم این رو هم بنیوسم دیگهمیتونم این متد رو بذارم و بعد این کار رو انجام بدم یه کار دگیه هم میتونم انجام بدم بجای اینکه متد کمپیر رو تعریفش کنم بگم ایتم هایی که میان داخل خودشون کامپیر داشته باشن دیگه تو الان میتونی بنویسی در داخل متد گت ای دی یا گت هرچی و بجای اینکه اینطوری بنویسمش میگم ایتم خودش کمپیر داشته باشه که مقایسه بشه با یه نوع کمپیر دیگه و این رو اینطورینداشته باشه مثلا خب اینطوری بنویسمش که بگم این ایتم هایی که میان داخل کمپیر داشته باشن الان چی رو حذف کردم ؟پارامتر مقایسه ای رو در داخل سورت حذف کردم کجا منتقلش کردم ؟به خود ایتم ها منتقلش کردم به همین سادگی اما چطوری حالا بیام بگم که باید هرکی وارد این سورت ها میشه کاری ندارم که نوعش چیه فقط کمپیر داشته باشه . .. .میام به صورت اینترفیس مینویسمش میام اینجا راست کلیک میزنم و نیو و جاوا کلاساینترفیس رو انتخاب میکنم و اسمش رو میذارم کمپیربل ، قابل مقایسه به من ربطی نداره کلاس چیه هر نوعی که هست این رو مینویسم قانونم چیه ؟ قانونم اینه که باید حتما کمپیر داشته باشم و بولین پس بدنو یه ورودی از خود کمپیربل هم بگیرن میگم باید کمپیربل باشه بولین پس بده یه دونه کمپیربل هم بگیره چرا چون این رو میخام دیگهخودش کمپیر داشته باشه و یکی هم از خودش بیاد داخل که بتونه مقایسه اش کنه همین . این میشه یه اینتر فیس داخل اینتر فیس یه سری شرط و قوانین وجود داره نمیتونی فیلد تعریف کنی نمیتونی دسترسی پرایوت و پابلیک و این چیزا براش در نظر بگیری پابلیک اصن بذاری فرقی نداره پرایویت و این جور چیزا توت یه شرایط خاصی میشه ما کاری به این چیزاش نداریم تو اینترفیس های کلاسیکی که وجود داره تو شی گرایی نمیشه تعریف کرد اما تو جاوا میتونی یه سری چیزا رو پرایویت و استاتیک و اینجور چیزا تعریف کنی من فعلا بحثم اون کلاسیکه اس بعدا حالا میتونین پیشرفته تر خودتون یه سری چیز هاش رو یاد بگیریناین کلاس نیست واسطه هیچی نمیخواد براش بذاری هیچ چیزی براش نمیذاری و فقط همین جوری مینویسیش نمی تونی داخلش فیلد تعریف کنی نمیتونی متغیر تعریف کنی این جور چیزا رو نداریم داخل اینترفیس ها توی حالت کلاسیکش دارم صحبت میکنم حالا توی جاوا یه سری چیز های اضافه براش در نظر گرفتن من اون حالت کلاسیکش رو میگمالان این هیچ نوع خاصی نیست چرا نمی تونی اون فیلد و اون چیزا رو تعریف کنی؟ الان بهتون میگم که چرا اصن نباید تعریف بشهخب الان من این رو اینطوری تعریفش کردم پس میتونم در داخل سورتم بیام و بگم اینا استودنت نباشن کمپریبل باشنپس صدرصد مطمیئنم همشون کمپیر دارن به من ربطی نداره که چه آبجکتی هست فقط کافیه که کمپیربل باشه و کامپیر داره و این مرتبش میکنه برای من و دیکگه نمیخاد avg  باشهاین شد گذرگاهم حالا از اون طرفاین هم همان دانشگاه اس دیگه یه ابزاری که که میخاد به نوع داده اولیه ام مثل استودنت یا بقیه داده هام کار کنه این اون ابزاره اس این اون دانشگاهه اس یا اون خیابونه یا اون دنیای برق و الکتریسیتهواسط براش در نظر گرفته واسطش چیه ؟ کمپیربل ، کمپیربل همون پریز برقه اس برای من فرقی نداره از کدام دنیا چی میاد داخل فقط کافیه دو شاخه داشته باشه یا کمپیر داشته باشه همین برای من کافیه چظوری ازش استفاده میکن م؟ میام تو استودنتمیخام از نوع سورتت یک کلاس تعریف کنم بگم سورت مساوی با نیو سورت مثلا یه لیستی از دانشجو ها رو داشته باشم و استودنت رو از نوع ارایه تعریفش میکنم و نمونه سازیش میکنم و مقدار ده بهش میدم و یه حلقه میزنم و چند نمونه از استودنت رو میسازم .خب این الان دانشجو هامه حالا من میخوام چیکار کنم ؟میخام این رو بدم به سوت و بگم برای من مرتبش کن  اما این الان قبولش نمیکنهاما این مرتب نمینکنه چرا چون استودنت ها براش قابل مقایسه نیستن میگه تو برام بگو اینا چطوری قابل مقایسه ان من باید بیام داخل استودنت و بگمبه این شکل که در پایین میگویم قابل مقایسه است مثلا میدونید که بر اساس معدل قابل مقایسه اند اما کامپیوتر که فهم نداره من باید بهش بگم که بر اساس چی قابل مقایسه است میگم استودنت ایمپلمنت نمیگم اکستند ها قبلا میگفتم اکستند اینجا باید بگیم ایمپلمنت کمپیربل وقتی کمپیربلش میکنه خب تو وقتی کمپیربل هستی باید حتما کمپیر داشته باشی باید ایمپلمنت متد بزنم و این رو کمپیر کنم خب بعد میگه خب تو اگه کامپیربل هستی باید حتما کمپیر داشته باشیباید ایمپلمنت متد بزنم و این رو کمپیر کنمبعد حالا این جا باید بیام بهش بگم که چطوری مقایسه کن خب الان داخل استودنت ام اصلا ربطی به سورت ندارم داخل استودنت هر تغییری بدم داخل خود ابجکتمه میام میگم این ها رو بیا دیس دات گت اوریج رو مقایسه کن با اون کامپیربله چون از یک نوع هستنچون ایتم هام ارایه ان دیگهاگر من ارایه فرستاده باشم داخل هردوتاشون از یک نوع اند حالا البته اینجا یک مشکلاتی داره ها باید این رو محدودش کنمالان ممکنه یه ججاهایی اشتباه هایی باشه مثلا من یه لیستی از استودنت و سیرکل داشته باشم و بفرستم تو یه اروری بهم میده فعلا اون مشکلش رو حالا در نظر نگیریم باید یه گام بریم جلو تر که اون رو هم حلش کنیم ولی فعلا حالا اونطوری در نظرش میگیریم فرض میکنیم کاملا مشکلی نداره و درستهو این خب کستش میکنم سی رو کست میکنم به استودنت که بتونم به فیلد هاش دسترسی داشته باشم یادتونه بهتون گفتمسی رو کست میکنیم به استودنتو گت اوریجش میگم استودنت اینطوری قابل مقایسه است بهش میگم میگم اینطوری قابل مقایسه است ربطی به استودنت نداره هاربطی به استودنت نداره ها این استودنتمهولی اینطوری قابل مقایسه است .اصن ربطی بهش نداره حالا این جا ارورش رفع میشه به همین سادگی و زیبایی الان اگر اجراش کنم به راحتی اجراش میکنهاگه همین رو اینطوری برای دایره ها بنویسمشحالا میخوام این ها رو مرتب کنم بعد از اینکه این کار رو انجام دادم بعد از اینکه این کار رو انجام دادم برام استودنت رو مرتب کرده میگه سورت دات ست کن آیتم هات رو عوضشون کن و سی لیست رو بگیر و بعد دوباره سورت دات پرفورمحالا میرم سیرکل رو هم کامپیر بل میکنم میگمالان این قسمتش جالبته من یک اکستند دارم میتونم اینمپمنت هم انجام بدم میگم اینپلمنت کن کمپیربلاگر کمپیربل هستی باید حتما کمپیر داشته باشی خب کمپیر رو هم اضافه کن و میاد اینجامیگم بر اساس مساحخت برام مرتبش کنمیگم سرکلمم اینطوری قابل مقایسه اس و حل میشه حالا یه سورته که هم استودنت برای من مرتب میکنه هم سیرکل برای من مرتب میکنه هم هرچیز دیگه ای که کمپیربل باشه میتونه مرتب کنه نکته های مهمش رو جلسه بعد خیلی کامل تر میایم و بررسیش میکنیم فعلا تا اینجاش رو تو ذهنتون داشته باشین و یه خورده باهاش کار کنین ججزیات کمپیربل اینکه چه چیز هایی رو باید در نظر بگیریم چطوری من میتونم  با کلاس های انتزاعی مشترکش کنممثلا مثل اینجا چرا نمی تونم یه کلاس شیپ انتزاعی بیشتر درست کنم اما در کنارش هرچقدر که میخوایم اینترفیس رو ایمپلمنت کنیم شما میتونید ده تا اینترفیس ایمپلمنت کنید اما یه دونه کلاس میتونی اکستند کنی این ها رو میتونی روز چهارشنبه با جزیات کامل بررسی کنیم و کلی مثال حل کنیم روز چهارشنبه کلی مثال در مورد اینترفیس ها حل میکنیم فعلا تا اینجا رو تو ذهنتون داشته باشید این فوق العاده مهمه خیلی مهمه و حتما خیلی خوب یادش بگیرید کلی کار ها رو میتونید باهاش انجام بدین من هیچی دیگه تغییر نمیدم اینجا من هیچی تغییر نمیدم اینجا دیگه الان میخوای استودنت رو تغییر بدی   میای تو استودنت و پارامترش رو عوض میکنیهرچند هنوز مشکلاتی دارهاینم بهتون بگم هنوز مشکلاتی داره </description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Sun, 20 Feb 2022 21:05:56 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه نهم &gt;&gt; ioc2.2 و شروع مبحث اینترفیس ها</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D9%86%D9%87%D9%85-ioc22-%D9%88-%D8%B4%D8%B1%D9%88%D8%B9-%D9%85%D8%A8%D8%AD%D8%AB-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%81%DB%8C%D8%B3-%D9%87%D8%A7-ffi41xai4yhq</link>
                <description> ادامه ioc2.2 و ورود به مبحث اینتر فیس هاخیلی با دقت گوش کنید امروز یه خورده مطالبش اساسی و مهم هستش و خیلی میتونین ازش استفاده کنین تا اینجای کار ما مطالبی که یاد گرفتیم ارث بری ها و کلن اون چیزایی که درباره شی گرایی و سطوح ioc یاد گرفتیم با کلاس هایی بودن که ما خودمون انجامشون میدادیم امروز میخواایم یه خورده متفاوت تر کار کنیم و از کلاس هایی که توی خود جاوا هستن استفاده کنیم و اون ها رو توسعه شون بدیم در واقع ، میخوایم توسعه شون بدیم و با استفاده از اون توسعه یه کلاس پیشرفته تری رو بنویسیم چیزی که این جا داشتیم .چیزی که تا الان داشتیم کلاس هایی بود که خودمون نوشتیم حالا این جلسه میخوایم از یه سری کلاس جاوا استفاده کنیم . و اونا رو توسعه شون بدیم که حالا کد های حرفه ای تری بنویسیم و خیلی پیشرفته تر باشه و لازم نباشه خیلی از چیز ها رو من خودم دستی بیام انجامشون بدم . خب برای اینکه این کار رو انجام بدیم همون پروژه ویرچوال کلاک رو یادتونه من اومدم و اسمش رو تغییر دادم به  اسکیژولبل  تایمر یعنی تایمر قابل زمان بندی شدن چرا این کار رو کردم ؟ چون ببینید کدی که جلسه قبلی نوشته بودیماومده بودیم از این اسکیژولبل تایمر استفاده کردیم و تسک ها رو ریجستر میکردیم و بعدش استارت میزدیم و این شروع می کرد به اجرا شدن و بقیه چیز هایی که حالا داشتیم الان میخوایم چیکار کنیم ؟ من نمیخوام این کار رو انجام بدم نمیخوام بیام یه کسی رو از اول جدا داشته باشم میخوام تو کلاس تایمرم ، کلاس تایمر رو یادتونه؟تایمر رو مینوشتیم قبلا ...مثلا میومدیم تایمر رو مینوشتیم بعد از یه دستوری استفاده میکردیم به اسم از یه دستوری به اسم اسکیژول استفاده میکردیم و میتونستم به تایمر تسک بهش بدم یه دیلی و یه دوره زمانی میگرفت و این شروع میکرد به اجرا کردن .منظور خط 23 است .تسکی رو بهش میدادم و اون تسک رو برای من اجرا میکرد . حالا من میخوام تایمر رو توسعه اش بدم میخوام همین تایمر باشه ها یعنی همین کار هایی که الان میتونم انجام بدم رو باهاش انجام بدم اما میخوام یه سری قابلیت هایی اضافه داشته باشه . نمیام داخل تایمر کد بنویسم نمیام این کار رو انجام بدم میخوام خودم یه تایمر بنویسم اما لازم ندارم خودم همه چیز رو بنویسم این تایمر جدیدی که من مینویسم این قابلیت رو داره که یه سری تسک رو هم بهش ریجستر کنی واون تسک ها رو تو اون زمان هایی که براش مشخص کردی اجرا کنه برات .. .تایمری که الان داریم اینطوری نیست یه تسک بهش میدی تو اون بازه زمانی ای که بهش میدی همون تسک رو برات مشخص میکنهاما این تایمری که ما الان داریم یه جور دیگه است این مجموعه ای از تسک ها رو میگیره و توی زمان های مختلف برات اجرا میکنه .قابلیت های پیشرفض خودش رو هم داره یعنی میتونه یه تسک رو هم بگیره و تو بازه هزار میلی ثانیه ای اینو هی اجراش کنه اما من میخوام این قابلیت رو هم داشته باشه که بتونم مجموعه ای از تسک ها رو بهش بدم و تو زمان هایی که مشخص کردم بتونه اجراشون کنه میخوام از کلاس تایمر جاوا استتفاده کنم . هدف ما اینه خود تایمر این قابلیت رو داره یه دونه تسک میگیره هزار میلی ثانیه یا هر چند میلی ثانیه که بنویسی ، برات اجراش میکنه اما الان من یه کار دیگه ازش میخوام ، میخوام این قابلیت رو هم داشته باشه نباید فقط یه دونه تسک بگیره مجموعه ای از تسک ها رو بگیره توی زمان هایی که من براشون مشخص کردم اجراشون کنهاین که در خط 23 نوشتم این قابلیت رو نداره یه دونه تسک میگیره و یک ثانیه یک بار اجراش میکنه  ولی من میخوام این رو بهش اضافه کنم . خب برای اینکه این کار رو انجام بدیمچیز قبلی رو اسمش رو گذاشتم اسکیژولبل تایمر به معنای تایمر قابل زمان بندی شده برای اینکه تایمر باشه من باید اکستندش کنمباید از نوع تایمر اکستندش کنم یعنی بگم تو هم تایمری حالا چیز هایی که من میخوام رو خودم بهش اضافه میکنم قبلا در داخل کلاس ویرژوال کلاک که الان تغییرش دادیم و به اسکیژولبل تایمر تبدیلش کردیم ، یه تایمر نوشته بودیم و از اون تایمره استفاده میکردم .الان دیگه من در داخلش تایمر ندارم چرا ؟ چون خودش تایمره اصن حالا میخوام .الان اسکیژول تایمر رو بزنم خودش اسکیژول داره این همون ویرچوال کلاکه بود الان چون ارث بری کردهالان این دقیقا خود تایمره اس یعنی همون کاری که قبلا انجام میدادم االان میتونم انجام بدم اینجا یه تسک بهش بدم تاخیر بهش بدم بگم مثلا هر یک ثانیه یک بار اجراش کن یه دونه تسک میگیره مثلا میتونم ناشناس بهش بدماصلا هیچ ربطی به این ریجستر کردن ها هم نداره وولی من الان میخوام این هایی که ریجستر کردم رو اجرا کنم پس من الان به یه اسکیژول نیاز دارم  که فقط تاخیر رو بگیره و اون بازه زمانیش یعنی بین این اسکیژول هایی که وجود دارهنگاشون کنین این چهار تا من یه دونه دیگه باید بهش اضافه کنم که فقط زمان رو بگیره و اون دوره زمانی رو بگیره تسک رو نگیره تسک رو میخوام درون خود تایمره تعریفش کنم یعنی بگم اگر یکی اومد ازاین مدل اسکیژول استفاده کرد .و این تاخیر و دوره زمانی رو وارد کرد بره تسک های ریجستر شده رو فقط اجرا کنه اگرم اومد و تسک بهش داد خب تسک رو اجرا کنه اگر ن اون هایی که ریجستر شدن رو اجرا کنه من الان نیاز دارم در داخلاسکژوبل تایمر یه متد دیگه خودم اضافه کنماگه یه لحظه برم تو تایمر و برم ببینم چی داخلشه  یه سری چیزا داخلشه و یه سری سازنده داره و متد هایی مثل اسکیژولمثلا این و منم الان یکی می خوام عین همین باشه که الان کپیشم میکنم  درونش رو همه رو حذف میکنمخط 17 ام همونهکه اوور رایدش کرد ببینید داره اورر رایدش میکنه ولی من   نمیخوام اوررایدش کنم من میخوام در واقع یه جورایی اورلودش کنم در واقع یعنی یه حالت های دیگه ای هم داشته باشه ببینید من الان اون رو حذف میکنم ببینیند الان یه متد جدیدهکه تاخیر داره و دوره زمانیالان اگه دقت کنین شده 5 تا که 4 تاش مال جاواست و یکیش مال منه که همون اولیهخب الان من میخوام این اولی رو پیاده سازی کنم که تسکی که داخل تعریف کردم رو اجرا کنه برام   کافیه بیام متد اسکیژول اون یکی رو صدا بزنم بگگم کدوم رو اجرا کن؟ بگم تایمر تسک رو اجرا کن با این تاخیر و این دوره زمانیو میاد این رو برام اجراش میکنهو من الان اینجا بنویسم اسکیژول تاخیر نداشته باشه و یک ثانیه ای برام انجامش بدهاین دیگه مثل اون ویرچوال کلاکه نیست ها این واقعا تایمره که فقط این قابلیت رو داره میتونه ریجستر کنه یه مجموعه تسک رو تایمری که قبلا داشتیم یه دونه تسک داشت اجراش کنم مثل قبلیه دقیقا اجرا میشه و مشکلی هم نداره البته کلاکش رو برداشتمخط24الان همه چی اجرا شد دقیقا همون کار ها رو برای من انجام داد و چون کلاکش رو نزده بودم در کنسول نزده وگرنه میزد .این توسعه پذیری هستش وقتی بهتون میگم توسعه پذیری یعنی این یعنی شما کلاس هاتون کد هاتون یه جوری باشه که بقیه بتونن توسعه بدن یه چیزی بهش اضافه کنن و استفاده کنن برای کاربرد های خاص خودشونقسمت اسکیژول یه متد خیلی ساده است چون اسکیژوبل تایمر داره تایمر رو اکستند میکنه داخلش میتتونی به همه متد هایی که وجود داشتن دسترسی داشته باشیمثلا این ها همش توی تایمر هستن اما این الان فرزندشه . .مثلا تسک دیگهالان ببینید تسک مگه این نیست من الان متد ران و تایم استمپ دارم اینجا دیگه و تو اسکژول چون این رو به ارث برده میتونم اون بیام بگم : گت تایم استمپ :و صداش بزنماینم همینه چون من الان ارث بردم از تایمر تمام متد هایی که هستن رو الان اینجا من میتونم ببینمشوناسکیژولی که اینجا هست و سه تا ورودی میگیره  این مربوط به خود تایمرهاینی که من اینجا نوشتم دو تاست اما اسکیژول داخل متد همونی هستش که در داخل کلاس تایمره شما میتونید از اون ها استفاده کنینیعنی از این چهار تای بالا میتونین استفاده کنین اینا مربوط به خود تایمر هستنخب من خیلی ساده گفتم که اون اسکیژول خودش رو صدا بزن تایمر تسک رو بهش بده دیلی و پریود. تایمر تسک چیه ؟ اینیه که اینجا نوشتمدرسته؟ خیلی هم عالیاین اسکیژول با خط بالاییش قاطی نکنین بالایی چیزی هست که من نوشتم و پایینی چیزی هست که داخل خود تایمره .میتونید دیگه مثلا من میتونم چند تا ریجستر بنویسم :و دیگه باید نوعش فرق داشته باشه و بجای اینکه تسک بگیرم اینت میگیرم یا اصن دو تایی میگیرم ، تسک رو میگیرم یه دونه دیگه هم میگیرممیتونی چند تا بنویسی حالت های مختلف ریجستر . .اینم الان همون طوریهحالت های مختلف اسکیژول هستش چهار تا خودش داشت یه دونه هم من اضافه کردم بعد گفتم تو اینی که من اضافه کردم بیاد یکی از اون چهار تا رو صدا بزن که داخل خودشه .خب این تا اینجا حالا میخوام یه کار دیگه انجام بدم به نظر شما این کد وابسته است یا ناین قسمتخب این قسمت وابستگی داره کسی میدونه چه واابستگی ای هست ؟ وابستگی به کنسول هستش چون در خط 24 از سی اوت یا چاپ کردن استفاده کردیم .مگه من نگفتم که نبابید همچین چیزی بنویسیم الان برنامه من حتما باید صدرصد تو کنسول اجرا بشه چرا چون این رو اینجا نوشتم خب شاید من نخوام اینجا بنویسمش خب اصن نخوام تو کنسول اجراش کنم فرض کن یه برنامه نوشتم گرافیکی که یه لیستی از تسک ها رو گذاشته برای من و بعد گفته تسک یک دو سه چهار و جلوشونم مثلا یه دایره ای گذاشته میخوام برنامه ام اینجوری باشه که وقتی اجراش کردم تسک یک که اجرا شد زمانش رو هم نشان بده و بگه این زمانه و وقتی بهش رسید یه تیک بزنه جلوش که مثلابگه این ها اجرا شدن که تیکشون بزنه و بره جلو ولی اینی که من نوشتم ن دیگه همچین قابلیتی ندارم   اصلل این مطلب که چطوری از لحاظ تئوری ... حالا تئوریش رو شنبه بتون میگم باید از اینتر فیس استفاده کنین امروز میخوام یه استفاده ازش بگم که بدونین چه چیز مهمیه شنبه میریم تو مباحث عمیق و بنیادیش و ioc3  رو میگیم امروز نمیخوایم در مورد تئوریش بگیم فقط میخوایم ازش استفاده کنیم . که یه همچین مشکلی که مشکل مهمی هم هست حلش کنیم برای اینکه این رو حلش کنیم  در واقع من باید چیکار کنم ؟این چاپ کردن چیه؟ یه کاریه درسته ؟ جز یه کار حساب میشه چاپ میکنه یه چیزی رو برای من چاپ میکنه من میتونم بجای اینکه چاپ کنم کارم این باشه که توی یه تایمر گرافیکی نشونش بدم و وقتی اجرا شد بره برام تیک بزنه ، کاره دیگه پس در واقع من باید وابستگی به این کار رو از بین ببرم یه زمانی من باید کاری رو که میخوام داخل انجام بشه از بیرون بفرستم یا همان دپندنسی اینجکشن انجام بدم بگم اینجاا این کار رو اانجام بده توی این خط این کار رو انجام بده و این کار ها از کجا باشن؟از بیرن بیان داخل بعدش میخوام این کد اجرا شه از قبل نمیخوام بگم این کار رومیخوام از بیرون کار رو بفرستم تو که هر کسی اگر خواست از این سیستم استفاده کنه توی جا های مختلف توی شرایط مختلف بتونه استفاده کنه و کار های خودش رو بفرسته تو .مثل چی میمونه کار ؟ دکمه شما تو جاوا توی قسمت گرافیکی تون وقتتی که میخواین یه دکمه میزنین رو صفحه تون دکمه تون از قبل که نیومده تو جاوا یه کاری رو توش بنویسه بگی این دکمه هر موقع زده شد اون کاری که من از قبل گفتم رو انجام بده اینطوری نیست ک هر موقع دکمه رو میزنین کاری رو که خودتون براش تعریف میکنین رو اجرا میکنه یا هر چیز دیگه ای هر چیز گرافیکی ای هست دیگه محیط گرافیکی که کد می نویسی براش دکمه میاد رو صفحه ات بعد میخوای کدی که تو میگی رو اجرا کنه ن اینکه چیزی که از قبله پس باید یه کار بفرستی داخل دکمه هه پس این یه چیز خیلی مهمیه اصن یه چیز خیلی خیلی اساسی و مهمیه تئوریش رو شنبه بهتون میگم امروز فقط میخوایم ازش استفاده کنیم . باید از اینترفیس استفاده کنیم .  و توی اینترفیس ها باید از یه چیزی استفاده کنیم به اسم اینونت هندلر هندل کننده رخداد هارخداد یعنی چی مثلا اگر اومد خط 24 این یه رخداده دیگه اگر اومد داخل این یه رخداد اتفاق افتتادهبیا این کار رو انجام بده اگر اومد داخل ایف و این کار انجام شد این یه رخداده یه اتفاقی افتاده بیا فلان کار رو انجام بده بعد از اینکه همه این ها رو انجام دادی اومدی این پایین مثلا بیا اینجا کاری انجام بده میتونم همه رو بنویسم دیگه و اینکه از رخداد ها استفاده کنیم داخل خود جاوا یه چیزی داریم به اسم ایونت هندلراما اینی که توی جاواست یه خورده پیچیدگیش زیاده و یه سری چیز های اضافه تر میخواد این هایی که هستن مربوط به جاوا هستن اما اون اولی رو من نوشتماینی هستش که اونجا نوشتمش چی داخلشه ؟هیچی توش نیست به غیر از یه چیزی به اسم هندلر اینا چی هستن بهتون میگم بعدا فقط الان میخوام ازش استفاده کنیم اصلا نمیخواد بدونین چیه فقط یه چیزی داریم به اسم ایونت هندلر برای تعریف کردن ایونت هامون ، هندل کننده رخداد هامون داخلش یه چیزی هست به اسم هندلر خب من میام برای اینکه کار هام رو مشخص کنم برای هر جایی که میخوام یه کاری انجام بشه میام یه فیلد براش میسازم مثلا میگم ایونت هندلر ،مثلا میخوام یه کاری انجام بشه قبل از هرچیزی ، قبل از اینکه هر کدام از این کد ها اجرا شهمیخوام اون اجرا شه اسمش رو میذارم مثلا پرکلاک یعنی قبل از کلاک اتفاق بیفته یعنی اجرا شه یعنی میخوام وقتی که تسکم اجرا شدیعنی بیاد اینجا شرطم برقرار بود تسکم اومد اجرا شد و امد اینجا . میخوام وقت تسکم اجرا شد یه کاری هم اینجا اجرا بشهیه اتفاقی اینجا هندل بشه میام یه دونه دیگه هم فیلد تعریف میکنم مثلا همه متغیر هایی که تا الان تعریف میکردیم اسمش رو میذارم ان تسک فینیشدر لحظه تمام شدن تسک یه دونه اهم میخوام اصن کاری به این نداشته باشمکل  این ها اجرا شد بعدش بیاد یه کاری انجام بشه حالا من یه سری چیز ها اینجا مینویسم لازم نیست برای خط به خط این ها اینطوری بنویسم میخوام چند تا بنویسم که بدونین چند تا میشه نوشت شما بر اساس نیازتون ممکنه یه دونه اصن ممکنه نخواید ممکنه جاهای مختلف برای کار های مختلف بخواید حالا من چند تا نوشتم که بدونید دیگه یه دونه دیگه میام مینویسمایونت هندلر افتر خب فیلد ها چی میخوان برای اینکه بخوام باهاشون ارتتباط برقرار کنم؟ ستر و گتر برای این سه تا ستر و گتر میذارمخب این ستر و گتر هاشون که کاریش ون ندارم و میبندمشون این از ستر و گتر ها حالا کافیه اون جاهایی که میخوام اجرا بشن صداشون بزنم داخل هرکدومشون الان یه متد هندل وجود دارههرجا میخوام اجرا بشه میام مینویسممن اینطوری تعریفش کردم که ساعته رو هم بفرستم به عنوان ورودی ساعته رو هم بهش بدممثلا میگم کلاک بعد از اینکه تسک اجرا شد میگم آن تسک فینیش هندل و کلاک رو داخلش مینویسم .بعد از اینکه وظیفه این قسمت هم تمام شددوباره میزنم افتر کلاک و ورودیش رو کلاک میدم . اما این ها چین و چی اجرا میشه الان به نظرتون چی اجرا میشه به نظرتون میخوام چیکار کنم ؟ از چه قابلیتی استفاده کنم ؟ اووراید میخوام انجام بدم ، رونویسی رو چطوری انجام بدم ؟ مگه این ها یه متغیر نیستن ؟مگه قبلا برای این تسکه نذاشتم اینم متغیره دیگه از بیرون سند ایمیل رو میفرستادم رو نویسی شده میومد داخل همشون گت تایم استمپ داشتن ران رو هم داشتن خب الان اینم هندله دیگهمن از بیرون هر کلاسی زیر مجموعه این ایونت هندلره بفرستم داخل هندلش اورراید میشه پس کار من رو انجام میده در واقع چطوری حالا انجامش بدم ؟ کافیه بیام داخل مین قبل از اینکه اسکیژول انجام بدم بیام بگم اسکیژولبل تایمر دات ست پرکلاکش از یه چیزی استفاده میکنم که یه خورده براتون فرق دارهدو تا کار میتونم انجام بدم مگه من نمیخوام چاپ کنم فقط باید بیام ارث بری انجام بدم دیگه یه جورایی حالا این ارث بری نیست ولی شبیه اونهمثلا باید بیام اینجا و بسازم کلاس پرینت کلاک رو بعد این رو بیام چیکار کنم؟اکستند که نمیتونم یه کار دیگه باید انجام بدم که شبیه همون اکستنده جلسه بعد بهتون میگمش ایمپلمنت اسمشه مثل همون اکستنده اس بعد بگم ایونت هندلرمثل همون دقیقا باید بیام اور رایدش کنم و بعد بیام اینجا و بگم سیستم دات اوت پرینت لاین کلاکخب ممکنه بگی این که خیلی بد ترش کردی کلی دوباره کلاس اضافه کردی خب اون اولی که بهتر بود که من میومدم کار رو از پیش تعریف میکردم همون اونجا چاپش میکردم چه کاریه بیام کلاس بسازم و از این حرفا برای یه دونه سیستم دات اوت پرینت لاین میتونم یه کار دیگه انجام بدم اگر کارم خیلی چیز عجیب غریب و پیچیده ای هستش و نیاز دارم اصول مهندسی رو روش رعایت کنم و توی برنامه های مختلف میخوام ازش استفاده کنم مثلا از این پرینت کلاکه توی خیلی از برنامه های مختلف میخوام استتفاده کنمو خیلی چیز مهمی هستش برای من و ممکنه حالا پرینت کلاک ن مثلا یه کار دیگه ایه بعد مثلا هزار خط کده دیگه کللی چیز مهمه از خیلی چیز های دیگه هم توش استفاده کردم میام کلاس براش میسازم کاملا منطقی هستش باید بسازم براش اما یه کار دیگه هم میتونم انجام بدم اصن نیازی نیست من برای یه سیستم دات اوت یه کلاس بنویسم به جاش از یه چیزی استفاده میکنم به اسم کلاس ناشناس کلاس ناشناس یعنی چی ؟ یعنی کلاسی که اصن فایلی براش ایجاد نمیکنی اسم اصلا نداره کلاس یه بار مصرف یه بار ازشااستفاده کنم تمامه یک بار مصرف باشه چه نیازی دارم برای یک سیستم دات اوت بیام یه کلاس بسازم اینجا مینویسمش چاپ رو برای من انجام بده و تمام یه بار استفاده کنم و تمام بشه بره پی کارش نیازی نیست که کار های عجیب غریب انجام بدی و و کلاس بسازی حالا این کلاس ناشناسی چطوریه من وقتی یه کلاس ساختم چیکار کردم ؟ عملیات فرض کن این همون ارث بری اسارث بری نیست ولی فرض کن همونه ارث بری انجام دادم بعد اومدم ااورراید کردم و بقیه کارهامون دیگه حالا همه این کار ها رو میتونم خیلی ساده تر انجام بدم این قسمتش رو اصن حذف کنمکافیه جلوش بنویسیم نیو یه پیشنهاد برات میاره نوشته از نوع ایونت هندلر که جلوش از این کروشه ها زده میتونی از پرینت کلاک هم بزنی ولی هیچی جلوش نیست ولی اون اولی رو که بزنیروش اینتر بزنی و یا دابل کلیک کنی روش همچین کدی برات می نویسه این کد این قسمتشدقیقا ارث بریه رو داره انجام میده و یا اون اینپلمنته قسمت پایینش هم که همنو اووراید کردنشاین الان دقیقا از خط 24 براکتش تا خط 30دقیقا همین چیزی هستش که اینجاست دقیقا مث هم هستنفقط برای اینکه این پابلیک کلاس و ایمپلمنت و اینا رو نیام بنویسم کل این ها خلاصه شده توی این :این نیو ایونت هندلر یعنی بیا یه کلاس بساز ایمپلمنت کنه یا ارث بری کنه از ایونت هندلر و بقیه چیزاش اسمی نداره دیگه به خاطر همین میگیم ناشناسه اسم نداره تو نمیتونی از این کلاست نمونه بسازی دیگه یک بار ازش ازث میبره و نمونه اش رو هم میسازه تمام .دیگه ن میتونی ازش نمونه بسازی و ن هیچ چیز دیگه یه بار نمونه ساخت تمام شد رفت . ن میتونی ارث بری  کنی ازش چون اسم نداره و ن هیچ کار دیگه ای . هر جایی هم میتونی ازش استفاده کنی میتونی تو متغیر تعریفش کنیمن الان مثلا ایونت هندلره رو مینویسم اینجا بعد میام مینویسم اچ مثلا و بعد اینو میریزم داخل یه متغیراین الان میاد یه بار ارث بری انجام میده نمونه سازی میکنه و نمونه اش رو میریزه داخل ایونت هندلر اچ ولی دیگگه نمیتونی هیچ وقت دیگه ازش نمونه بسازی یک بار مصرفهاسکیزولبل تایمر ست کنه پرکلاک رو و این کار رو برای من انجام بده کاره یک بار مصرف نیست ها نمونه اش یک بار مصرفه یک بار ازش نمونه ساخته میشه اما میتونی هزار بار صداش بزنی یعنی اجراش کنی الان این رو من گذاشتم داخلش چه کاری میخوام انجام بشه ؟سیستم دات اوت میخوام برای من انجام بشه نیازی نیست این رو ازش کلاس بسازم . کلاسی هم که ساخته بودم رو هم حذف میکنم . الان پر کلاک نمونه ساختم که این داخلشه میام داخل اسکیژولبل تایمراین الان پرکلاک اومدم یه نمونه ساختم این داخلشه میاد داخل اسکیژولبل تایمررییت شده هندلشهر موقع میرسه به این پرکلاک دات هندل کلاک رو میفرسته براش هندلش میکنه میاد این کد داخل این رو اجرا میکنهاز بیرون کار رو فرستادم تو خالا اون یکیش رو هم میام مینویسم میگم : اسکیژول تایمردات ست کن آن تسک فینیش میگم هر وقت تسک تمام شد بیا چیز دیگه چاپ کن بیا بگو مثلا  تسک تمام شدهتسکه اجرا شد یا یه اسکیژولبل تایمر دیگه میسازم و ست میکنم افتر کلاک رو و میگم هر وقت تمامش کردی این کلاکت رو یه خط بکش حالا من این ها رو نوشتم ممکنه شما هزار کار دیگه انجام بدین عین همون باتم هستش دقیقا عین همون باتم هستش فقط تو باتمه میگی وقتی اومد کلیک کرد این کار رو انجام بده من میگم چی ؟ میگم هر موقع رسیدی به این کد انجام بده هر موقع رسیدی این اتفاق افتاد شرطت پذیرفته شد اومدی ران کردی این رو انجام بده هر موقع این ها تمام شدن و رسیدی به اینجا انجام بده الان این کار ها رو پشت سر هم انجام میده ببینیم انجام مید ه:: برای تسک هام باید تسک هز کامپلیتد بنویسه برای اون یکی ها هم فقط باید کلاک رو بنویسه و خط بکشه زیرشکلاک میزنه خط میکشه کلاک میزنه خط میکشه برسه به یه تسک تسک کامپلیتد رو هم مینویسهتسک رو اجرا کرد سند ایمیل کردکار منم انجام داد بقیه کار ها هم دقیقا همینطوره ببین چقدر کد های قدرتمند با شی گرایی میتونی بنویسی چقدر جالب و چقدر حرفه ایه حالا فرض کن تو این رو وابسته اش میکردی حالا من این رو نوشتم سیستم دات اوت فلان این کار رو انجام بده شما این رو میتونستی چطوری بنویسی ؟ میتونستی اینطوری بنیوسی   مثلا فرض کن محیط گرافیکیهاین کلاکت رو که مقدارشه تو یه تایمر گرافیکی ست میکردی تایمرتو تغییر میداد توی برنامه گرافیکی حالا </description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Sat, 19 Feb 2022 21:31:58 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه هشتم &gt;&gt; ساخت ساعت مجازی ، استفاده از تایمر و تایمر تسک و ادامه پروژه</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D9%87%D8%B4%D8%AA%D9%85-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%B3%D8%A7%D8%B9%D8%AA-%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%D8%A7%DB%8C%D9%85%D8%B1-%D9%88-%D8%AA%D8%A7%DB%8C%D9%85%D8%B1-%D8%AA%D8%B3%DA%A9-%D9%88-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-parbpwvxargg</link>
                <description>چیز خیلی مهمی که توی ویرچوال کلاک یاد گرفتیم این بود که ioc2  بود که در موردش حرف زدیم .هدف ما این بود که بیایم و یه سیستمی داشته باشیم که یه گذر گاه عمومی داشته باشه که من بتونم کار های مختلفی رو بهش ریجستر کنم و توی زمان های خاصی بیاد و برای من اجراشون کنه این چیزی بود که جلسه قبلی اومدیم و انجامش دادیم . اومدم براش ویرچوال کلاک تعریف کردم . ویرچوال کلاکم رو ریجستر میکنه یه تسکی رو توی لحظه ده علی .و توی لحظه بیست رضا و . . .خب حالت های مختلفه دیگه وقتی که این استارت میزنمبا دوره های زمانی هزار میلی ثانیه ای . یعنی اگه اون بالایی ده هست یعنی ده تا از این هزار میلی ثانیه ها (که میشه یک ثانیه ) یعنی در اصل ده ثانیه طول میکشه که یه ایمیل به علی بفرسته .خب نکات خیلی مهمی که داشت رو یک بار دگیه بهتون میگم . که کامل براتون جا بیتفه .یکی اینکه من گذرگاهم یک مرحله عمومی تر بود یعنی اینکه بجای اینکهاگه بجای اون تسک ، سند ایمیل رو میذاشتم چه مشکلی پیش میامد ؟فقط سند ایمیل رو میپذیرفت و به بقیشان ارور میداد همان طور که در عکس پایین میبینین که قرمز شده :چرا چون اصلا نمیشناسه که سورت فایل چه ربطی به سند ایمیل داره اصلا اونا رو نمیشناسه و بهم ارور میده ولی خب از اونجایی که من میخوام عمومی سازی داشته باشم و کلاس هام یه جوری باشن ک تا حد ممکن بتونم ازشون استفاده کنم خب این کلاس رو باید یه خورده تغییرش بدم که عمومی تر بشه ورودیش . یعنی درگاه ورودیش رو یه مرحله میخوام عمومی ترش کنم .خب این یه مرحله عمومی ترش کردن من چی گرفتم برای عمومی کردن : حذف وابستگی از یه نوع داده خاص و وابسته کردنش به یه نوع داده عمومی تر به همین سادگی حالا این نوع داده عمومی چیه ؟ همون ارث بری هستش یه سوپر کلاسیعنی اگه یه سوپر کلاس داشته باشم کاگه بیام ورودی مان رو بر اساس سوپر کلاس تعریف کنم همه فرزند هاش رو می پذیره ولی خب ممکنه سوال پیش بیاد خب این تسک های مختلف کار دارهو این کاری که اینجا وجود داره اصلا به درد من نمیخوره تا زمانی که وارد حالت خاص نشم .شما یه تسک رو بگو که کار داشته باشه کدومتون میتونین بگین یه تسک رو که کار داشته باشه خود تسک ها . . وقتی ازتون میپرسم یه تسکی رو بگین که کار داشته باشه یعنی یه تسکی رو بگین که بتونه اجرا شه و کاری رو انجام بده  چی میاد تو ذهنتون؟ سریع زیر مجموعه اش میاد تو ذهنتونوظیفه رو به عنوان یه مفهوم انتزاعی میبیند شما خب این وظیفه است من به شما میگم این وظیفه رو انجام بده چه سوالی از من میپرسید؟ سریع میپرسید که کدوم وظیفه ؟ من باید تعریف کنم بگم وظیفه ارسال کردن ایمیل ها وقتی این رو برات تعریف کردم حالا میدونی که چکاری باید انجام بدی میری تو قسمت انجام کارش میگی این ادرس ایمیلش هستش این سرویس ایمیلشه از طریق این سرویس این ایمیل رو به این ادرس ارسال کن درسته ؟ مثل همون شیپ افرین . برای شیپ چیکار میکنیم ؟ برای شیپ هم دقیقا همین داستان رو داریم من بهتون میگم یه شکلی رو بکشید . کدومتون میتونه شیپ رو بکشه هیچ کدومتون نمیتونیند شیپ ( شکل بکشید ) سریع ازم میپرسید که چه شکلی رو بکشم؟ یعنی شما زیر مجموعه میخواین بهتون میگن دایره بکشین بعد حالا که میگم دایره بکشین همتون بلدین کار دایره کشیدن چطوریه و میاین میکشین میگم مساحت شکل رو حساب کن میگی چه شکلی ؟ میگم دایره و چون میدونی دایره چیه پس الان میدونی مساحت دایره رو چطوری حساب کنی پس اینجا یه سری چیز ها هستن که خودشون کاری ندارن زیرمجموعه هاشون در واقع عملیاتی هستن برای من .خب اینجا الان من دقیقا همچنین داستانی دارماین جا اومدم ارث بری انجام دادم سوالی که ممکنه برتون پیش بیاد اینه خب همین ویژگی ها رو بذارم داخل این تسک و مشکلی هم نبود درسته مشکلی نبود  تا زمانی که فقط میخواستم از سند ایمیل استفاده کنماما وقتی که میخوام این رو بفرستم داخل یه تابع یک ابزاری و اون ابزار کاری رو برام انجام بده دو تا کار میتونم انجام بدم یا ابزار باید خصوصی باشه یا ابزار باید عمومی باشه اگر ابزار خصوصی باشه فقط همون کلاس رو میتونه برام کار روش انجام بده اما اگه ابزارم عمومی باشه میتونم باهاش کار های مختلفی رو انجام بدم مثل چی میمونه مثل اچار فرانسه مثلا شما اچار های خصوصی برای مدل پیچ های خاص دارین دیگه اونا خاص همون یه کار هستن تو نمیتونی اونی که برای 2 هستش برای 5 استفاده کنی . اما اچار فرانسه عمومیه تو میتونی تعمیمش کنی و برای هر پیچی که میخوای ازش استفاده کنیفرق ابزار عمومی با ابزار خاص همینه من یه جاهایی یه سری کلاس های خاص دارم و یه جاهایی کلاس هایی دارم ک باهاشون میخوام با این کلاس های خاصم کاری انجام بدم اون کلاس هایی که میخوام باهاش با کلاس های خاصم کاری انجام بدماین خیلی خیلی مهمه دو قسمت داریم یک قسمت مون مدل های اصلیمونن که قراره بیس کار ما رو در نظر بگیرن و یه سری کلاس هم داریم مدل های ابزارمون هستن هستند که قراره مدل های اصلیمون رو دستکاریشون کنن باهاشون یه سری کار ها انجام بدن مدیریت کنن و از این مدل چیز ها . خب اون کلاسی که میخواد با این ها کار کنه هر چقدر عمومی تر باشه برای من بهتره اللبته در صورت امکان برای من بهتره چون میتونم محدوده کلاس های بیشتری رو پوشش بدم و نیازی نیست کلاسی رو از اول بنویسم و این مسئله وظیفه اش رو چیکار کردیم ؟ مسئله وظیفه اش رو هم اینطوری حل کردیم که داخل جاوا یه چیزی داریم به اسم اوور راید کردن رو نویسی کردن رو نویسی کردن یعنی چی رو نویسی به این معنا نیست کههمین جا رو نویسی شده ها اا به این معنی هست که وقتتی بیای داخل یه نوع داده داخل سوپر کلاسش قرارش بدی رو نویسی میشهیعنی اینطوری اگه بنویسیش وقتی این رو تعریفش میکنی این سند ایمیل تو یه سری ویژگی خودش داره یه سری ویژگی هم از سوپر کلاسش به ارث میبره علاوه بر یه سری ویژگی یه سری رفتار هم داره به ارث میبره این رفتار ها یه تابعی هست به اسم ران این تابع ران رو هم به ارث میبره وقتی که من میام این رو مینویسمبه این معنیه که این ران رو به جای اونی که داره به ارث میبره رو نویسی کن  و زمانی که من بیام و این کار رو انجام بدماین باعث میشه اورراید شده داخلش قرار بگیرهو کاری به این ران نداره و اوور رایدش میکنه این قابلیت های زیادی برای من داره چرا چون وقتی وارد یه محیط عمومیش میکنم و اصطلاحا اینجکتش میکنم داخل این محیط چه اتفاقی میفته ؟کاراشون رو نویسی شده پس کار های متفاوتی رو برای من اجرا میکنه .دو تا بالایی متد هستن ولی پایینی متغیر هست و از نیو به بعد رو مقدارش در نظر میگیریم . تسکش چیکار میکنه؟میگه اولا بیا کلاک رو چاپ کن بعدشم گفتم اگر اون هش مپه این کلاک رو داره ( هش مپمون رو میتونستیم با اندیس های نامنظم مقدار دهیش کنیم )این کلاکه نشون میده ببین این اندیسه توش هست یعنی اینکه یه کاری اینجا وجود داره یعنی یهه کاری داخل اون هش مپ ریجستر شده اون زمان اون کاره رو که قرار داره رو رانش کن و ران که میشه میاد و این رو در نظر میگیرهاما چون ران رو نویسی شده در ساب کلاس هاش اور راید شده ها رو میاد و اجرا میکنه برای من . و من این رو داخل این تایمر تسک قرارش دادم .خب این تا اینجا حالا یه سری مشکلات داریمیکیش اینهاگه من در خط 28 این رو بنویسم اگه این اتفاق بیفته چی میشه ؟ میگه تسک رو ریجستر کن توی 19 خب تسک رو ریجستر کن یعنی چی ؟ تسک که هیچی نداره تسک که هیچی نداره . وقتی میگم بیا یک کاری رو انجام بده ازم میپرسی چ کاری درسته ؟خب الان این چیو میخواد برای من انجام بده داره میاد که یه متد خالی رو اجرا کنه پس یه مشکلی اینجا هست داره یه چیز بی خودی که اصلا وجود نداره رو اجرا کنه این یه مشکل پس راه حلش چیه ؟ راه حل اینه که نباید بتونیم از این نمونه سازی کنیم . پس این مشکل و نکته اول .خب مثلا یه تسک تماس گرفتن میخوام بنویسم بعد میام داخلش میگمخب باید از تسک ارث بری که چرا ؟ چون گذرگاهم تسکه برای اینکه یه چیزی رو ریجستتر کنم باید حتما تسک باشه خب این میگه حالا که تسکه باید حتما کانستراکتور حتما داشته باشه ممکه کاری چیزی پیش بیاد یادم بره این رو کنترلش کنم یا یه چیز دگیه من این رو به صورت کتاب خونه تعریف کردم ویرچوال و اینا رو و این رو یه نفر دیگه داره ازش استفاده میکنه و تو اینترنت گذاشتم و اومدن و پول دادن خریدن و خیلی چیز های پیچیده و پیشرفته است که واقعا کار میکنه و یعنی باید بیاد تسک های مختلف رو اججرا کنه واقعا و نوشتیمش گذاشتیم تو اینترنت خریدن و حالا خودش میخواد توسعه اش بده و میگه میخوام یه تسک دیگه خودم اضافه کنم بعد میاد و این رو مینویسهخط 31اجرا میشه و انگار هیچ مشکلی هم نداره و هیچ اروری هم نداره اما مشکلش کجاست کال تسک وظیفه فاش رو خودش انجام نداده این یعنی چی ؟این یعنی چی به نظرتون بچه هااین دو تا مشکل یعنی چی دقیقا ؟ یعنی در واقع کال تسک انجام میشه اما چون خودش کاری نداره پس چیزی هم اور راید نکرده پس میاد همین وظیفه این رو انجام میده که خالیهحالا این دو تا مسئله با هم دیگه تو این سیستم چه چیزی رو دارن به من میگن ؟ کسی میتونه بهم بگه ؟ چه مفهومی رو میخوان به من بگن ؟ عدم مهندسی هستش اما از چی داره میاد ؟ همون مسئله اساسی و بنیادی ای که همیشه داشتیم مسئله ابهام . چرا ابهام داره ؟ چرا این الان ابهام داره بچه ها ؟ بخاطر اینکه من نمیدونم مطمئن نیستم هیچ اطمینانی ندارم هیچ اطمینان خاطری از این ندارم که صد در صد تسک هایی که در ویرچوال کلاک ریجستر میشن وظیفه خودشون رو دارن به من ربطی نداره که وظیفه خودشون رو دارن درست انجام میدن یا ن فقط این برای من مهم هستش که وظیفه خودشون رو تعریف کردن حالا میخاد اشتباه باشه به من ربطی نداره سیستم من درسته اون داره اشتباه انجام میده ااون وظیفه ای که براش در نظر گرفته شده حالا میخاد اشتباه باشه یا نباشه به من ربطی نداره اما من ابهام دارم الان فرض کن اومدم پایین تر همه جا دارم کد مینویسم یا اینکه مثلا صد تا کلاس نوشتم اومدم تو دو تا کلاس دیگه از ویزوال کلاکه استفاده کنم دوباره میتتونم اطمینان داشته باشم وقتی مینوسم ویژوال کلاک و مثلا میام بگم استارت کنممیتونم اطمینان داشته باشم که ایا همه اون تسک هایی که براش ریجستر شدن تسک خودشون رو دارن ؟ ن نمی تونم مبهمه چون یه سری از کلاس ها اینجا وجود دارن که وظیفه خودشون رو نیومدن پیاده سازی کنن یا اینکه یه سری هاشون اشتباه ان مثل این :گفته تسک اصن تسک چیه ؟ ! بیا تسک رو اجرا کن یعنی چی نباید من مشخص کنم چه تسکی ؟! این دو تا مسئله اساسی اینجا وجود داره که باعث میشه نیاز خیلی خیلی اساسی میشه برای من و اون نیاز چیه؟ نیاز به ایجاد قوانین درسته که تسک میپذیره ویرچوال کلاک اما من میخوام یه سری قانون هم براش بذارم دیگه هر کی به هر کی هم نباشه که هرچی خواستی بذاری یه سری چیز ها رو باید رعایت کنی که من بپذیرمت میگم باید اولا از نوع تسک باشی اون از گذر گاه عمومیت حالا این گذر گاه عمومی رو میخوام یه خورده خاصش کنم یه خورده بسته ترش کنم که دیگه خیلی هم به این حالت عمومی نباشه یه سری جا ها من نیاز دارم اون طوری باشه به این معنی نیست که الان صد در صد باید از همین استفاده کنمبسته به نیازم توش شرایط مختلف الان تو این حالت من نیاز دارم تسک هایی که تو ویرچوال کللاک ریجستر میشن معتبر باشن ن هر تسکی باشه اعتبار تسک هام رو چطوری تعریف میکنم برای اینکه معتبر باشه باید چی باشه به نظر شما ؟ شما این رو به من بگین دو تا چیز باید رعایت بشه پسورد نباید داشته باشه قانون باید داشته باشه عمومی باید باشه اما ن خیلی عمومی من میخوام یه خورده محدودش کنم الان برای اینکه این شرایط رو بهترش کنم دو تا کار باید انجام بدم اولا نباید بذارم از تسکی که معنی خاصی نداره بیاد داخللشاین یک یعنی از سوپر کلاس اصلا نباید کسی بتونه نمونه بسازه و یکی دیگه این که من باید تمام کلاس هایی که میخوان ریجستر بشن داخل ویرچوال کلاس رو مجبور کنم که وظیفه خودشون رو پیاده سازی کنن ما به این میگیم تسک معتبر ممکنه برای اینکه یه تسکی رو معتبر تعریف کنیم خیلی چیز های دیگه هم براش در نظر بگیریم الان برای این مثال سر این کلاس من این مدلی تعریفش می کنم میگم تسکی معتبره که اولا از سوپر کلاس من نتونم نمونه سازی کنم ( یعنی باید سابکلاس باشه )و دو اینکه حتما متد ران خودش رو داشته باشه چطوری میتونم این کار رو انجام بدم خیلی ساده با رعایت کردن چیزی که توی دنیای واقعی مون وجود دارهمفهوم انتزاع ما توی دنیای واقعیمون برای شکلمون برای وظیفه یا اینجورچیزا انتزاع داریم مفهوم داریم مفهوم انتزاعی داریم واقعی نیستند تو هیچ شکلی رو نمیتونی بکشی هیچ تسکی رو نمیتونی انجام بدی مگر اینکه ساب کلاس بشه منم خب همین رو ساده میام اینجام میگم .میگم ابسترکت کلاس تسکبه محض اینکه این رو اینجا اضافه کنم دیگه نمیذاره من از تسک نمونه بسازم میگه این یه مفهوم انتزاعیه تو داری از یه مفهوم انتزاعی نمونه میسازی مگه یه همچین چیزی هست میگه تسک ابسترکته نمی تونی ازش نموننه بسازی همیناین برای قسمت اول رو برام حل میکنهمورد بعدی اینه که تمام سابکلاس هایی که دارن از تسک ارث میبرن رو مجبورشون کنم که حتما متد ران خودشون رو داشته باشن یعنی بسته ترش میکنم یعنی این گذرگاهه تسک باشهاما حتما سابکلاس های تسک باشن خودش نمی تونه باشه و حتما متد ران داشته باشن متد ران خاص خودشون رو داشته باشن من این دو تا شرط رو براش گذاشتم اول تو حالت اولی ما گفتیم تسکه دیگه همین عمومیش کردیم حالا میگم درسته که عمومیه اما یه خورده بسته اش کنیم دیگه خیلی هر کی به هر کیه   چطوری ؟گفتتم اولا باید حتما سابکلاس ها رو بپذیری خودت رو نمیتونی بپذیری و دومی اینکه متد ران خودش رو داشته باشه چطوری این اجبار رو انجام بدم ؟خیلی ساده کافیه برای حالت اوللش بنویسم ابسترکتوقتی ابسترکت رو بنویسم برای تسک دیگه هیچ کی نمی تونه از تسک نمونه بسازهمیتونی متغیر ادرس حافظه بنویسی اما نمونه اش رو بنویسی مثل عکس بالا بهت ارور میده اروری که بهت میده اینه که این تسکه ابسترکت هستش و نمی تونی ازش نمونه بسازی ولی میتونی توی این تسک سابکللاس هاش رو قرار بدیمیتونی سابکلاس ایمیل رو توش نمونه سازی کنی و چیز هایی ک هست برای مقدار دهیش .پس این مسئله اولی برامون حل شد . مسئله دومم مشکلی از لحاظ نمونه سازی نداره چون که سابکلاس هستش دیگه میتونم ازش استفاده مکنم نمن الان باید بیام هر کللاسی که از تسک ارث میبره رو مجبور کنم متد ران خودش رو اور راید کنه ( رونویسی کنه ) متدش رو بیاد اوور راید بنویسه چطوری باید این کار رو انجام بدم خیلی سادهکافیه بیام اینجا و بدنه ران رو حذف کنم و تهش یه سمیکالن بذارم و یه ابسترکت هم اینجا بذارم به این صورت :الان اینجا کال تسک پیاده سازیش نکرده سند ایمیلل پیاده سازیش کرده پس مشکلی نداره سورت فایل هم پیاده سازیش کرده مشکلی نداره اما کال تسک حتما حتما باید ران رو داشته باشه که اگر نداشته باشیش ارور بهت میده اصلا اجازه کامپایل بهت نمیده که تو بتونی ریجسترش کنی اینجا داره بهت ارور میدهچیکار کنیم که ارور نده؟باید پیاده سازیش کنیم یا موس رو اونجا نگه میداریم اینپلمنت متد رو میزنیم یا اینکه دستی می تونیم بنویسیمش فرقی ندارهاین رو بزنم میگه کدوم رو میخوای میگم ران و اون رو برای من اور راید کنو دیگه ارور ما بر طرف میشه و اگه حذفش کنیم دوباره بهمون ارور میده باید حتما این رو داشته باشیم از اجبار دارم حرف میزنمکال تسک میگه اگه تو میخوای تتسک باشی قوانین تسک بودن رو رعایت کن فقط این نیست که یه چیز رو به ارث ببری باید خودت بیای ران ام رو پیاده سازی کنی پس من الان این مشکل دوم ام رو هم حل کردمالان من صد در صد مطمئنم که تمام چیزایی که داخل ویرچوال کلاک ریجسترشون میکنم حتما حتماچی دار ن؟ قوانین رو رعایت کردن اولا خود سوپر کلاسم نیست و دوما صد در صد شون متد ران خودشون رو دارن حالا اینکه میای داخل اون ران اشتباه مینویسی به من ربطی نداره مهم اینه مسئله من درسته و ابهامی ندارهدر قسمت سمت چپ شکل کلاسش هم عوض شدهاینایی که اینجا تعریف کردیم اینطوری شده ابسترکت رو که براش مینویسم سبز رنگ میشه و یه آی توش می نویسه این آیه چیه ؟ این ای به معنی اینترفیسه در واقع این ای که نوشته در واقع به معنی ایمپلمنت شدنه که این ایمپلمنت شدنه در واقع به معنی همون اینترفیس بودنه اینتر فیس چیه ؟ جلو تر کامل تر در موردش حرف میزنیم در واقع یه واسط هستش که جلو تر درباره اش حرف میزنیم و کاری به واسط بودن و این طور چیزا نداشته باشیم . فعلا این طوری در نظرش میگیریم که :میگیم : که این یه قانونه که باید همه سابکلاس ها رعایتش کنن یا به عبارت دیگه بهش میگیم پروتوکول یه قرار داد میگه هر کسی تسک باشه باید بیاد این رو خودش پیاده سازی کنه این قانونه   منه در غیر این صورت تو تسک نیستی مثل این می مونه میگیم هر کسی دانشجو باشه باید مثلا فرض کن مدرک دبیرستان رو داشته باشه کنکورش رو بده و دانشگاه رو ثبت نام کرده باشه در اون صورت اگه ثبت نام کنی بهت میگیم دانشجویی قوانین در نظر گرفتیم حالا اینجا هم همینه میگیم کال تسک تو تسکی یه سری ویژگی به ارث میبری و این قوانین رو باید رعایت کنی در این صورت تو تسکی در غیر این صورت نیستی   و نمیتونی ریجستر بشی این میشه   ioc2.2  چرا دو دو ؟چون همون ارث بری اس فقط یه خورده قوانین روش تعریف میشه اونی که حالت ساده اش بود رو دیگگه بهش نمیگیم دو بهش میگیم ioc2.1کلی چیز های مختلف توی جاوا هست که این طوری هستن مثلا فرض کنین من اینجا بنویسم مثلا ابسترکتاینو که مینویسم کلی کلاس ابسترکت در داخل خود جاوا برای من میاره همین کلاس ابسترکته کلی کلاس های ابسترکت که در داخل خود جاوا هستند .یوتیلیتی باید ابسترکت باشه یا نباشه؟ یوتیلیتی به نمونه هاش نیاز ندارم من نمونه هایش رو اصلا نمیخوام این همون ارری لیستس که تبدیلش کردم به کانتینر که اینجا مثلا اسمش یوتتیلیتی هستش نیازی ندارم نمونه ازش بسازم اما نباید ابسترکت باشهیه روش دیگه هم داریم که جلوی نمونه سازی رو بگیرم نمیخوام ذهنتونو الان درگیرش کنیم به همین علت کاری بهش نداریمحالا میخوام یه چیز دیگه ای هم بهتون بگم یه جاهایی هستن که من از یه کلاس یک بار میخوام نمونه بسازم یه بع تعداد خیلی کمجلسات قبل درمورد استاتیک صحبت کردیم که بهتون گفتم یه سری کلاس ها هستن که استیت دارن اونایی که استیت دارن من نیاز دارم نمونه ازشون بسازم اونایی که استیت ندارن نیازی ندارم پس میام اونا رو استاتیک تعریف میکنم راحت و خیلی هم عالی ولی اونایی که استیت دارن میام ازشون نمونه میسازم البته این بع این معنی نیست که هرچیزی که استیت نداره من باید فرضا استاتیک تعریفش کنم بسته به نیازم تو شرایط مختلف معمولا یوتیلیتی ها رو این مدلی تعریف میکنیم حالا جلو تر بیشتر در موردش حرف میزنیم .این دو تا حالت هست یکی اینکه من نیازی ندارم نمونه بسازم یکی اینکه نیاز دارم نمونه بسازم اونی که نیاز نداشتم نمونه بسازم رو میتونیم استاتیک در نظر بگیریم اونی هم که نیاز دارم میتونیم قوانینی مثل ابسترکت رو روش اعمال کنیم .حالا یه حالت وسطی هم هست که برای یه کاربرد خاص یکی دو تا نمونه ازش بسازم توی همون برنامه ام نیاز دارم یه لحظه یه نمونه ازش بسازم از یه کلاسی مثلا سفره یک بار مصرف یه بار در میاری ازش استفاده میکنی یه تیکه میبری استفاده میکنی و دور میندازی خوبیش چیه ؟اینکه به ضرر طبیعت و ایناس به کنار خوبی ای که برای من داره چیه ؟نیاز به شستن نداره ، فضا اشغال نمیکنه هزینه اش هم کمترهمن میتونم توی کد نویسی کلاس هایی رو بنویسم که هزینه اش برام خیلی کمه هزینه اش برام خیلی کمه یعنی چی ؟ یعنی فضایی برای من نمیگیره استفاده میکنم و دور میندازم کلاس های یه بار مصرف یه جوراییمثلا میخوام از تسک ارث بری کنماون کلاسی که میخوام ازش ارث ببرمتو نمیتونی از تسکت نمونه بسازی من میخوام یه کار دیگه انجام بدم میخوام عملیات ارث بری کردن و نمونه سازیهمین جا بگم از کلاس تسک ارث ببر و نمونه ازش بساز برای اینکه این کار رو انجام بدم نیو رو می نویسم و بعد اسم کلاسی که ازش اسم ببرم رو هم مینویسم شبیه همین تایمر تسکهتایمر تسک به کلاس انتزاعیه   بری داخلشم ببینی نوشته پابلیک ابسترکت کلاس تو نمیی تتونی از تایمر تسک نمونه بسازی و از اون طرف هم از قبل همه کار ها مشخص نشده که بگم همه کلاس هایش هستن من میگم بیا از فلان کلاس استفاده کن و از تایمر تسک برام نمونه بساز کار هاشون مختلفه مثلا کاری که من لازم دارم اینه :یک لحظه همین یک بار لازمش دارم گفتم بیا یه تایمر تسک برام بسازاین کار ها رو توش انجام بده قرار نیست اینو ببرم توی هزار تا برنامه ازش استفاده کنم یک بار ازش استفاده کنم تمام اینم همینه گفتم از نوع تسک بیا برام یک نمونه ناشناس بساز و ارث بری رو انجام داده و نمونه شم ساختهاین چیه متدیه که باید اور راید بشه اگه ننویسی بهت ارور میده چون من قانون تعریف کردم باید حتما این رو داشته باشی من قانون تعریف کردم باید حتما این رو داشته باشی این قسمت 17 تا ا22 صد در صد یک کلاسه اما اسمی نداره خودش پس تو نمی تونی ازش نمونه دیگه ای رو بسازیهمون طور که گفتیم این یک کلاس هستش تو میتونی توش متغیر هم تعریف کنی ولی من کاری به این هاش ندارم همین رانش برای من کافیه پس این جا ب جای اینکه من برای یه سری از تسک هایی که اصلا نیازشون ندارم استفاده زیادی ازشون بکنم  میام ناشناسی تعریفشون میکنم میگم از نوع تسک بیا این رو برای من قرار بده توی لحظه 19 اجراش کن و بعد میگم تست رو چاپ بکنحالا ما تغییرش دادیم به نه و اجراش میکنیم ببین اجرا میشه یا ناین دیگه یک بار مصرفه کارش رو انجام میده و تمام دیگه نمیشه ازش نمنونه ای چیزی بسازیو اینم این طوری اجرا شد .</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Sat, 19 Feb 2022 01:17:35 +0330</pubDate>
            </item>
                    <item>
                <title>جلسه هفتم &gt;&gt;ioc2 ,override,hashmap, polymorphism</title>
                <link>https://virgool.io/@phoenix_0/%D8%AC%D9%84%D8%B3%D9%87-%D9%87%D9%81%D8%AA%D9%85-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D8%A7%DB%8C-%D8%A7%D9%88-%D8%B3%DB%8C-2-ndatbd1kakf9</link>
                <description>شروع فیلم جلسه دهم شی گرایی بنام اورراید و همچنین تایمر و هشمپخب حلقه ها رو که میدونید میان و یه کاری رو که بهشون میدیم پشت سر هم میتونن به اندازه تعداد بار هایی که خودمون بهش بگیم برامون انجام بدن و اونم با نهایت سرعتش میاد و این کار رو برامونن انجام میده .یه زمانی شما نمیخوای بر اساس تعداد این کار رو انجام بدی میخوای بر اساس زمان انجام بدی یعنی یه چیزی رو بر اساس زمان تکرار کنی . مثلا بگی هر یک ثانیه یک بار برام تکرار کن هر یه ساعت یک بار برام تکرار کن . تو این شرایط دیگه نمنیتونی از حلقه استفاده کنی چون اگه از حلقه استفاده کنیم . مثلا اگه بخوایم از حلقه ها برای اینکار استفاده کنیم میتونیم حلقه های بیکاری رو توش بندازیم ( مشکل ویدیو ) برنامه تو اون حلقه گیر میفته و هیچ وقت نمی تونه بقیه کار هاتو انجام بده اما من میخوام این اتفاق نیفته میخوام ستش کنم 15 ثانیه یک بار انجام بشه 15 ثانیه که گذشت انجامش بده دیگه کارش نداشته باشه تموم شد بره کار های دیگه انجام بده و بعد از 15 ثانیه دوباره برگرده انجامش بده دوباره بره ادامه کار هاش و و دوباره بعد از 15 ثانیه برگرده و انجامش بدهبرای اینکه این کار رو انجام بدیم اصل کار اینه که از ترد استفاده کنیم . ترد یا نخ بهش گفته میشه ترد در واقع پردازش موازی انجام میده حالا بسته به اینکه کامپیوترتون پردازش موازی داره واقعا موازی میشه یا اینکه تایم شیر موازیش میکنه یعنی مثلا یه مدت زمانی این ترد رو انجام میده یه مدت زمانی ترد بعدی رو انجام میده الان چطوری کامپیوتر من ادوبی کانکت رو داره مدیریت میکنه هم اینتلی جی رو داره مدیریت میکنه این داره صدا براتون میفرسته ویدیو براتون میفرسته منم دارم با این کار میکنم .اینا توی پردازش های جدا دارن اجرا میشن . داخل هر پردازشش ترد های مختلفی هم وجود داره مثلا من الان بزنم و اینو اجرا کنم کامپایلش میکنهو همزمان که داره این رو کامپایل میکنه من میتونم کار های دیگه ای رو هم انجام بدم . یعنی این داره کامپایل میکنه و من میتونم مثلا تایپ کنم و کارم رو ادامه بدم . دلیل اینکه تو یه برنامه میتونم کار های مختلف انجام بدم اینکه داره از ترد های مختلف استفاده میکنه . یا مثلا این چیزی که برای شما داره ااتفاق میفته . هم داره ویدیو براتون میفرسته هم داره صدای من رو میفرسته و همزمان الان حرف میزنم ، ویدیو میفرسته و اینجا هم دارم تایپ میکنم من . . خب الان داره تو ترد های مختلفی انجام میشه که این داره تایپ رو انجام میده و از طرف دیگه داره ارسال میکنه . فعلا ما کاری به ترد نداریم . فقط خواستم بیس کار رو بهتون بگم . من برای این کاری که بهتون گفتم رو انجام بدم . از یه چیز خیلی ساده و آماده استفاده میکنم . نمیخوام خودم درگیر ترد بشم . از یه چیز آماده استفاده میکنم که بهش میگیم تایمر که داخل خود جاوا هستش توی این تایمره ترد وجود داره دیگه ما کاری نداریم که چطوری داره انجامش میده خب ما فقط ازش استفاده می کنیم . یه نرم افزار اماده است در جاوا داخل تایمر داره از ترد و این جور چیزا استفاده میکنه که پردازش موازی امکان پذیر باشه ولی ما دیگه کاری نداریم که چطوری این کار رو میکنه فقط ازش استفاده میکنیم . یه نمونه از تایمر رو میسازیم به این صورت :بعد از اینکه ازش نمونه ساختم . این تایمره یه متد داره به اسم اسکیژول که این اسکیژول پارامتر های مختلفی میگیره که این سومیش برای من خیلی مهمه یکیش نوشته تایمر تسک یکی هم دیلی و دیگری هم چرخه زمانیش یعنی توی چه بازه های زمانی بیاد برای ما انجام بده بر اساس میلی ثانیه است . دومین پارامتر داره میگه اولین حرکتم رو با چه تاخیری انجام بدم . برای اولین حرکتم که میخوام انجام بدم تاخیری داشته باشم یا ن . اما از بین این ها این تایمر تسکه خیلی مهمه تایمر تسک یه خورده سینتکسش فرق داره با چیز هایی که تا الان نوشتیم . من باید بیام و قبللش تایمر تسک رو تعریف کنم . تایمر تسک اون وظیفه و کاری هستش که میخوام   این تایمره برای من انجامش بده مثلا میگم اینجا هیچ دیلی ای نداشته باش و هر هزار میلی ثانیه بیا و این کار ها رو برای من انجام بدهبر اساس میلی ثانیه است یعنی من ااگه هزار میلی ثاینه بزنم میشه یه ثانیه چه کاری برای من انجام بده میخوام یه کاری برای من انجام بده .. . مثلا میگم توی صفحه نمایش برای من چاپپ کن سلام . هر یه ثانیه یک بار بیا و برام بگو سلام. خب چطوری این کار رو انجام بده باید بیام و تایمر تسک رو تعریفش کنم . مینویسمش اما نمونه سازیش یه خورده فرق دارهنیو رو میزنم اولین چیزی که خودش اورده روش اینتر میزنم .یه همچین کدی رو برای من تعریف میکنه که یه سمیکالن رو هم در اخرش باید بذارم . کار اینکه این الان چطور کدی هستش نداشته باشید .  جلو تر که بریم بهش میرسیم چیه . . نمونه ای که ساختیم بهش میگن کلاس ناشناس که بعدا درباره اش حرف میزنیم . فعلا نمیخواد درگیرش بشید . بعد از اینکه تعریفش کردین تو قسمت ران کاری که قراره انجام بشه رو مینویسی مثلا من سلام رو چاپ میکنم .و این رو میدم به تایمر به این صورت که میگم این تسک رو به صورت 2 ثانیه یک بار اجرا کن . حالا اجراش میکنم ببینم چطوری اجراش میکنه . دیلی برای اولین بار اجرا شدنشه اینم کامپایل برنامه که بعد از دو ثانیه یک سلام دیگر چاپ میکنه . تا بی نهایت این روچاپ میکنه برام . یعنی صد سال دیگه هم این کامپیوتر رو روشن کنی برات این رو چاپ میکنه .خب میام یه سری کلاس تعریف میکنم اولین کلاس به اسم ویژوال کلاس یا ساعت مجازی درست میکنمو یه سری وظیفه لازم دارم من . چون میخوام کار های مختلفی انجام بشه مثلا یکی ایمیل برام بفرسته دیگری مرتب کنه کار هام رو کار های مختلفم . . .پس منم بیام یه وظیفه ای رو تعریف کنم مثلا چیزی به اسم تسک یه سری تسک دیگه . این تسک اصلیم هستش اول بیام این رو تعریف کنم یه تسک چی باید داشته باشه ؟ هر تسکی چی باید داشته باشه من میخوام وظیفه هام . اینطوری باشن که مثلا یه زمان براشون مشخص کنی یه کار براشون مشخص کنی رسید به اون زمان اجرا بشه دو تا فیلد خیلی اساسی دارم یکی اسمش رو میذارم تایم استمپ (اون برچسب زمانی که تو چه زمانی اجرا بشه )یه متد هم براش تعریف میکنم به اسم مثلا ران که کاری رو که میخوام انجام بشهپس تو این بازه زمانی کار رو برام انجام بده این یعنی یک وظیفه هر وظیفه یه برچسب زمانی داره و یه کاری که باید انجام بشه . و خب من الان میتونم بیام ستر و گتر هاش رو بزنم و بگم این ستر و گترش و یه سازنده م براش تعریف کنم که تایم استمپه رو مشخص کنهچون بیرون اومدم تعریف کردم که مثلا فرض کن فلان تسک رو بیا برای من انجام بده تایمش هم مشخص کن بگم مثلا لحظه بیستم بیا انجامش بده اینم از خود تسک اما خب اینم همیش همینه دیگه همیشه همین تسکه است من که نمیخوام همیشه همین تسکه باشه من میخوام تسک های مختلف باشه پس این رو به عنوان سوپر کلاس در نظر میگییرم و بعدش میام یه سری ساب تسک هم براش تعریف میکنم البته تا اینجاش رو در نظر بگیرید و بذارید ویرچوال کلاکش رو براتون بگم . بعدا ساب تسک هاش رو مشخص میکنیم. ویرچوال کلاک میخاد چیکار کنه ؟ ویرچوال کلاس باید تو یه زمان های از پیش تعیین شده تسک هایی که براش ریجستر شدن رو بیاد و اجرا کنه پس باید قابلیتی داشته باشه که وظیفه ها رو ریجستر کنه ده تا دو تا صد تا هزار تا باید تسک رو ریجستر کنه پس من اول میام یه متد در نظر میگیرم براش به اسم ریجستر خب ریجستر کن یه سری چیز رو برای من ریجستر کن اما چی رو ریجستر کن تسک ها رو برام ریجستر کناگه ففقط همین یه دونه تسک رو داشته باشم خب نمیتونم تسک های مختلف رو اجرا کنم .من میخوام تسک های متفاوتی داشته باشم که بتونم اون ها رو داخل سیستمم ریجستر کنم و ویرچوال کلاک رو انجام بده  یکی ایمیل بده یکی مرتب کنه یکی میره سرویس سایت رو چک میکنه کلی کار های مختلف هستند که من میخوام فرق داشته باشن نمی خوام از همون اول بگم اینه وقتی میگم سیستم دات اوت سند ایمیل من که فقط ایمیل رو نمیخوام پس تسک رو به عنوان سوپر کلاس تعریف میکنم و بعدش میام و یه سری ساب کلاس براش در نظر میگیرم مثلا فرض کن سند ایمیل تسکتسک ارسال ایمیل یه دونه دیگه تعریف میکنم به اسم سورت فایل تسک تسک سورت کردن فایل ها و تسک سند ایمیل این دو تا کلاس باید اکستند بشن دیگه باید ارث بری بشن دیگهبه این صورت و سازنده اش رو هم بزنم . و هر کدام ویژگی های خاص خودشون رو داشته باشن به این صورت مثلا سند ایمیل یه فیلدی هم داشته باشه که اسم کسی که میخوایم براش ایمیل بنویسیم رو داخلش بنویسیم خب هر کدام کار های بخصوصی رو انجام میدن پس اون متد ران رو باید اور راید کنیم به این صورت که برای هر دو شون اور راید رو همون طور که سازنده روایجاد میکنیم در داخل کلاس ها ایجاد میکنیم .و داخلش مینویسم مثلا سورت فایل . خب الان که نمیخوام فایل ها رو مرتب کنم . فقط میگم اینجا داره کار ها رو انجام میده همین رو میذارم برای سند ایمیل . .حالا در مورد اوور راید کامل حرف میزنیمحالا توی ویرچوالکلاک قسمت ریجستر میخوام تسک رو ریججستر کنم می نویسم تسکپس الان این قابلیت وجود داره بیام یه همچین کدی بنویسم : ویرچوال کلاک رو تعریف کنم و بعد بیام بگم ویرچوال کلاک دات ریجستر میگم یه دونه سند ایمیل تسک تعریف کن توی لحظه ده بفرستش به علی مثلا حالا فرض کنیم ادرس ایمیل دیگهیا مثلا میگم : یه چند تا اینطوری انجام بده توی لحظه های مختلفبعد از این ها یه دونه سورت هم مینویسماین ها الان ریجسترشون هستش و هنوز کاره انجام نمیشه فقط دارم میگم ویرچوال کلاس توی لحظه ده ات فلان کار رو انجام بده توی لحظه 20 ات فلان کار رو . . .. یعنی چند تای اول سند تو ایمیل بود و دو تای اخر مرتب سازی بود . من یه متدی لازم دارم بعد از اینکه این ریجستر ها رو انجام دادم بگه بهم ک کاره رو شروع کن بگه مثلا ویرچوال کلاک دات استارت اول ریجسترشون میکنم بعد میگم استارت خب استارت رو که بزنم خودش تو ویرچوال کلاک خودش تعریفش میکنه به این صورت که اگه روش alte  و enter  رو بزنم خودش تو ویرچوال کلاک تعریفش میکنهاما ریجسترم که کار نمیکنه هیچی توش نیست کجا ریجسرشون کنم ؟ من اونجا نوشتم ریجستر ولی واقعا که این کار رو نمیکنه ک خب الان میخوام همین رو بهتون بگم اریجستر کردن برای ثبت کردنش هستش ریجستر کردن برای ثبت کردنش هستش . مثلا من به شما میگم روز چهارشنبه امتحان دارید . خب این زمان بندی میکنم براتون شما ها روز چهارشنبه امتحان دارید . مثلا یه مدرس دیگه بهتون میگه روز شنبه امتحان ریاضی مهندسی دارید روز شنبه هفته آینده امتحان مهندسی نرم افزار دارید . خب این ها رو شما برا خودت ثبت میکنید تو برنامه تون مینویسید . این اولی این دومی و این سومی و وقتی میرسه به اون تاریخش انجامش میدی رسیدی سه شنبه امتحانت انجام میشه و بقیه روز ها هم امتحان هات انجام میشه . زمان بندی میکنی و .. . منم همین کار رو دارم انجام میدم . اومدم یه چیزی تعریف کردم به اسم ویرچوال کلاک حالا دارم به ویرچوال کلاک برنامه میدم میگم لحظه ده براش ثبت میکنم که بیا این کار رو انجام بده و بعد از اینکه ثبتش کردم میگم دیگه حالا زمانت رو شروع کن دیگه شروع میکنه برسه به این زمان ها شروع میکنه انجامش بده اما واقعا هنوز که کاری نمیکنه چون من متدم خالیه حالا میخوام اینا رو بنویسماین ها رو چطوری بیام ثبتشون کنم ؟چطوری بیام این تسک هایی که میان رو ثبت کنم ؟ برای اینکه این ها رو ثبت کنم اگه یادتون باشه ما قبلا ارری لیست رو یاد گرفتیم . هر کدام از این ها که میان داخل باید داخل لیستی ذخیره بشن و خودمون هم امدیم چیزی نوشتیم به اسم شیپ اری لیست و بهتون هم گفتم که خود جاوا ارری لیست داره که خودمون هم میتونیم ازش استفاده کنیم .و این طوری تعریفش میکردیم . و بعدش میگفتیم که استودنت ها بیا اد کن مثلا یه استیودنتیدوباره مثلا یه استودنت دیگه و دوباره تا اخر بعد چطوری بهش دسترسی داشتم ؟ این مدلش بهش دسترسی داشتم مثلا فرض کن بعد مینوشتم استودنت اس استودنت ها دات گت . گتش رو نگاه کن اندیسش چیه ؟صدرصد عدد صحیح هستشصدرصد لیست هایی که مثل ارری لیست ساخته میشن صدرصدشون اندیسشون عدد صحیح هستش میگم اونی که توی خونه ششم هستش رو بهم بده یا خانه های دیگهاما من میتونم از یه لیست های پیشرفته تری هم استفاده کن که یه خورده سرعت رو هزینه میکنن اما خب خیلی قابلیت های فوق العاده ای برام داره شما دیکشنری که صد در صد استفاده کردین مینویسین مثلا هللو یعنی چی ؟ بعد فارسیشو برات مینویسه سلام . اندیس بهش میدی ؟ ن نمیای بهش بگی اونی که توی خونه دهم ات هست چیه میگی هلو یعنی چی هلو عدد صحیح نیست هلو یه رشته است . یعنی در واقع اندیست بجای اینکه عدد صحیح باشه رشته است میگه هلو رو بهم بده داخل جاوا میتتونید این ها رو تعریف کنید از یه چیزی استفاده میکنین به اسم هش مپبعد دو تا مقدار ازتون میگیره قبلی فقط یه دونه استودنت میگیرفت ازتون ولی این دو تا ازتون میگیره میگه نوع اندیست چی باشه میگم استرینگ باشه میگه نوع دادها ت چی باشه میگم اونم استرینگ باشه بعد اسمش رو هم میذارم دیکشنری بعد میگم نیو هش مپ بعد چطوری بهش مقدار میدم میگم دیکشنری دات پوت ، دیگه نمیگم اددمیگم بیا قرار بده هلو رو با سلام .میگم یه چیزی دارم با اندیس هلو بعد مقدار سلام رو براش مقدار دهی میکنیم . و بعد چیز های دگیه مثلا بیا قرار بده چی بگم هرچیزی مثلا شیپ و شکلخب حالا میخوام بازیابی کنم میگم استرینگ اس دیکشنری گت کن هلو روهلو رو بهم بده هلو چیه میگه سلام .دقیقا مثل دیکشنری برات کار میکنه ولی قبلش باید خودت پرش کنی دیگه میگم هلو یعنی چی میگه سلام یا اونی که تو خونه شیپ هستش چیه میگه شیپ چطوری این کار رو انجام میده از هش کد استفاده میکنه هش کد چیه بعدا بهتون میگم نمیخوام فعلا درگیرش بشیم فعلا ازش استفاده میکنیم .اره دیگه یه متغیر تعریف کردم که هرچی که دوست داریم میشه اسمش گذاشت .حتما هم نباید رشته باشه مثلا میشه یکی رو استرینگ گگذاشت و دیگری رو استودنت گذاشت .  هرچی که بخوایم میتونی جاش بذاری هر نوع داده ای میشه برای هر دو تاش بذاری میگم اسم ها رو بذارم مثلا علی و رضا به این صورت :و قسمتش دومش نمونه سازی استودنت میکنم یک و اسمش علی و و رضایی و معدلش هم 18 این طوری هم میتونم بهش مقدار بدم .حالا میام و بهش میگم استودنت علی رو بهم دهولی بر عکس بهمون نمیده اگه بخوای برعکس انجامش بدی باید برعکس تعریفش کنی یعنی مثلا بنویسی سلام و اون ور بنویسی هلو بر عکسش رو بهت نمیده این وری اندیسه اون وری مقداره همیشه این ور اندیس اون ور مقدار میگم رضا رو بهم بده این استودنت رو بهم میدهمیتونی برعکس هم بذاریش هایعنی مثلا اونی که ss هستش علی هستش در واقع بعد میگم اسس رو بهم بده رشته بهت میده و اسم دانشجو رو بهت میدههرمقداری بهش بدی مثلا الان اس اس رو بدم علی رو بهم میده که چیز مهم و پرکاربردی هستش الان من میخوام باهاش یه کار فوق العاده جالب انجام بدم . برای همین برنامه مون میخوام از هش کد استفاده کنم .چطوری ازش استفاده میکنم ؟ این تسک ها هستمیام اینجا یه هش تعریف میکنم پرایویت هش مپ از نوع اینتجر میذارم و از نوع تسک میذارمبرای اینتجر ها از یه نظر دیگه هم خیلی مفیده اینجا بود که من الان میتونم بیام مثلا هشم رو اینطوری تعریف کنمو اندیس هام رو نامرتب بزنم بگم تو خانه چهار علی رو بزار دیگه مثل اون ارری لیست نیست که بخوام از صفر یک دو سه چهار شروع کنه و ادامه بده نامنظمه مثلا میخام بگم توی اندیس ده ، علی رو توش بذارنمیاد تو خونه دهم ها همون اولیه اس ولی اندیسش دههبعد مثلا میام میگم توی اندیس 1000 مثلا رضا رو تعریف کناین خونه دومی اس ها ولی اندیسش هزار هستش به چه درد میخوره این ؟ برای دقیقا همین چیزی که اینجا نوشتم :میخوام  توی لحظه دهم ارسال ایمیل به علی رو داشته باشم لحظه بیستم به رضا و . . . فرق دارن دیگه منظم نیستپس من الان هش مپ تعریف کردم و اینتجر و تسک و میگم مثلا تسک هش مپ و نیوش رو هم انجام میدمبعد از اینکه این کار رو انجام دادم دیگه میام اینجا و ریجستر رو انجام میدم . میگم تسک هشمپ دات پوت کنکجا قرار بده مگه تسک هام یه تایم استمپ نداشتن ؟ ! میگم توی لحظه تایم استمپ خود تسک رو قرار بدهاین الان شد ریجسترم اما استارتم چی چطوری بیام و زمان ها رو شبیه سازی کنم برای اینکه زمان هام رو شبیه سازی کنم از تایمر استفاده میکنماز تایمر استفاده میکنم و یه تایم تعریف میکنم و از تایمر تسک استفاده میکنم و نمونه تایمر تسک رو هم میسازم .و توی هر تیکش میخام بیاد و این تسکی که اینجا هست رو اجرا کنهبه جای اینکه این جا اینطوری بنویسمش میام و پایین تر جدا مینویسمش که شلوغ نشه و به صورت پرایویت مینویسمش یه متغیره دگیهبه این صورت . دیگه من در داخل استارت تایمرم رو اسکیژول میکنم میگم هر کدام از این واحد های زمانی چند واحد زمانی واقعی باشه دیگه مثلا میگم هر یک ثانیه واحد زمانی واقعی خودمم باشهاین الان یعنی در واقع ده ثانیه باید طول بکشه که این علی برای من اجرا بشه ولی من میتونم سرعتش رو ببرم بالا میگم واحد های زمانی من رو ده میلی ثانیه بذار این چون ده میلی ثانیه واحد مان رو گذاشتیم ده میلی ثانیه طول میکشه که انجام بشه .اصلا اون پریود زمانیش رو از بیرون میگیرم میگم با این بازه زمانی که از بیرون مشخص میکنم بیا برای من انجامش بده که بتونم از بیرون تنظیم کنم .که ویرچوال کلام چطوری کار میکنه توی ران میخوایم چیکارک نه؟یه شمارنده به اسم کلاک تعریف میکنم مساوی با صفر هستش اولش و توی هر تیکش یه دونه میاد برای من اضافه میکنهمیگه کلاک صفرم هستش . . باید ببینه تو این کلاکی که اینجا زدهبرای اینکه ببینم همچین کلاکی وجود داره از کنتینکی استفاده میکنم میگم ایا این کلید رو داری یا نایا این زمان ریجستر شده یا ن حالا میگم این کلاک رو بهش میدماگه ریجستر شده باید اون وظیفه ای که توی اون لحظه هست رو برای من اجرا کنه حالا از گت استفاده میکنم میگم اونی که توی لحظه کلاک هست چیکارش کن ؟ رانش کن . صد در صد ران دارن چرا ؟ چون همشون تسک هستن تسک ها صد در صد ران دارن چه اینه چه اینهر کدام (منظور کلاس ها )   باشه فرقی نداره همشون صد در صد ران رو دارن اگه این کلاس وجود داشت بیا برای من اجرا کنببینیم چطوری اجراش میکنه همینمیگم ویرچوال کلاک رو اجرا کن با بازه های زمانی 1000 میلی ثانیه ای یا همان یک ثانیه ای یه بار اجراش کنیم حالا باید بیاد و اون کار ها رو برای من اجرا کنه تا لحظه ده باید هیچ کاری انجام نده و کلاک چاپ کنه لحظه 10 باید یه ایمیل بفرسته به علی و همین طور تا اخر ببینیم چطوریه خب کلاک صفر هیچی ندارهاینم اضافه کنیم که کلاک بعد از اجرا اضافه بشهلحظه هفت سورت کردن فایل رو داریم لحظه ده ایمیلل فرستاد به علی حالا میتونم شرط بذارم که اگه کاری نداشتی دیگه ادامه نده وگرنه همینطور تا بی نهایت میره دیگه خیلی چیز جالب و خیلی هم کاربردیهنکته خیلی خیلی مهمش چیه ؟ اینه که اوور راید کردم اوور راید یعنی رونویسی کردنرونویسی چه زمانی اتفاق میفته ؟ رو نویسی زمانی اتفاق میفته که شما یه نمونه از سبکلاس هات رو بریزی تو متغیر ادرس حافظه از نوع کلاست وقتی این کار انجام بشه چون داخل سوپر کلاست ران وجود داره و داخل ساب کلاست هم ران وجود داره وقتی این میره تو متیغر ادرس حافظه اش این اتفاق میفته ها .میاد این روبر میداره وو این رو خط خطیش میکنه و رو نویسی میکنه و ران ساب کلاس رو میذاره جاش و این نکته جالبشه چرا چون الان توی لحظه هفت تسک سورت فایل میاد داخل سورت فایل و ران سورت فایل رو اجرا کرد چرا چون وقتی من اومدم و گفتگم ریجستر کن سورت فایل رو این نمونه از نوع سورت فایله اما ورودی ویرچوال کلاسماز نوع تسکه پس میاد روی این ران رو نویسش میکنه در واقعو این رو برای من اجرا میکنه حالا این اجرا شد دوباره همین طور میره و میرسه به دهمیدهمی چیه نگاهش کنید سند ایمیله دیگه نباید بره داخل سورت دیگه میره داخل سند ایمیل و متد ران اون رو در کلاس پدر رو نویسی میکنه و اون رو انجام میده این یکی از قدرت های فوق العاده مهم ای او سی سطح دو به بعد هستش که من میتونم اوو راید کنم در واقع در اصطلاحات برنامه نویسی پیشرفته بهش میگن پلی مرفیست یا چند ریختی</description>
                <category>Amir_B</category>
                <author>Amir_B</author>
                <pubDate>Thu, 17 Feb 2022 21:37:50 +0330</pubDate>
            </item>
            </channel>
</rss>