آموزش زبان های برنامه نویسی

آموزش زبان های برنامه نویسی

آموزش زبان های برنامه نویسی

آموزش زبان های برنامه نویسی

مقایسه بین لینوکس و سیستمهای دیگر

قبل از بحث در باره مفاهیم کلی لینوکس گفتم شاید بد نباشه لینوکس رو با یکی دو تا سیستم عامل دیگر مقایسه کنیم، این جوری شاید بهتر بشه در مورد لینوکس قضاوت کرد!
متن زیر مقایسه بین لینوکس ،ویندوز 2000 و سیستم عامل
Open Source دیگری به نام FreeBSD است که البته به نظر میاد نویسندش از طرفدارای سرسخت لینوکس باشه!

 

داونلود متن کامل ...

معرفی کارت شبکه، و راه اندازى و نگهدارى شبکه از لحاظ سخت افزارى

کامپیوترها جهت اتصال به هم و استفاده از برنامه هاى هم و اشتراک برنامه ها از نظر سخت افزارى احتیاج به کارت شبکه یا LAN Card دارند. که بطور معمول در بازاردو نوع کارت معمول می باشد. یک قسم آنها کارتهاِی 10 در 10 بوده و قسم دیگر کارتهای 10 در 100 میباشند. جهت کنترل اتصال درست کارت شبکه به کامپیوتر مىتوانید روى آیکون My Computer کلیک راست نموده و ازقسمت Properties پوشه Device manager را انتخاب نمایید. در بین ابزارهاى نصب شده طبق شکل باید در قسمت Network adapters ،نام ومشخصات کارت شبکه شما وجود داشته باشد.

داونلود متن کامل ...

Issues in High-Speed Internet Securety

کرم sql slammer ثابت کرد راه حل ها ی امنیتی جاری ضمن سرعت بالا رشد نکرده و بی اثر هستند محا فظت شبکه ها در مقابل حر کت سریع تهدیدها به یک الگویی احتیاج دارد که انعطاف پذیری-اجرا و سرعت بالا را پیشنهاد می کند با دسترسی سراسری اینتر نت مردم و سازمانها می توانند اطلاعات را فورا به اشتراک بگذارند بد بختانه این چنین دسترسی اینتر نت را آسیب پذیر می کند . 

دانلود متن کامل ...

تهدیدهای وب با تکیه بر IIS (بخش اول)

  1. تهدیدهای امنیت اطلاعات

            هنگامی که شما تلاش می کنید IIS را در مقابل خطرات و تهدیدها ایمن نموده و آسیب پذیری برنامه های کاربردی موجود در ISS را شناسایی نمایید، در واقع به دنیای امنیت اطلاعات که با عنوان infosec شناخته می شود، وارد شده اید. infosec یک رشته تخصصی در دنیای کامپیوتر است که هدف آن تجزیه، تحلیل، کاهش و پاسخ به تهدیدهای سیستمهای اطلاعاتی است. اهمیت infosec هم از جهت دسترسی مشکل به آن و هم از جهت مخاطراتی است که همه روزه در دنیای کامپیوتر اتفاق می افتد. درک اینکه infosec چیست و از آن چگونه برای توسعه و گسترش امنیت سیستمهای اطلاعاتی که بر اساس IIS مایکروسافت[3] بنا نهاده شده اند، استفاده می شود، به شناسایی ماهیت تهدیدهایی که امنیت کامپیوتر را به مخاطره می اندازد کمک می کند.

ادامه ی آشنایی با جاوا ...

آرایه ها در جاوا

یک آرایه گروهی از متغیرهای یک نوع است که با یک نام مشترک به آنها ارجاع می شود . می توان آرایه ها را برای هر یک از انواع ایجاد نمود و ممکن است این آرایه ها دارای یک یا چندین بعد باشند . برای دسترسی به یک عضو آرایه از نمایه (index) آن آرایه استفاده می شود . آرایه ها یک وسیله مناسب برای گروه بندی اطلاعات مرتبط با هم هستند . نکته : اگر با Cو C++و آشنایی دارید ، آگاه باشید . آرایه ها در جاوا بطور متفاوتی نسبت به زبانهای دیگر کار می کنند .


آرایه های یک بعدی

آرایه یک بعدی بطور ضروری فهرستی از متغیرهای یکنوع است . برای ایجاد یک آرایه ، باید یک متغیر آرایه از نوع مورد نظرتان ایجاد کنید . فرم عمومی اعلان یک آرایه یک بعدی بقرار زیر است :

type var-name [];

 

 

 

 

 

نام متغیر نوع

 

در اینجا type اعلان کننده نوع اصلی آرایه است . نوع اصلی تعیین کننده نوع داده برای هر یک از اعضائ داخل در آرایه است . بنابراین ، نوع اصلی آرایه تعیین می کند که آرایه چه نوعی از داده را نگهداری می کند . بعنوان مثال ، در زیر یک آرایه با نام month-days با نوع آرایه ای از عدد صحیح اعلان شده است .

+ int month_days[];

اگر چه این اعلان تثبیت می کند که month-days یک متغیر آرایه است ، اما بطور واقعی آرایه ای وجود ندارد . در حقیقت ، مقدار month-days برابر تهی (null) می باشد که یک آرایه بدون مقدار را معرفی می کند . برای پیوند دادن month-days با یک آرایه واقعی و فیزیکی از اعداد صحیح ، باید از یک عملگر new استفاده نموده و به month-days منتسب کنید. new یک عملگراست که حافظه را اختصاص میدهد. بعداnew " را با دقت بیشتری بررسی می کنیم ، اما لازم است که هم اکنون از آن استفاده نموده و حافظه را برای آرایه ها تخصیص دهید . فرم عمومی new آنگونه که برای آرایه های یک بعدی بکار می رود بقرار زیر ظاهر خواهد شد :

array-var=new type [size];

اندازه نوع متغیر آرایه

 

در اینجا type مشخص کننده نوع داده ای است که تخصیص داده می شود، size مشخص کننده تعداد اعضائ آرایه است و array-var متغیر آرایه است که به آرایه پیوند می یابد . یعنی برای استفاده از new در تخصیص یک آرایه ، باید نوع و تعداد اعضایی که تخصیص می یابند را مشخص نمایید . اعضائ آرایه که توسط new تخصیص می یابند بطور خودکار با مقدار صفر مقدار دهی اولیه می شوند . این مثال یک آرایه 12 عضوی از اعداد صحیح را تخصیص داده و آنها را به month-days پیوند می دهد .

+ month_days = new int[12];

بعد از اجرای این دستور ، month-days به یک آرایه 12 تایی از اعداد صحیح ارجاع خواهد نمود . بعلاوه کلیه اجزائ در آرایه با عدد صفر مقدار دهی اولیه خواهند شد . اجازه دهید مرور کنیم : بدست آوردن یک آرایه مستلزم پردازش دو مرحله ای است . اول باید یک متغیر با نوع آرایه مورد نظرتان اعلان کنید . دوم باید حافظه ای که آرایه را نگهداری می کند ، با استفاده از new تخصیص دهید و آن را به متغیر آرایه نسبت دهید . بنابراین در جاوا کلیه آرایه ها بطور پویا تخصیص می یابند . اگر مفهوم تخصیص پویا برای شما ناآشناست نگران نباشید . این مفهوم را بعدا" تشریح خواهیم کرد . هر بار که یک آرایه را تخصیص می دهید ، می توانید بوسیله مشخص نمودن نمایه آن داخل کروشه [] به یک عضو مشخص در آرایه دسترسی پیدا کنید . کلیه نمایه های آرایه ها با عدد صفر شروع می شوند. بعنوان مثال این دستور مقدار 28 را به دومین عضو month-days نسبت می دهد .

+ month_days[1] = 28;

خط بعدی مقدار ذخیره شده در نمایه 3 را نمایش می دهد .

+ System.out.println(month_days[3]);

با کنار هم قرار دادن کلیه قطعات ، در اینجا برنامه ای خواهیم داشت که یک آرایه برای تعداد روزهای هر ماه ایجاد می کند .

+ // Demonstrate a one-dimensional array.
+ class Array {
+ public static void main(String args[] ){
+ int month_days[];
+ month_days = new int[12];
+ month_days [0] = 31;
+ month_days [1] = 28;
+ month_days [2] = 31;
+ month_days [3] = 30;
+ month_days [4] = 31;
+ month_days [5] = 30;
+ month_days [6] = 31;
+ month_days [7] = 31;
+ month_days [8] = 30;
+ month_days [9] = 31;
+ month_days [10] = 30;
+ month_days [11] = 31;
+ System.out.println("April has " + month_days[3] + " days .");
+ }
+ }

وقتی این برنامه را اجرا میکنید ، برنامه ، تعداد روزهای ماه آوریل را چاپ میکند. همانطوریکه ذکر شد، نمایه های آرایه جاوا با صفر شروع می شوند، بنابراین تعداد روزهای ماه آوریل در month-days[3] برابر 30 می باشد .
این امکان وجود دارد که اعلان متغیر آرایه را با تخصیص خود آرایه بصورت زیر ترکیب نمود :

 + int month_days[] = new int[12];

 

این همان روشی است که معمولا" در برنامه های حرفه ای نوشته شده با جاوا مشاهده می کنید . می توان آرایه ها را زمان اعلانشان ، مقدار دهی اولیه نمود . پردازش آن بسیار مشابه پردازشی است که برای مقدار دهی اولیه انواع ساده استفاده می شود . یک مقدار ده اولیه آرایه فهرستی از عبارات جدا شده بوسیله کاما و محصور شده بین ابروهای باز و بسته می باشد . کاماها مقادیر اجزائ آرایه را از یکدیگر جدا می کنند . آرایه بطور خودکار آنقدر بزرگ ایجاد می شود تا بتواند ارقام اجزایی را که در مقدار ده اولیه آرایه مشخص کرده اید ، دربرگیرد . نیازی به استفاده از newوجود ندارد . بعنوان مثال ، برای ذخیره نمودن تعداد روزهای هر ماه ، کد بعدی یک آرایه مقدار دهی اولیه شده از اعداد صحیح را بوجود می آورد :

+ // An improved version of the previous program.
+ class AutoArray {
+ public static void main(String args[] ){
+ int month_days[] = { 31/ 28/ 31/ 30/ 31/ 30/ 31/ 31/ 30/ 31/ 30/ 31 };
+ System.out.println("April has " + month_days[3] + " days .");
+ }
+ }

وقتی این برنامه را اجرا کنید ، همان خروجی برنامه قبلی را خواهید دید . جاوا بشدت کنترل می کند تا مطمئن شود که بطور تصادفی تلاشی برای ذخیره نمودن یا ارجاع مقادیری خارج از دامنه آرایه انجام ندهید . سیستم حین اجرای جاوا کنترل می کند که کلیه نمایه های آرایه ها در دامنه صحیح قرار داشته باشند . ( از این نظر جاوا کاملا"با Cاو C++و متفاوت است که هیچ کنترل محدوده ای در حین اجرا انجام نمی دهند . ) بعنوان مثال ، سیستم حین اجرا ، مقدار هر یک از نمایه ها به month-daysرا کنترل می کند تا مطمئن شود که بین ارقام 0 و 11 داخل قرار داشته باشند . اگر تلاش کنید تا به اجزائ خارج از دامنه آرایه ( اعداد منفی یا اعدادی بزرگتر از طول آرایه ) دسترسی یابید، یک خطای حین اجرا (run-time error) تولید خواهد شد . در زیر یک مثال پیچیده تر مشاهده می کنید که از یک آرایه یک بعدی استفاده می کند . این برنامه میانگین یک مجموعه از ارقام را بدست می آورد .

+ // Average an array of values.
+ class Average {
+ public static void main(String args[] ){
+ double nums[] = {10.1/ 11.2/ 12.3/ 13.4/ 14.5};
+ double result = 0;
+ int i;
+
+ for(i=0; i<5; i++)
+ result = result + nums[i];
+
+ System.out.println("Average is " + result / 5);
+ }
+ }

آرایه های چند بعدی

 

در جاوا آرایه های چند بعدی در واقع آرایه ای از آرایه ها هستند . این قضیه همانطوریکه انتظار دارید ظاهر و عملکردی مشابه آرایه های چندبعدی منظم (regular) دارد . اما خواهید دید که تاوتهای ظریفی هم وجود دارند . برای اعلان یک متغیر آرایه چند بعدی ، با استفاده از مجموعه دیگری از کروشه ها هر یک از نمایه های اضافی را مشخص می کنید. بعنوان مثال ، عبارت زیرر یک متغیر آرایه دو بعدی بنام twoDرا اعلان می کند .

+ int twoD[][] = new int[4][5];

این عبارت یک آرایه 4در 5ر را تخصیص داده و آن را به twoD نسبت می دهد . از نظر داخلی این ماتریس بعنوان یک آرایه از آرایه نوع int پیاده سازی خواهد شد . بطور فرضی ، این آرایه را می توان بصورت شکل زیر نمایش داد .

Right index determines column.

|| || || || ||
/ / / / /

|
| [0][4] | [0][3] | [0][2] | [0][1] | [0][0] >
|
| |
| [1][4] | [1][3] | [1][2] | [1][1] | [1][0] >
Left index
determines |
| [2][4] | [2][3] | [2][2] | [2][1] | [2][0] .> row
|
| |
| [3][4] | [3][3] | [3][2] | [3][1] | [3][0] >
Given :int twoD[][] = new int [4][5];

برنامه بعدی هر عضو آرایه را از چپ به راست ، و از بالا به پایین شماره داده و سپس مقادیر آنها را نمایش می دهد :

+ // Demonstrate a two-dimensional array.
+ class TwoDArray {
+ public static void main(String args[] ){
+ int twoD[][] = new int[4][5];
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j<5; j++ ){
+ twoD[i][j] = k;
+ k++;
+
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j<5; j++)
+ System.out.print(twoD[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

خروجی این برنامه بقرار زیر خواهد بود

 : 0 1 2 3 4

5 6 7 8 9
10 11 12 13 14
15 16 17 18 19

هنگام تخصیص حافظه به یک آرایه چند بعدی ، کافی است فقط حافظه برای اولین بعد را مشخص نمایید . می توانید ابعاد دیگر را جداگانه تخصیص دهید . بعنوان مثال ، کد زیر حافظه اولین بعد twoD را هنگام اعلان آن تخصیص می دهد . این کد حافظه دومین بعد را بصورت دستی اختصاص می دهد .

+ int twoD[][] = new int[4][];
+ twoD[0] = new int[5];
+ twoD[1] = new int[5];
+ twoD[2] = new int[5];
+ twoD[3] = new int[5];

اگرچه در این حالت اختصاص انفرادی حافظه به دومین بعد هیچ مزیتی ندارد، اما احتمال چنین مزیتهایی وجود دارد . بعنوان مثال ، هنگامیکه ابعاد را بصورت دستی اختصاص می دهید ، نیازی نیست که همان ارقام برای اجزائ هر بعد را تخصیص دهید . همانطوریکه قبلا" گفتیم ، از آنجاییکه آرایه های چند بعدی واقعا" آرایه ای از آرایه ها هستند ، طول هر یک از آرایه ها تحت کنترل شما قرار می گیرند . بعنوان مثال ، برنامه بعدی یک آرایه دو بعدی ایجاد می کند که در آن اندازه های دومین بعد نامساوی هستند .

+ // Manually allocate differing size second dimension.
+ class TwoDAgain {
+ public static void main(String args[] ){
+
+
+ int twoD[][] = new int[4][];
+ twoD[0] = new int[1];
+ twoD[1] = new int[2];
+ twoD[2] = new int[3];
+ twoD[3] = new int[4];
+
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j
+ towD[i][j] = k;
+ k++;
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j
+ System.out.print(twoD[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

خروجی این برنامه بقرار زیر می باشد

 : 0

1 2
3 4 5
6 7 8 9

آرایه ای که توسط این برنامه ایجاد می شود ، بصورت زیر خواهد بود :

| [0][0] |

| [1][0] | [1][1] |

| [2][0] | [2][1] | [2][2] |

| [3][0] | [3][1] | [3][2] | [3][3] |

از آرایه های چند بعدی ناجور ( یا نامنظم ) در اکثر برنامه ها استفاده نمیشود زیرا برخلاف آنچه مردم هنگام مواجه شدن با یک آرایه چند بعدی انتظار دارند رفتار می کنند . اما این آرایه ها در برخی شرایط بسیار کارا هستند . بعنوان مثال ، اگر نیاز به یک آرایه دو بعدی خیلی بزرگ دارید که دارای تجمع پراکنده باشد ( یعنی که یکی و نه همه اجزائ آن مورد استفاده قرار می گیرند ) ، آنگاه آرایه بی قاعده احتمالا" یک راه حل کامل خواهد بود . این امکان وجود دارد که آرایه های چند بعدی را مقدار دهی اولیه نمود . برای اینکار ، فقط کافی است هر یک از مقدار ده اولیه ابعاد را داخل مجموعه ابروهای ختص خودش قرار دهید . برنامه بعدی یک ماتریس ایجاد می کند که هر یک از اجزائ آن شامل حاصلضرب نمایه های سطرها و ستونها هستند. همچنین دقت نمایید که می توان از عبارات همچون مقادیر لفظی داخل مقدار ده اولیه آرایه استفاده نمود .

+ // Initialize a two-dimensional array.
+ class Matrix {
+ public static void main(String args[] ){
+ double m[][] = {
+ { 0*0/ 1*0/ 2*0/ 3*0 };
+ { 0*1/ 1*1/ 2*1/ 3*1 };
+ { 0*2/ 1*2/ 2*2/ 3*2 };
+ { 0*3/ 1*3/ 2*3/ 3*3 };
+ };
+ int i/ j;
+
+ for(i=0; i<4; i++ ){
+ for(j=0 j<4; j++)
+ System.out.print(m[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

پس از اجرای این برنامه ، خروجی آن بقرار زیر خواهد بود

 : 0 0 0 0

0 1 2 3
0 2 4 6
0 3 6 9

همانطوریکه مشاهده می کنید، هر سطر در آرایه همانگونه که در فهرستهای مقدار دهی اولیه مشخص شده ، مقدار دهی اولیه شده است . مثالهای بیشتری درباره استفاده از آرایه چند بعدی بررسی می کنیم . برنامه بعدی یک آرایه سه بعدی 3x4x5 ایجاد می کند . سپس حاصل نمایه های مربوطه را برای هر عضو بارگذاری می کند . در نهایت این حاصل ها را نمایش خواهد داد :

+ // Demonstrate a three-dimensional array.
+ class threeDDatrix {
+ public static void main(String args[] ){
+ int threeD[][][] = new int[3][4][5];
+ int i/ j/ k;
+ for(i=0; i<3; i++)
+ for(j=0; j<4; j++)
+ for(k=0; k<5; k++)
+ threeD[i][j][k] = i * j * k;
+
+ for(i=0; i<3; i++ ){
+ for(j=0; j<4; j++ ){
+ for(k=0; k<5; k++)
+ System.out.print(threeD[i][j][k] + " ");
+ System.out.println)(;
+ }
+ System.out.println)(;
+ }
+ }
+ }

خروجی این برنامه بقرار زیر خواهد بود

 : 0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12

0 0 0 0 0
0 2 4 6 8
0 4 8 12 16
0 6 12 18 24

دستور زبان جایگزین اعلان آرایه

 

یک شکل دوم برای اعلان یک آرایه بصورت زیر وجود دارد :

type [] var-name;

نام متغیر نوع
در اینجا کروشه ها بعداز مشخص کننده نوع می آیند نه بعداز نام متغیر آرایه .
بعنوان مثال دو شکل اعلان زیر یکسان عمل می کنند :

+ int a1[] = new int[3];
+ int[] a2 = new int[3];

دو شکل اعلان زیر هم یکسان عمل می کنند :

+ char twod1[][] = n

آشنایی با جاوا

Volume is 162

بنیادهای کلاس java

کلاسهای تولید شده در بحثهای گذشته فقط برای کپسول سازی روش ()main استفاده می شد ، که برای نشان دادن اصول دستور زبان جاوا مناسب بودند . شاید بهترین چیزی که باید درباره یک کلاس بدانید این است که کلاس یک نوع جدید داده را تعریف می کند . هربار که این نوع تعریف شود ، می توان از آن برای ایجاد اشیائی از
همان نوع استفاده نمود . بنابراین ، یک کلاس قالبی (template) برای یک شی ئ است و یک شی ئ نمونه ای (instance) از یک کلاس است . چون شی ئ یک نمونه از یک کلاس است غالبا" کلمات شی ئ (object) و نمونه (instance) را بصورت مترادف بکار می بریم .


شکل عمومی یک کلاس

 

هنگامیکه یک کلاس را تعریف می کنید ، در حقیقت شکل و طبیعت دقیق آن کلاس را اعلان می کنید . ابتکار را با توصیف داده های موجود در آن کلاس و کدهایی که روی آن داده ها عمل می کنند ، انجام می دهید . در حالیکه کلاسها ممکن است خیلی ساده فقط شامل داده یا فقط کد باشند، اکثر کلاسهای واقعی هردو موضوع را دربرمیگیرند. بعدا" خواهید دید که کد یک کلاس ، رابط آن به داده های همان کلاس را توصیف میکند.
یک کلاس را با واژه کلیدی class اعلان می کنند . کلاسهایی که تا بحال استفاده شده اند ، نوع بسیار محدود از شکل کامل کلاسها بوده اند . خواهید دید که کلاسها می توانند ( و معمولا" هم ) بسیار پیچیده تر باشند . شکل عمومی توصیف یک کلاس به

شرح زیر است :

type methodname2(parameter-list ){
// body of method
}
//...
type methodnameN(parameter-list ){
// body of method
}
}

داده یا متغیرهایی که داخل یک کلاس تعریف شده اند را متغیرهای نمونه instance) (variables می نامند . کدها ، داخل روشها (methods) قرار می گیرند . روشها و متغیرهای تعریف شده داخل یک کلاس را اعضائ (members) یک کلاس می نامند . در اکثر کلاسها ، متغیرهای نمونه یا روی روشهای تعریف شده برای آن کلاس عمل کرده یا توسط این روشها مورد دسترسی قرار می گیرند . بنابراین ، روشها تعیین کننده چگونگی
استفاده از داده های یک کلاس هستند . متغیرهای تعریف شده داخل یک کلاس ، متغیرهای نمونه خوانده شده زیرا هر نمونه از کلاس ( یعنی هر شی ئ یک کلاس ) شامل کپی خاص خودش از این متغیرهاست . بنابراین داده مربوط به یک شی ئ ، جدا و منحصر بفرد از داده مربوط به شی ئ دیگری است . ما بزودی این نکته را بررسی خواهیم نمود ، اما فعلا" باید این نکته بسیار مهم را بیاد داشته باشید .

کلیه روشها نظیر()main همان شکل عمومی را دارند که تاکنون استفاده کرده ایم .

اما ، اکثر روشها را بعنوان staticیا publicا توصیف نمی کنند . توجه داشته باشید که شکل عمومی یک کلاس ، یک روش ()main را توصیف نمی کند . کلاسهای جاوا لزومی ندارد که یک روش ()main داشته باشند . فقط اگر کلاس ، نقطه شروع برنامه شما باشد ، باید یک روش ()main را توصیف نمایید . علاوه بر این ، ریز برنامه ها
(applets)
اصولا" نیازی به روش ()main ندارند . نکته : برنامه نویسان C++ آگاه باشند که اعلان کلاس و پیاده سازی روشها در یک مکان ذخیره شده و بصورت جداگانه تعریف نمی شوند. این حالت گاهی فایلهای خیلی بزرگ java ایجاد می کند ، زیرا هر کلاس باید کاملا" در یک فایل منبع تکی تعریف شود . این طرح در جاوا رعایت شد زیرا احساس می شد که در بلند مدت ، در اختیار داشتن مشخصات ، اعلانها و پیاده سازی در یک مکان ، امکان دسترسی آسانتر کد را بوجود می آورد .


یک کلاس ساده

 

بررسی خود را با یک نمونه ساده از کلاسها شروع می کنیم . در اینجا کلاسی تحت غنوان Box وجود دارد که سه متغیر نمونه را تعریف می کند : width، height، و depthو فعلا" ، کلاس Box دربرگیرنده روشها نیست .

 

+ class Box {
+ double width;
+ double height;
+ double depth;
+ }

قبلا" هم گفتیم که یک کلاس نوع جدیدی از داده را توصیف می کند . در این مثال نوع جدید داده را Box نامیده ایم . از این نام برای اعلان اشیائ از نوع Box استفاده می کنید . نکته مهم این است که اعلان یک کلاس فقط یک الگو یا قالب را ایجاد می کند ، اما یک شی ئ واقعی بوجود نمی آورد . بنابراین ، کد قبلی ، شیئی از نوع Box را بوجود نمی آورد . برای اینکه واقعا" یک شی ئ Box را بوجود آورید ، باید از دستوری نظیر مورد
زیر استفاده نمایید :

+ Box mybox = new Box)(; // create a Box object called mybox

پس از اجرای این دستور ، mybox نمونه ای از Box خواهد بود. و بدین ترتیب این شی ئ وجود فیزیکی و واقعی پیدا می کند . مجددا" بیاد داشته باشید که هر بار یک نمونه از کلاسی ایجاد می کنید ، شیئی ایجاد کرده اید که دربرگیرنده کپی ( نسخه خاص ) خود از هر متغیر نمونه تعریف شده توسط کلاس خواهد بود . بدین ترتیب ، هر شی ئ Box دربرگیرنده کپی های خود از متغیرهای نمونه width، heidht،و depthو می باشد . برای دسترسی به این متغیرها از عملگر نقطه (.) استفاده می کنید . عملگر نقطه ای ، نام یک شی ئ را با نام یک متغیر نمونه پیوند می دهد . بعنوان مثال ، برای منتسب کردن مقدار 100 به متغیر widthدر myboxر ، از دستور زیر استفاده نمایید :

+ mybox.width = 100;

این دستور به کامپایلر می گوید که کپی width که داخل شی ئ mybox قرار گرفته را معادل عدد 100 قرار دهد . بطور کلی ، از عملگر نقطه ای برای دسترسی هم به متغیرهای نمونه و هم به روشهای موجود در یک شی ئ استفاده می شود .

دراینجا یک برنامه کامل را مشاهده میکنید که از کلاس Box استفاده کرده است :

 

+ /* A program that uses the Box class.
+
+ Call this file BoxDemo.java
+ /*
+ class Box {
+ double width;
+ double height;
+ double depth;
+ }
+
+ // This class declares an object of type Box.
+ class BoxDemo {
+ public static void main(String args[] ){
+ Box mybox = new Box)(;
+ double vol;
+
+ // assign values to mybox's instance variables
+ mybox.width = 10;
+ mybox.height = 20;
+ mybox.depth = 15;
+
+ // compute volume of box
+ vol = mybox.width * mybox.height * mybox.depth;
+
+ System.out.println("Volume is " + vol);
+ }
+ }

فایلی را که دربرگیرنده این برنامه است باید با نام BoxDemo.java بخوانید زیرا روش ()main در کلاس BoxDemo و نه در کلاس Box قرار گرفته است . هنگامیکه این برنامه را کامپایل می کنید ، می بینید که دو فایل class. ایجاد شده اند ، یکی برای Box و دیگری برای BoxDemo . کامپایلر جاوا بطور خودکار هر کلاس را در فایل class. مربوط به خودش قرار می دهد . ضرورتی ندارد که کلاس Boxو BoxDemoو هر دو
در یک فایل منبع قرار گیرند . می توانید هر کلاس را در فایل خاص خودش گذاشته و آنها را بترتیب Box.javaو BoxDemo.javaو بنامید .

برای اجرای این برنامه باید BoxDemo.class را اجرا کنید . پس از اینکار حاصل زیر را بدست می آورید :

Volume is 3000

قبلا" هم گفتیم که هر شی ئ دارای کپی های خاص خودش از متغیرهای نمونه است . یعنی اگر دو شی ئ Box داشته باشید، هرکدام بتنهایی کپی ( یا نسخه ای ) از lenght widthو heightو خواهند داشت . مهم است بدانید که تغییرات در متغیرهای نمونه یک شی ئ تاثیری روی متغیرهای نمونه کلاس دیگر نخواهد داشت . بعنوان مثال ، برنامه بعدی دو شی ئ Box را اعلان می کند :

+ // This program declares two Box objects.
+
+ class Box {
+ double width;
+ double height;
+ double depth;
+ }
+
+ class BoxDemo2 {
+ public static void main(String args[] ){
+
+ Box mybox1 = new Box)(;
+ Box mybox2 = new Box)(;
+ double vol;
+
+ // assign values to mybox1's instance variables
+ mybox1.width = 10;
+ mybox1.height = 20;
+ mybox1.depth = 15;
+
+ /* assign different values to mybox2's
+ instance variables */
+ mybox2.width = 3;
+ mybox2.height = 6;
+ mybox2.depth = 9;
+
+ // compute volume of first box
+ vol = mybox1.width * mybox1.height * mybox1.depth;
+ System.out.println("Volume is " + vol);
+
+ // compute volume of second box
+ vol = mybox2.width * mybox2.height * mybox2.depth;
+ System.out.println("Volume is " + vol);
+ }
+ }

خروجی تولید شده توسط این برنامه بقرار زیر می باشد :

Volume is 3000

ادامه در یادداشت بعدی ...

آشنایی با زبان C++

کلاس چیست ؟include

۱- کلاسها به صورت فایلهایی با پسوند" h " به طور مثال "cat.h " ذخیره میشوند و برای استفاده از آن در برنامه نیاز است که آنرا به برنامه ضمیمه کنید به طورمثال :("include " cat.h#)

اما در داخل فایل کلاس چه چیزهایی نوشته می شود : در کلاس دو مسئاله تعیین می شود :
الف ) متغییرهای لازم
ب ) توابع مورد نیاز

در مورد تعریف متعییرها باید گفت که همانند تعریف متغییر در بر نامه نویسی غیر شئ گرا می باشد اما یک نکته مهم را باید مد نظر داشت و آن این است که در برنامه نویسی شئ گرا در کلاس شما حق مقدار دهی به یک متغییر در حین تعریف آن را ندارید . به مثال زیر توجه کنید :

;int a=10

این در برنامه نویسی عادی مشکلی ندارد اما در یک کلاس حق چنین کاری نداریم و باید به شکل زیر بنویسیم :

;int a

چگونگی مقدار دهی به این متغییر در بحث شئ مورد بررسی قرار می گیرد . و اما توابع مورد نیاز نیز روش خاص خود را داراست . در یک کلاس شما فقط باید تابع را تعریف کنید و کد نویسی بدنه تابع در داخل کلاس انجام نمی شود . در ادامه یک نمونه از یک کلاس ساده آورده شده است :

 
}class cat

;int age
;int weight,length

;(void setage(int x
;( int getage(void
;(void Meow(void

{


همانطور که مشاهده کردید در یک کلاس تنها تعریف متغییرها و توابع صورت می گیرد .
این نوشته به صورت فایلی با پسوند "h " ذخیره می شود بطور مثال : cat.h

حالا باید بتونیم توابع تعریف شده رو بصورت کامل بنویسیم .
برای این کار یک فایل هم نام با نام کلاس می سازند با پسوند cpp مثلا cat.cpp
در این فایل جدید ابتدا نوشته می شود " i #include "cat.hدیگر هدر فایلهای مورد نیاز نیز که جزء ملزومات برناه نویسی است نیز باید نوشته شود
بعد از آن نوشتن بدنه فایلها شروع می شود که همانند سی معمولی است اما با کمی تفاوت جزئی :

 بعد از تعیین نوع تابع باید نام کلاس نوشته شده بعد ۲ تا علامت :: گذاشته و اسم تابع و بقیه مجرا نوشته شود . مثلا :

(void cat::setage (int a
}
;age=a

}

 

سطح دسترسی در کلاسها

 

 

در مورد سطح دسترسی به متغییرها و توابع در یک کلاس بحث خواهیم کرد

سطح دسترسی یعنی چی؟

یعنی یک کلاس برای محتویات خود یکسری دسته بندی را رعایت می کند که هر کسی به هر چیزی نتواند دسرسی داشته باشد که در بعضی موارد اگر رعایت نشود می تواند باعث بسیاری مشکلات شود.

 در یک کلاس ۳ نوع دسترسی وجود دارد :

Public:در این نوع دسترسی هیچ محدودیتی اعمال نمی شود و هر چیزی چه داخلی و چه خارجی می تواند از ان استفاده کند (فعلا قصد بنده معرفی دسترسی ها می باشد و برای توضیحات عمیق تر لازم به دانستن یک سری مطالب دیگر است که در روزهای آینده ذکر خواهد شد )

 ۲- Private: این نوع دسترسی بر عکس نوع قبل عمل می کند . یعنی غیر از توابع عضو این کلاس هیچ چیز دیگری نمی تواند به آنها دسترسی داشته باشد . مثلا وقتی یک شئ از این کلاس تعریف می کنیم از طریق شئ نمی توانیم مستقیما به ایم نوع متغییرها یا توابع دسترسی داشته باشیم اما خود توابع عضو این کلاس میتوانند در کد نویسی خود از این نوع استفاده کنند که در آینده بیشتر آشنا خواهیم شد .

 ۳- Protected:در این نوع نیز شئی که از کلاس تعریف می شود نمی تواند به این نوع دسترسی داشته باشد . این نوع تعریف خاص خود را دارد که بعد از بحث ارث بری قابل ذکر است و در اینجا تنها نامی از آن برای تکمیل بحث آورده شده است .

 *نکته قابل ذکر این است که غالبا از دو نوع ۱و۲ استفاده می شود و از نوع ۳ خیلی کم استفاده خواهید کرد .
در کلاس این انواع دسترسی با ۳ کلمه کلیدی ذکر شده تعیین می شوند :

 اگر در ابتدای کلاس باشیو و هیچ کدام را ننویسیم متغییرها و توابع تعریفی تا کلمه کلیدی دیگر همه private محسوب می شوند تا زمانی که از یکی از دو کلمه دیگر استفاده شود . بعد از آن نیز بقیه از این کلمه استفاده شده تبعیت می کنند تا کلمه کلیدی بعدی .

 ------------------------------------------------------------------------------------------

در ادامه یک نمونه مثال از سطح دسترسی آورده شده و در ادامه آن مثالهای اشتباه و درست نیز آورده شده است :

 


class Cat
}
;int a,b
;(void setage(int age
:public
;int c,d
;(void setlength(int length
:protected
;int e
;(void setwidth(int width
}

-------------------------------------

در بالا یک نمونه کلاس آورده شده حالا یک شئ از آن تعریف کرده و مثالهای درست و غلط را ذکر میکنم :



;Cat m

مثالهای درست :


;m.a=10
;m.b=80
;()m.setage

مثالهای غلط :


;m.b=20
;m.c=13
;()m.setlength
;m.e=90
;()m.setwidth

چند ریختی Polymorphism

 

 

چند ریختی یا Polymorphism یکی از خواص جالب در ++C محسوب میشه . شما نمی تونید توابعی با اسامی یکسان داشته باشید مگر در یک حالت استثناء اون هم مسئله چند ریختی هستش . یعنی چند تابع مختلف با یک اسم یکسان تعریف می کنید اما باید دقت داشته باشید که در مقادیر ورودی توابع متفاوت باشند .

 مثال :


}(void set(int a
; int b
;b=a
}
*************
}(void set(float s
; float m
;m=s
}
*************
}(int set(int f,int g
; int j,k
;j=f
;k=g
; return k+j
}
*************


در مثالهای بالا دقت کنید که اسم توابع یکسان است و تنها در موقع صدا زدن آنها با توجه به نوع ورودی تابع , تابع مورد نظر اجرا می شود .
مثال :
اگر بنویسیم ;(set (1 تابع اولی اجرا میشود

اگر بنویسیم ;(set (5.1 تابع دومی اجرا میشود

اگر بنویسیم ;(set (90, 8 تابع سومی اجرا میشود و مقدار ۹۸ را بر می گرداند.

ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر )

ارث بری همونطور که از اسمش کاملا پیداست همانند قانون ارث بردن در موجودات زنده عمل می کند , یعنی همانند طبیعت یک کلاس به عنوان کلاس پدر (مادر) فرض می شود و یک کلاس به عنوان فرزند از این کلاس یک سری خصوصیات و قابلیتها را به ارث می برد (فرزند نیز دارای بعضی امکانات پدر می شود . البته میزان آن بستگی به خواست ما دارد که توضیح خواهم داد )

کلاس پدر را کلاس پایه گویند Base Class .

 ارث بری را مشتق کردن نیز می گویند .
+++++++++++++++++++++++++++++++++

نحوه مشتق کردن یک کلاس از کلاس دیگر :

 فرض می کنیم کلاسی با نام A وجود دارد :

} class B :(type) A
; int a,d
:public
;(void Rotate (void
}


نوشته بالا یعنی کلاس B از کلاس A با دسترسی نوع (type) که توضیح خواهم داد که نوع دسترسی ۳ دسته است مشتق شده یا خصوصیات و قابلیتهای آن را به ارث برده است .

 ۳ نوع دسترسی برای مشتق کردن وجود دارد که عبارتند از :
۱ public-
۲ protected-
۳ private-
یعنی یکی از سه کلمه بالا به جای (type ) نوشته خواهد شد.
هر کدام از این انواع دسترسی توضیحات خاص خود را دارد که عبارتند از :
۱- public :

یعنی تمام خواص عمومی و خصوصی کلاس پایه را به همان شکل به ارث می برد . بدین شکل که موارد public در کلاس مبنا (پایه) برای این کلاس جدید نیز وجود دارد و برای این نیز public خواهد بود . و تمام خواص protetted و private نیز به همین شکل می باشد که در کلاس جدید نیز هر کدام protected و private خواهند بود .

 نکته مهم : در این نوع دسترسی توابع عضو کلاس جدید اجازه دسترسی به خواص protected کلاس مبنا را دارند اما به خواص private خیر !! دسترسی ندارند .

 
۲- protected :

 در این نوع دسترسی , کلاس جدید خواص کلاس مبنا را به این شکل به ارث می برد که تنها توابع عضو کلاس جدید به فقط خواص public و protected کلاس مبنا دسترسی دارند و به خواص private دسترسی ندارند .

 ۳- private :

 این نوع دسترسی یعنی نه شئی از کلاس جدید و نه تابع عضو کلاس جدید به هیچ چیز از کلاس مبنا دسترسی ندارند !! ( عملا یعنی این نوع دسترسی یعنی اصلا مشتق نکنیم سنگین تریم!!! )

 
نکته بسیار مهم :

 ارث بری میتواند به گونه ای باشد که یک کلاس از تعداد بیش از ۱ کلاس ارث ببرد ( مشتق شود ) . مثلا :


}class B: public A , public C , protected D , public E , private F
.
.
.
.
}

 

آشنایی با زبان PHP

 

PHP و برنامه نویسی شی گرا

PHP تا چه حد شی گراست؟! آیا تمام امکاناتی که در زبانهای برنامه نویسی شی گرای کاملی همچون Java وجود داره، در PHP هم پشتیبانی میشه؟! پاسخ به این سوال تا حدی بر میگرده به معیارها و شرایطی که شما برای شی گرا بودن یک زبان مدنظر دارید. در این پست من سعی میکنم امکاناتی که نوعا در یک زبان برنامه نویسی شی گرا وجود داره رو بررسی کنم و حرفایی که PHP در هر مورد برای گفتن داره رو تا حدی توضیح بدم. (این راهنما بیشتر برای کسانی هست که از زبانهای OO دیگری میخوان به PHP روی بیارن

وراثت یگانه(Single Inheritance):

PHP به شما اجازه میده که با استفاده از عبارت extends یک کلاس فرزند تعریف کنید که تمام مشخصه ها و رفتارهای کلاس والد رو دارا هست.(تعریف یک کلاس، از کلاس دیگه به ارث می رسه.

وراثت چندگانه(Multiple Inheritance):

PHP از وراثت چندگانه پشتیبانی به عمل نمی یاره و هیچ نشانی از وراثت واسطه که در جاوا وجود داره دیده نمیشه. هر کلاس حداکثر یک کلاس والد خواهد داشت.

سازنده ها(Constructors):

هر کلاس می تونه یک تابع سازنده داشته باشه که در نسخه فعلی PHP که از Zend Engine 1 بهره می بره، باید همنام کلاس باشه. در نسخه بعدی PHP که مجهز به ZE2 می باشد، تابع سازنده هر کلاس ()construct__ نام خواهد گرفت. تابع سازنده کلاسهای والد به طور اتوماتیک فراخوانی نمی شن مگر اینکه صریحا احضار بشن!

تخریب کننده ها(Destractors):

نسخه فعلی PHP (با ZE 1) تابع تخریب کننده نداره، بیشتر به این خاطر هست که آزاد سازی حافظه و برگرداندن حافظه تخصیص یافته دست برنامه نویس نیست. اما نسخه های بعدی تابع تخریب کننده را دارا می باشد.

کپسوله سازی و کنترل دسترسی(Encapsulation):

هیچ پشتیبانی از کپسوله سازی در نسخه جاری PHP به عمل نیومده و تمام مشخصه ها و رفتارها Public هستند، اما تو نسخه بعدی دو نوع Private و Protected افزوده شده است.

چند شکلی(Polymorphism):

PHP چند شکلی رو به این صورت پشتیبانی میکنه که اجازه میده نمونه کلاس های فرزند به جای نمونه کلاسهای والد استفاده بشه.

اتصال دیر یا زود(Early vs. late binding)

دو پاسخ مناسب به این موضوع به قرار ذیل هست:


۱) از اونجایی که PHP یک زبان Loosely Type هست، این سوال پیش نمی یاد.

۲) تمام اتصالات Late هستند. در PHP مقادیر دارای نوع هستند ولی متغیرها بی نوع هستند، بنابراین این سوال که اگه نوع متغیر و مقدار متفات باشه کدوم متد فراخوانی بشه، به وجود نمی یاد.

توابع ایستا(Static Functions)

پشتیبانی صریحی از Class Functionها وجود نداره اما میشه که با استفاده از سینتکس ()Classname::function میشود تابع یک کلاس رو فراخوانی کرد. این تابع تا وقتیکه به یک متغیر داخلی ارجاع نکنه ، به عنوان یک Class Function در نظر گرفته میشه.

درون نگری(Introspection):

در این مورد PHP با دست پر ظاهر شده و توابع متنوعی برای کسب اطلاعات در مورد یک کلاس وجود داره، مثلا بازیابی نام کلاس، نام یک تابع، نام متغیرهای(مشخصه های) یک نمونه کلاس و ...

 اغلب از مفهوم شئ گرایی در زبان مورد علاقه ما چشم پوشی می شود یا به غلط تفسیر می شود ولی اگر به طور صحیح بکار گرفته می شود خیلی هم قوی به نظر می رسد. آینده PHP درباره شئ گرایی بسیار روشن است این از خصوصیات جدیدی که در PHP5 گنجانده شده کاملأ مشخص است. با ابزار مناسب تنها چیزی که لازم داریم دانش است. در این مقاله سعی شده که مفهوم واقعی شئ را بررسی کنیم و اینکه چه جوری اونها را شناسایی کنیم همچنین سعی شده ما را با سه رکن اصلی OOP یعنی کپسوله کردن، ارث بری و پلی مورفیسم بیشتر آشنا کند.
 
برنامه نویسی شئ گرا همانطور که از اسمش هم پیداست برنامه نویسی با اشیاء است. ولی خوب معنی دقیق شئ چیه؟

بذارید اول بگم شئ چی نیست! شئ فقط یه کلاس نیست که یه مشت تابع داخلش ریخته باشن. شاید به نظر بدیهی بیاد ولی واقعیت اینه که وقتی آدم مقوله OOP رو در یه زبان رویه ای مثل PHP کشف می کنه هیجان زده میشه که زودتر استفادش کنه بدون اینکه از تئوری اولیه اون خبر داشته باشه!

 حالا شئ چیه؟

شئ موجودیتی است که خصوصیات(properties) و رفتارهایی را (behavior) در خودش کپسوله می کند که مخصوص همان موجودیت است.

 شاید به نظر عجیب بیاد ولی اشیاء دور و ور ما هستند. بعضی خودشون از اشیاء دیگری تشکیل شدن. روزنامه دستتون، پنجره اتاق خود اتاق در دیوار...

 ولی درباره OOP بعنوان یک مفهوم چیزای زیادی هست که باید بدونیم. در طول این سالها (کدوم سالها؟!) متدلوژیهای مختلفی برای نزدیک شدن به شئ گرایی توسعه یافتند، حتی می شه به سه مرحله تقسیمش کرد: تحلیل شئ گرا(OOA)، طراحی شئ گرا(OOD) و برنامه نویسی شئ گرا(OOP) که برای تبحر در هر کدومشون وقت زیادی لازم است مثلا مدلهای طراحی هنوز بدجوری رویه ای هستند. می دونید فقط syntax نیست که مهم هست در واقع قسمت سخت ماجرا شئ گرایانه فکر کردن و تمرین کردن و در نهایت بکارگیری هست. نگذارید این واقعیات شما رو دلسرد کنه چون یادگیری مفاهیم قسمت اعظم موضوعه (که لابد تو این مقاله قراره یاد بگیریم)
 
شئ گرایی مزایای زیادی داره از جمله: استفاده دوباره، توسعه پذیری و نگهداشت پذیری که مهمترین اونها هستن.

استفاده دوباره: اشیاء می توانند رو پای خوشون بایستند یعنی مجردند؛ و نشاندهنده یک چیز هستند. به این معنی که می توانند به گونه های مختلف ترکیب شوند، که این همون خاصیت استفاده دوباره را ایجاد میکند. استفاده دوباره از اشیاء کلی توی وقت ما صرفه جویی میکنه چون مجبور نیستیم همه چیز و از اول بسازیمتوسعه پذیری: بجای نوشتن یک شئ از اول ما می تونیم یک شئ را گسترش بدیم. یه شئ می تواند از یک شئ دیگر مشتق شود و فقط کارایی هایی را که لازم است به شئ جدید بیفزاییم.

نگهداشت پذیری: طبیعتأ اشیاء چون خوانایی بالایی دارند، خیلی راحتتر تحلیل میشوند و خیلی بهتر میتوان از برنامه های موجود توسعه اشون داد و اینکه طبیعت "pluggable" دارند کد کمتری برای ویرایش اونها لازم است.

تصور غلط درباره بکارگیری OOP در PHP

قبل از ادامه بحث دوست دارم یه مقدار درباره این موضوع که PHP 4 شئ گرایی را پشتیبانی نمی کند صحبت کنم. بریم سر اصل مطلب:

فقدان وجود کنترلهای دستیابی: گرچه این در php5 تغییر میکنه (private, public و protected اضافه خواهند شد) به عقیده بنده این پارامتری نیست که جلوی ما را در بکارگیری OOP بگیره، کنترلهای دستیابی به هیچ وجه به منظور ایجاد امنیت بوجود نیامدند، بلکه برای کمک کردن به برنامه نویس درست شدند که برنامه نویس لازم نباشه نگران باشه که تصادفی به اعضایی دسترسی پیدا شود که نباید دست بخورند. فقط باید حواسمون رو بیشتر جمع کنیم. اینکه مفسر برنامه این اجازه را از شما نمی گیره به این معنا نیست که شما تئوری oop رو نمی تونید بکار بگیرید.

فقدان کلاسهای مجرد: بازهم این نمی تونه شما رو از کدنویسی شئ گرا باز نگه داره حتی در تئوری! اساسأ یک کلاس مجرد به این معناست که شما باید در هنگام ایجاد زیرکلاسها متدهای مجرد پیاده سازی کنید، و قادر نباشید از آن instance بسازید(خدا وکیلی اینو خودم هم نفهمیدم چی گفت). بعضی از زبانها مثل جاوا بصورت built-in این موضوع را پشتیبانی می کنند که خیلی خوبه ولی بدون اون هم زندگی غیر ممکن نیست! بسادگی میشه یک متد خالی در superclass رو در زیر کلاسها override کنید.(که در قسمت پلی مورفیسم نشان خواهم داد چگونه.(

 عدم پشتیبانی از ارث بری چندگانه: گرچه بعضی اعتقاد دارند که ارث بری چندگانه مفید هست ولی به عقیده من فقط ایجاد ابهام میکند. شما چندتا مثال سراغ دارین که در آن یک شئ از دو یا چند superclass ارث ببره و هنوز بتونه رابطه is-a را حفظ کنه (اگر معنی این رابطه را نمی دانید من پایینتر توضیح دادم).گرچه عقاید متفاوتند ولی من فکر نمی کنم این محدودیتها کاملا قابل چشم پوشی هستند و اصلأ دلیل خوبی برای ترک شئ گرایی درphp نیستند.

 
 
درک اشیاء وقتی داریم تکنیک های جدید برنامه نویسی را یاد می گیریم، معمولأ خوبه که از نمونه های دنیای واقعی کمک بگیریم. اینجا می تونیم یک ماشین را در نظر بگیریم. فکر کنید یک ماشین چه چیزهایی دارد(properties) و چه کارهایی می تواند انجام دهد(behaviour) .چیزهایی که ماشین دارد: properties)) پنجره  در  چرخ موتور در اینجا لازم به ذکر است که که properties خودشون می توانند شئ باشند با properties و behaviour خودشان. در شئ گرایی این ترکیب نام دارد. شما می توانید

بگویید که ماشین تشکیل شده از... و حتی پا را فراتر بگذارید و بگویید که هر شئ هم از اشیاء دیگر تشکیل شده و .... ولی در موقع برنامه نویسی سعی کنید فقط چیزهایی را تعریف کنید که بدرد میخورند و بیخودی وارد جزئیات نشوید.

 خوب بریم ببینیم یک ماشین چه کار می تواند بکند:

 شتاب بگیرد

 ترمز کند

 درها باز شوند

 این رفتارها مخصوص خود ماشین هستند. شما باید قادر به تشخیص اشیاء در واقعیت باشید تا بتوانید خوب از معماری شئ گرا استفاده کنید واقعأ احمقانه نیست که در زندگی عادی شئ گرا فکر کنیم. کل عالم از اشیاء تشکیل شده، سعی کنید اشیاء را شناسایی کنید!

 رکن اول: کپسوله کردن

از اینجا به بعد باید از یک زاویه دیگه به قضیه نگاه کنیم. آیا یک ماشین می تواند خودش براند؟ البته که نه، وقتی شئ گرا نگاه کنیم خود راننده یک موجودیت جداست.

خیلی مهم است که این تفاوت را حس کنیم: اشیاء باید مسوولیت های خودشان را داشته باشند. اونها فقط باید قادر باشند کارهای خودشان را انجام بدهند و نه چیزی بیشتردر واقع property های یک شئ فقط باید تحت تأثیر رفتارهای همان شئ تغییر کنند. اینکه یک شئ مستقیمأ بتواند روی property های شئ دیگر تأثیر بگذارد بکلی غلط است. یک شئ باید جزئیاتش را برای خودش حفظ کند و آنچه که بروز می دهد فقط interface اش باشد و یک شئ دیگر فقط به جزئیات آن شئ از طریق این  interfaceمی تواند دسترسی داشته باشد. وقتشه که این تئوری را ازطریق یک کد بازگو کنیم: یک کارخانه اتومبیل می خواهد اتومبیل بسازد ولی فقط در سه رنگ:

قرمز، آبی و سبز. برای اینکه بدونید مسوولیت یعنی چی من اعتراف می کنم مثال اولم مثال خوبی نبود! در ضمن syntaxبرنامه ربطی به من نداره می تونید php manual را تحت عنوان Class/object functions مطالعه کنید.

<?php
        class Car
        {
        var $color;
        }

        $specificCar = new Car();
        $specificCar->color = "yellow";
        ?>

 

ادامه در یادداشت زیر...

آشنایی با زبان PHP

 

ادامه ی آشنایی با زبان پی اچ پی

 اشتباه! قانون ما این بود که هیچ رنگی غیر از قرمز و آبی و سبز ساخته نشود. خوب معلومه آخر عاقبت اداره کردن مستقیم colour property همینه دیگه! اتومبیل موند رو دستمون.  چون ما یک interface برای مراقبت از مسوولیت ها ایجاد نکردیم. در لیست 1 مثال بهتری را خواهید یافت.

 لیست 1 

<?php
        class Car
        {
        var $color;
        var $possibleColors = array("red", "green", "blue");

        function setColor($color)
        {
        if (in_array($color, $this->possibleColors)) {
        $this->color = $color;
        }
        }
        }
        
        $specificCar = new Car();
        $specificCar->setColor("yellow"); //would not alter the object

        $specificCar->setColor("red"); //would alter the object
        ?>


سعی کنید که این کد را درک کنید و اینکه چرا این راه بهتر است، این بار اتومبیل ما یک interface دارد که ما از طریق این interface می توانیم مقادیر propertiesرا تغییر دهیم، متد setColor مراقب هست که چه اتفاقاتی ممکن است برای properties اتومبیل بیفتد. اگر interface امان را خوب بنویسیم، می توان مطمئن بود که اگر به غلط هم مقداردهی شود اتفاق بدی برای properties نخواهد بود و interface مراقب اوضاع خواهد بود. متدsetColor اصلاح کننده(modifier) نام دارد وproperty شئ اتومبیل را اصلاح می کند. در کنار اصلاح کننده، accessor ها را داریم. accessor برای برگرداندن property بجای اصلاح آن بکار می رود.
لیست 2 مثالی برای accessor را نشان می دهد.

لیست 2

 

<?php
class Car
{
var $color;

/*
* constructor, code inside this function is executed on object
* initialisation
* note that in PHP 5 the constructor will have to have the name
* __construct(), instead of the class name
* although this way of constructing will still work as long as no
*___construct() is found
*/
function Car()
{
$this->color = "red";
}

// Accessor
function getColor()
{
return $this->color;
}
}
?>


 
در لیست 2 متد getColor همان accessor است. accessor ها همچنین می توانند داده را قبل از برگرداندن اداره کنند. همیشه بهتر است که بجای ارجاع مستقیم به property های داخلی یک شئ از accessor ها استفاده کنیم. حالا می دونم بعضی از شما می پرسید که "من واقعأ نمی تونم property های شئ را مستقیمأ اداره کنم؟"
 
درسته. وقتی این مقاله نوشته می شد php هنوز فاقد اصلاح کننده هایی مثل private بود. هرچند این موضوع در php5 تغییر خواهد کرد شما می توانید محدودیت های سر سختی برای قسمت های خصوصی خودتان بگذارید تا خیالتان راحت باشد که بهیچ وجه دستکاری نمی شوندخیلی مهم است که رفتار شئ شما بخوبی از طریق interface یا متدها تعریف شده باشد. چون خیلی مهم است که یک interface خوب در موقع استفاده دوباره هم خوب باشد، باید واضح باشد که یک شئ چکار می کند. همیشه سعی کنید اسامی برای کلاسها انتخاب کنید که کار اون کلاس را بطور خلاصه بیان کند. از نوشتن اسامی بلند نترسید در مجموع کپسوله کردن یعنی:

 اشیاء جزئیات را برای خودشون نگه دارند

 یک شئ فقط باید چیزی را ارائه کند که لازم است

 یک شئ مسوولیت های خودش را دارئ

 یک شئ باید interface واضحی داشته باشد

کلاسها در PHP

یکی از مسائلی که در PHP فهمیدن آن خیلی راحت نیست " مزیت استفاده از کلاسها
"
در برنامه نویسی می باشد . من قبلا با هیچ بانک اطلاعاتی در PHP کار نکرده
بودم اما بعد از کمی تلاش دیدم که یادگیری دستورات مقدماتی آن چقدر راحت است .
اما در مقابل برنامه نویسی OOP (‌برنامه نویسی شیء گرا‌) نیز تا بحال انجام نداده
بودم ولی پی بردم که فهمیدن مفاهیم و چرائی استفاده از آن بسیار مشکل بود . من
فکر می کردم که برنامه نویسی شیء گرا حتما خیلی قدرتمند است و مزایای زیادی دارد
اما از اونجائی که سعی می کردم قبل از تجربه هر چیز خودم را قانع کنم که اون چیز
به دردم می خوره هیچ موقع دنبال اون نبودم .

تا اینکه چند روز پیش هنگامی که داشتم یک Function‌ ساده می نوشتم و اون رو تغییر می دادم به ذهنم رسید که ببینم می شود این کار را توسط یک Object ( شیء )‌ انجام داد یا نه . سعی می کنم نتایجی رو که در هنگام این کار بهش رسیدم رو براتون به زبان ساده شرح بدم .

Class (‌کلاس)‌ در حقیقت تعدادی از Variable ( متغیر)‌ها به همراه تعدادی Function (‌عملگر)‌است که این عملگر ها بر روی آن متغیر ها کار می کنند . اونها در حقیقت مفهوم یک چیز در دنیای واقعی هستند . به عبارت دیگر کلاسها یک شیء رو معرفی می کنند . نشانه یک کلاس زندگی واقعی و یا نفس کشیدن است که زیرساختهای اون کلاس هستند .

فرض کنید که ما می خواهیم یک دوچرخه را شرح دهیم . کلاس مرتبط با یک دوچرخه می بایست متغیر های زیر را داشته باشد :‌

 


$pedals, $chain, $front_wheel, $rear_wheel, $brakes, $handle_bars

 

)بدنه نگهدارنده ، ترمزها ، چرخ عقب ،‌چرخ جلو ، زنجیر ، پدالها )

عملگر هایی که یک دوچرخه دارد از قرار زیر است :


Stop(), Accelerate(), Coast(), TurnLeft(), TurnRight()

 

( ایستادن ، شتاب دادن ، راندن ، پیچیدن به سمت راست ، پیچیدن به سمت چپ )

شما هم اکنون می توانید فرض کنید کنید که توسط این اجزاء این دوچرخه می تواند حرکت کند و در حقیقت معنای دوچرخه بدهد . مثلا عملگر Accelerate می تواند متغیری به عنوان $Braking_Force به عنوان ورودی دریافت کند و مثلا از متغیرهای $brakes و $wheels هم استفاده کند و مثلا نتیجه مطلب را به عنوان مقدار بازگشتی به برنامه برگرداند .

بسیار جالب به نظر می رسه . اما به نظر شما نمی شه که همه اینها را به صورت منظم توسط تعدادی متغیر و عملگر انجام داد ؟ مسلما این کار امکان پذیر هستش . اما در صورتیکه شما فقط یک دوچرخه را بخواهید در برنامه خودتون استفاده کنید فرقی به حال شما ندارد که از کلاس استفاده کنید یا نه . اما اگر از تعدادی از دوچرخه ها بخواهید در برنامه استفاده کنید چطور ؟ در اون صورت تعقیب اینکه هر دوچرخه هم اکنون در چه مرحله ای است و چه متغیری از آن باید به کدام عملگر فرستاده شود توسط برنامه نویس بسیار سخت و پیچیده می شود . اما در کلاس دیگر این مشکلات وجود ندارد و هر متغیر برای هر دوچرخه در اختیار عملگر های آن است و هر دوچرخه به صورت جدا متغیر هایش برای عملگرها فرستاده می شود بدون اینکه شما نیازی به کنترل‌ آنها داشته باشید
.
همچنین استفاده از کلاس در برنامه های مختلف راحت است چرا که شما با یک کلاس آماده که قبلا در جای دیگر کار می کرده به راحتی می توانید کار کنید و نیازی به تغییر آن ندارید .

حالا اجازه بدید که یک مثال کاربردی و واقعی بزنیم که من در خیلی از صفحات وبی که می سازم از آن استفاده می کنم و ممکن است که بدرد شما هم بخورد . شما رو نمی دونم اما من موقعی که می خواهم صفحات وب پویا رو برنامه نویسی کنم خیلی بدم میاد که همش به فکر روند منطقی درست بودن خروجی HTML برنامه باشم . برای همین هیچ موقع صفحات زیبایی در خروجی برنامه های من نیست چون از رنگها و فونتهای مختلف استفاده نمی کنم .

راه حل موجود استفاده از یک کلاس PHP برای تنظیم خروجی های HTML است . من این کلاس رو Style نامگذاری می کنم . این کلاس شامل متغیرهای زیر است که مهمترین تنظیمات HTML خروجی از برنامه می باشند :

 

 


<?php
class Style {
var $text;
  var $alink;
  var $vlink;
  var $link;
  var $bgcol;
  var $face;
  var $size;
  var $align;
  var $valign;
}
?>

 

مطمئن هستم که شما با HTML آشنا هستید و این متغیرها برای شما آشنا هستند . هم اکنون سعی می کنم که عملگری به نام Style برای تعیین نوع خروجی درست کنم :

 

 


<?php
class Style {
function Style ($text="#000000",$alink="#AA00AA",
  $vlink="#AA00AA",$link="#3333FF",
  $bgcol="#999999",$face="Book Antiqua",$size=3,$align="CENTER",$valign="TOP")
  {
$this->text=$text;
  $this->alink=$alink;
  $this->vlink=$vlink;
  $this->link=$link;
  $this->bgcol=$bgcol;
  $this->face=$face;
  $this->size=$size;
  $this->align=$align;
  $this->valign=$valign;
}
}
  ?>

هنگامی که شما عملگری همنام با کلاس خودتون تعریف می کنید ، این عملگر همزمان با تعریف شیء ای از نوع این کلاس اجرا خواهد شد . این عملگر ، عملگر constructor یا سازنده نام می گیرد . این عملگر به شما این امکان را می دهد که در هنگام ایجاد شیء ، برای همه متغیر ها یک مقدار اولیه داشته باشید .

<?php $Basic = new Style; ?>

در اینجا شما شیء‌ ای با نام $basic توسط دستور new از نوع کلاس Style درست کرده اید .

همچنین این امکان وجود دارد در هنگامیکه می خواهید یک شیء جدید توسط یک کلاس ایجاد کنید مقدار اولیه متغیرهای آن را نیز در هنگام ایجاد خوتان انتخاب کنید . اما در صورتیکه مقدار یکی از آنها را شما بخواهید در هنگام ایجاد انتخاب کنید باید همه متغیرهای دیگر را نیز خودتان مقدار اولیه هایشان را تعیین کنید و این امکان وجود ندارد که فقط یکی یا چند تا رو شما تعیین کنید و بقیه رو مقدار اولیه مقدار دهی کند . به همین خاطر راه بهتری را برای این مشکل پیشنهاد می کنیم و آن استفاده از یک عملگر به نام Set در کلاس است که مقدار یک متغیر را در کلاس تغییر می دهد :

<?php
Function Set($varname,$value) {
$this->$varname=$value;
}
?>

بنابراین برای تغییر مقدار هر یک از متغیر ها می توانیم از نمونه زیر استفاده کنیم :


<?php $Basic->Set('size','2'); ?>

شما می توانید از علامت -> برای اشاره به متغیر و یا عملگر یک شیء استفاده کنید . بنابراین خط بالا به اجرا کننده برنامه می گوید که عملگر Set مربوط به شیء $Basic را اجرا کن . از آنجایی که ما $Basic را قبلا از نوع Style تعریف کردیم بنابراین عملگر Set این کلاس اجرا می شود و پارامتر های ورودی شما را می گیرد و
برای شیء مورد درخواست تغییرات لازم را اجرا می کند . همچنین شما می توانید این کار را برای متغیر های دیگر مانند $Basic->text نیز انجام دهید و مقدار اولیه آنرا تغییر دهید .