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

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

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

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

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

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

یک آرایه گروهی از متغیرهای یک نوع است که با یک نام مشترک به آنها ارجاع می شود . می توان آرایه ها را برای هر یک از انواع ایجاد نمود و ممکن است این آرایه ها دارای یک یا چندین بعد باشند . برای دسترسی به یک عضو آرایه از نمایه (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 نیز انجام دهید و مقدار اولیه آنرا تغییر دهید .

مهمترین نقاط آسیب پذیری ویندوز

نقاط آسیب پذیری ویندوز

منبع:

www.SRCO.ir

 


 

 

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

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

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

مهمترین نقاط آسیب پذیر ویندوز

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

·         Internet Information Services (IIS)

·         Microsoft SQL Server (MSSQL )

·         Windows Authentication

·         Internet Explorer (IE )

·         Windows Remote Access Services

·         Microsoft Data Access Components (MDAC)

·         Windows Scripting Host (WSH)

·         Microsoft Outlook Outlook Express

·         Windows Peer to Peer File Sharing (P2P)

·         Simple Network Management Protocol (SNMP)

در این یادداشت ، به بررسی IIS   خواهیم پرداخت .

 

اولین نقطه آسیب پذیر

 ( Internet Information Services (IIS

 

نصب  برنامه IIS با تنظیمات و پیکربندی پیش فرض ، آسیب پذیری خود را در موارد متعددی به اثبات رسانده و می تواند زمینه تهدیدات زیر را فراهم نماید :

  • غیر فعال نمودن سرویس ( DoS )
  • نمایش و بمخاطره انداختن  فایل ها و داده های حساس
  • اجراء دستورات خودسرانه ( اختیاری )
  • بمخاطره انداختن کامل سرویس دهنده

IIS از پتانسل  شناخته شده ISAPI ( فایل هائی با انشعاب DLL که به آنان فیلترهای ISAPI هم گفته می شود ) بمنظور همبستگی  و ارتباط با  فایل هائی که دارای انشعاباتی خاص می باشند ، استفاده می نماید . پیش پردازنده هائی نظیر ColdFusion و PHP از ISAPI استفاده می نمایند.IIS ، از فیلترهای  ISAPI  دیگر برای انجام عملیات مرتبط با ASP)Active Server Pages ، ( SSI)Server Side Includes) و اشتراک چاپ مبتنی بر وب ، استفاده می نماید.تعداد زیادی از فیلترهای ISAPI ، مستلزم عملیات خاص و جداگانه ای برای نصب نبوده و عملا" بصورت پیش فرض و در زمان نصب IIS  بر روس سیستم مستقر ( نصب ) می گردند . اکثر فیلترهای فوق ، قابل سوء استفاده توسط مهماجمان می باشند. Code red و Code Red 2  ، نمونه هائی از برنامه های مخرب می باشند که از ضعف فوق در جهت پیشبرد اهداف خود استفاده نموده اند . 

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

عدم بهنگام سازی و نگهداری مناسب IIS پس از نصب اولیه ، از دیگر مواردی است که زمینه تهاجم برای مهاجمان را فراهم می آورد .مثلا" نقاط آسیب پذیر WebDAV ntdll.dll   در IIS 5.0 ، امکان حملات از نوع  DoS ( غیرفعال نمودن سرویس )  را فراهم و مهاجمان در ادامه قادر به  ایجاد و اجرای اسکریپت های مورد نظر خود بر روی سرویس دهنده می گردند . در مواردی دیگر  و با توجه به نقاط آسیب پذیر موجود ، مهاجمان قادر به اجرای دستورات دلخواه خود بر روی سرویس دهنده می باشند (  درخواست دقیق و ماهرانه آدرس های URL  ) .

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

سیستم های عامل در معرض تهدید :

  • ویندوز NT 4.0 که از IIS 4.0 استفاده می نماید .
  • ویندوز 2000 سرویس دهنده که از IIS 5.0 استفاده می نماید .
  • ویندوز XP نسخه Professional که از نسخه IIS 5.1 استفاده می نماید .

در رابطه با نقطه آسیب پذیر فوق بر روی ویندوز 2003 که از IIS 6.0 استفاده می نماید ، تاکنون گزارشی ارائه نشده است .


نحوه تشخیص آسیب پذیری سیستم

در صورتیکه برنامه IIS بصورت پیش فرض و استاندارد نصب و یا  Patch های  مربوطه بر روی آن نصب نشده باشند ، آسیب پذیری برنامه فوق در مقابل حملات قطعی خواهد بود . مدیران سیستم وشبکه  که مسئولیت نصب ، نگهداری و بکارگیری IIS را بر عهده دارند ، می بایست خود را با جدیدترین ابزارهای  مایکروسافت و مستندات امنیتی ارائه شده در رابطه با مدیریت مناسب IIS ، بهنگام نمایند. در این رابطه می توان بمنظور دستیابی به مستندات امنیتی مرتبط با IIS از  مرکز امنیتی IIS  شرکت مایکروسافت استفاده نمود. پیشنهاد می گردد ، برنامه  Microsoft BaseLine Security Analyzer را که شامل روتین های حفاظتی مناسب و مرتبط به IIS می باشد را دریافت و از آن بمنظور بررسی وضعیت امنیتی IIS استفاده بعمل آید . مدیران شبکه ، می بایست با استفاده از منابع اطلاعاتی متعدد ارائه شده نظیر : Checklists ، مستنداتی  که توصیه های لازم در جهت ارتقاء سطح امنیتی را ارائه و مستندات آموزشی نقاط آسیب پذیر که توسط  مایکروسافت ارائه شده است ،  دانش خود را بهنگام  و با دنبال نمودن فرآیندهای مناسب فنی ، از صحت عملکرد امنیتی IIS بر روی سیستم های سازمان خود اطمینان حاصل نمایند.مقایسه وضعیت موجود IIS با وضعیت مطلوب ،  یکی از روش هائی است که می تواند در این زمینه مفید واقع گردد .

 

نحوه حفاظت در مقابل نقطه آسیب پذیر

نصب آخرین Patch ارائه شده : در اولین مرحله ، می بایست  سیستم را با استفاده از Patch های ارائه شده ، بهنگام نمود. Patching یک سرویس دهنده نصب شده ، امری ضروری است  ولی بتنهائی کافی نخواهد بود . بموازات کشف نقاط ضعف جدید در IIS  ، می بایست  از Patch مربوطه بسرعت استفاده گردد. Windows Update و AutoUpdate گزینه هائی مناسب بمنظور بهنگام سازی IIS با توجه به آخرین Patch های ارائه شده است .

 برنامه ( HFNetChk ( Network Security Hotfix Checker ، به مدیران سیستم کمک  لازم در پویش و بررسی محلی و یا از راه دور سیستم ها برای Patch های موجود را ارائه می نماید . ابزار فوق ، قابل استفاده بر روی ویندوز NT 4.0 ، ویندوز 2000 و ویندوز XP می باشد . آخرین نسخه ابزار فوق را می توان از آدرس  http://www.microsoft.com/technet/security/tools/hfnetchk.asp  دریافت کرد .

در صورتیکه از برنامه های اضافه شده ای  نظیر CouldDusion ،PerlIIS و یا PHP بهمراه IIS استفاده می گردد ، لازم است به سایت های عرضه کنندگان هر یک از محصولات فوق مراجعه و نسبت به آخرین patch ارائه شده در رابطه با هر محصول آگاه و آنان را با توجه به توصیه های انجام شده بر روی سیستم نصب نمود . امکان Windows Update و سایر سرویس های بهنگام سازی ارائه شده توسط مایکروسافت ، شامل Patch های لازم و مرتبط با محصولات اضافه شده سایر شرکت ها در برنامه IIS مایکروسافت نبوده  و لازم است مدیران سیستم بهنگام سازی محصولات اضافه شده ( غیر مایکروسافت ) در IIS را خود راسا"  انجام دهند .

استفاده از برنامه کمکی IIS Lockdown بمنظورنصب مطمئن تر : مایکروسافت ، ابزاری ساده بمنظور ایمن سازی نصب IIS را ارائه که ویزارد IIS Lockdown نامیده می شود. نسخه موجود را می توان از آدرس http://www.microsoft.com/technet/security/tools/locktool.asp ، دریافت نمود. با اجرای برنامه فوق در حالت " Custom " و یا " Expert" ، می توان تغییرات مورد نظر خود را در ارتباط با نصب IIS مشخص نمود. بدین ترتیب ، امکان اعمال تغییرات زیر در رابطه با نصب IIS ، فراهم می گردد :

  • غیر فعال نمودن WebDAV ( مگر اینکه محیط مورد نظر شما به وجود آن برای نشر محتوی وب ، نیاز داشته باشد )
  • غیر فعال نمودن ISAPI extensions های غیر ضروری ( نظیر : htr، .idq , .ism ، .printer . )
  • حذف نمونه برنامه های ارائه شده بهمراه IIS
  • منع سرویس دهنده وب از اجراء دستورات سیستمی متداول که عموما" توسط مهاجمان استفاده می گردد( نظیر cmd.exe و یا tftp.exe ) .

استفاده از URLScan  بمنظور فیلتر نمودن درخواست های HTTP : تعدادی زیادی از حملات مرتبط با نقاط آسیب پذیر IIS نظیر Code Blue و خانواده Code Red ، از کدهای مخربی که بصورت درخواست های HTTP  سازماندهی می شوند،استفاده می نمایند( حملاتی از نوع  Buffer Overflow ) . فیلتر URLScan را می توان بگونه ای پیکربندی نمودکه باعث عدم پذیرش اینچنین درخواست هائی قبل از پردازش آنان توسط سرویس دهنده باشد.برنامه فوق،بهمراه ویزارد IIS Lockdown ارائه ولی می توان آن را از آدرس : http://www.microsoft.com/technet/security/tools/urlscan.asp نیز دریافت کرد .

 نقاط بعدی آسب پذیری را در یادداشتهای بعدی نشان خواهیم داد .

آشنائی با زبان #C

                       

C#

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

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

مطرح شدن بعنوان یک استاندارد صنعتی

انجمن تولیدکنندگان کامپیوتر اروپا (ECMA) زبان #C را در سوم اکتبر سال 2001 بعنوان یک استاندارد پذیرفته (ECMA-334) و بدنبال آن تلاش های وسیعی برای کسب گواهی ISO نیز انجام شده است. زبان فوق در ابتدا توسط شرکت مایکروسافت و بعنوان بخشی از دات نت پیاده سازی و بلافاصله پس از آن توسط شرکت های اینتل، هیولیت پاکارد و مایکروسافت مشترکا، جهت استاندارسازی پیشنهاد گردید.

زبان #C بگونه ای طراحی شده است که نه تنها وابستگی به یک Platform خاص را ندارد، بلکه در اغلب موارد وابستگی RunTime نیز ندارد. کامپایلر #C می تواند بر روی هر نوع معماری سخت افزاری طراحی و اجرا گردد. در برخی از نسخه های اولیه کامپایلر زبان فوق که توسط برخی از شرکت های جانبی ارائه شده است، کدهای #C را به بایت کدهای جاوا کمپایل می کنند. یکی از چنین کامپایلرهائی را می توان در سایت Halcyonsoft.com مشاهده نمود. بنابراین کدهای #C براحتی قابلیت حمل بر روی محیط های متفاوت را دارا خواهند بود.

مشخصات تعریف شده زبان #C با سایر استاندارهای تعریف شده ECMA نظیر (ECMA-335) CLI (Common Language Infrastructure) بخوبی مطابقت می نمایند. CLI قلب و روح دات نت و CLR(Common Language Runtime) است. اولین نسخه از کامپایلر زبان #C که از CLI استفاده می کند، NET Framwork. مایکروسافت است.

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

#C چیست ؟

طراحان زبان #C با تاکید و الگوبرداری مناسب از مزایای زبانهائی نظیر ++C، C و جاوا و نادیده گرفتن برخی از امکانات تامل برانگیز و کم استفاده شده در هر یک از زبانهای فوق، یک زبان برنامه نویسی مدرن شی گراء را طراحی کرده اند. در مواردی، برخی از ویژگی های استفاده نشده و درست درک نشده در هر یک از زبانهای گفته شده، حذف و یا با اعمال کنترل های لازم بر روی آنها، زمینه ایجاد یک زبان آسان و ایمن برای اغلب پیاده کنندگان نرم افزار بوجود آمده است. مثلا C و ++C می توانند مستقیما با استفاده از اشاره گرها عملیات دلخواه خود را در حافظه انجام دهند. وجود توانائی فوق برای نوشتن برنامه های کامپیوتری با کارائی بالا ضرورت اساسی دارد. اما در صورتیکه عملیاتی اینچنین بدرستی کنترل و هدایت نگردند، خود می تواند باعث بروز مسائل (Bugs) بیشماری گردد.

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

#C بعنوان یک زبان شی گراء عالی است. این زبان First-Class را برای مفهوم Property (Data Member) بهمراه سایر خصائص عمومی برنامه نویسی شی گراء حمایت می کند. در C و ++C و جاوا یک متد get/set اغلب برای دستیابی به ویژگی های هر Property استفاده می گردد. CLI همچنان تعریف Property را به متدهای get/ser ترجمه کرده تا بدین طریق بتواند دارای حداکثر ارتباط متقابل با سایر زبانهای برنامه نویسی باشد. #C بصورت فطری Events ، Declared Value، Reference Type ، Operator Overloading را نیز حمایت می کند.

کد مدیریت یافته

با استفاده از نسخه پیاده سازی شده #C توسط مایکروسافت، می توان همواره کد مدیریت یافته ای را تولید کرد. یک برنامه #C پس از کامپایل، بصورت برنامه ای در خواهد آمد که شامل دستورالعمل های تلفیق شده ( CIL (Common Intermediate Language است (درست بر خلاف دستورالعمل های مختص یک ماشین خاص). CIL (گاها با نام MSIL(Microsoft Intermediate Language) با به اختصار IL نیز نامیده می شود ) ، در مفهوم مشابه بایت کدهای جاوا بوده و شامل مجموعه ای از دستورالعمل های سطح پایین قابل فهم توسط تکنولوژی مبتنی بر CLI نظیر CLR مایکروسافت خواهد بود. این برنامه ها بدین دلیل کد مدیریت یافته، نامیده می شوند که CLR مسئولیت تبدیل این دستورالعمل ها به کدهای قابل اجرا برروی ماشین و ارائه اغلب سرویس های اساسی برای کدینگ نظیر : Garbage Collection، مدیریت Heap و عمر مفید یک Object و یا Type Verification را فراهم می کند.

روش یادگیری #C

یادگیری این زبان برای افرادیکه دارای سابقه آشنائی با یکی از زبانهای برنامه نویسی ++C، C و یا جاوا باشند کار مشکلی نخواهد بود، حتی افرادیکه دارای آشنائی اولیه با جاوااسکریپت و یا دیگر زبانهای برنامه نویسی نظیر ویژوال بیسک می باشند، امکان پذیر و راحت خواهد بود. برخی از برنامه نویسان حرفه ای بر این باور هستند که #C نسبت به VB.NET با اقبال بیشتر و سریعتری مواجه خواهد شد، چراکه #C نسبت به ویژوال بیسک خلاصه تر است. حتی برنامه های بزرگ و پیچیده ای که توسط #C نوشته می گردند خواناتر، کوتاه و زیبا خواهند بود. برخی از ویژگی های ارائه شده در #C نظیر Unsigned Integer، Operator OverLoading و امنیت بیشتر Type ها، در VB.NET وجود نداشته و این امر می تواند دلیلی بر فراگیرتر شدن #C نسبت به VB.NET نزد برنامه نویسان با تجربه باشد.

برای یادگیری هر یک از زبانهای حمایت شده در دات نت، می بایست از BCL (Basic Class Library) مربوط به NET Framework. شروع کرد. #C خود صرفا دارای ۷۷ کلمه کلیدی یا Keyword بوده که برای اکثر برنامه نویسان غریب نخواهند بود. در مقابل BCL، دارای ۴۵۰۰ کلاس و تعداد بیشماری متد و Property است که برنامه نویسان #C، می توانند از آنها برای انجام عملیات دلخواه خود استفاده نمایند. شاید یکی از مسائل قابل توجه جهت یادگیری این زبان برای برخی از برنامه نویسان حرفه ای عدم وجود برخی از ویژگی ها و امکاناتی باشد که در گذشته و از طریق سایر زبانهای استفاده شده، بخدمت گرفته می شدند. مثلا عدم وجود امکاناتی جهت توارث چندگانه (MI) سلسله مراتبی یک شئ.

شئ گرایی در #C

دنیای برنامه نویسی امروزه بر مفهوم شئ گرایی استوار است. شئ گرایی به زبان ساده یعنی دنیا را آنطور ببنیم که هست! زبان #C یکی از بهترین زبانهایی است که دارای تمامی امکانات جهت پیاده سازی مفاهیم اصیل شئ گرایی است.

شئ گرایی (OOP) در #C بر چند پایه استوار است که به قرار زیرند:

- Inheritance
-
Encapsulation
-
Polymorphism
-
Abstraction
-
Interface

اکنون به توضیح مختصر هر یک می پردازیم.

Inheritance (ارث بری)


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

 

Encapsulation

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

فرض کنید سوار ماشینی هستید که به سرعت در حرکت است! در مسیری که می روید ماشین پدر نامزدتان از روبرو به شما نزدیک می شود و سعی می کنید سریع ترمز بگیرید تا برخورد نکنید. اگر قرار باشد که بدانید بعد از فشار دادن پدال ترمز چه عملیاتی انجام می شود تا ترمز گرفته شود، دیگر باید از ازدواج قطع امید کنید. ولی اگر تنها بدانید که با فشار دادن پدال، ترمز گرفته می شود شما خوشبخت خواهید شد. در واقع ما در اینجا کار ترمز گرفتن ماشین را به صورت یک کپسول آماده در نظر می گیریم. هدف Encapsulation این است که ما را از پرداختن به ریز موضوعات رها کند و اشیاء را به صورت یک جعبه سیاهی بدانیم که به ازای یک ورودی خاص خروجی خاصی می دهند. اگر می خواهیم کدهای ما نیز این مورد را رعایت کنند باید سعی کنیم نگاه کپسولی به اشیاء و عملکرد آنها داشته باشیم. در #C برای کپسوله کردن از Access Modifierهای protected ،private و public استفاده می شود.

Polymorphism

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

Abstraction

تجرید یا مجرد سازی! به کلاسی مجرد گفته می شود که پیاده سازی متدها در آن انجام نمی شود! بر خلاف انسانها که مجرد تعریف دیگری برایشان دارد! حال سئوالی پیش می آید که اگر کلاسی داشته باشیم که نخواهیم پیاده سازی متدها را در آن انجام بدیم، از آن کلاس چه استفاده ای می کنیم؟ برای پاسخ به این سئوال شرایط زیر را در نظر بگیرید:

فرض می کنیم که شما رییس یک شرکت بزرگ برنامه نویسی هستید و می خواهید پروژه بزرگی را انجام دهید. برای اجرای پروژه از برنامه نویسان مختلفی استفاده می کنید که ممکن است همه آنها هموطن نباشند! مثلا هندی، ایرانی یا آلمانی باشند! اگر قرار باشد هر برنامه نویسی در نامگذاری متدها و کلاسهایش آزاد باشد، در کد نویسی هرج و مرج به وجود می آید. شما به عنوان مدیر پروژه، کلاسی تعریف می کنید که در آن تمام متدها با ورودی و خروجی هایشان مشخص باشند. ولی این متدها را پیاده سازی نمی کنید و کار پیاده سازی را به برنامه نویسان می دهید و از آنها می خواهید که همه کلاسهایی را که می نویسند از این کلاس شما به ارث ببرند و متدها را به طور دلخواه پیاده سازی کنند. این باعث می شود که شما با داشتن یک کلاس، ورودی و خروجی های مد نظر خود را داشته باشید و دیگر نگران برنامه نویسان نباشید. کلاسی که شما تعریف می کنید یک کلاس مجرد نامیده می شود.

برای تعریف یک کلاس مجرد از کلمه کلیدی
abstract استفاده می کنیم. فیلدهایی که می خواهیم در کلاسهای مشتق شده از این کلاس پیاده سازی شوند حتما باید با abstract تعریف شوند. یک کلاس مجرد می تواند فیلدها و متدهای نامجرد داشته باشد. اگر متد نامجردی در یک کلاس مجرد تعریف کردید، حتما باید آن را پیاده سازی کنید و نمی توانید پیاده سازی آن را به کلاسهای مشتق شده بسپارید.

Interface

اینترفیس در برنامه نویسی همانند همان کلاس است تنها با این تفاوت که هیچکدام از اعضای آن پیاده سازی نمی شوند. در واقع یک اینترفیس گروهی از متدها، خصوصیات، رویدادها و
Indexer ها هستند که در کنار هم جمع شده اند. اینترفیس ها را نمی توان Instantiate (وهله سازی) کرد (یعنی نمی توان وهله ای از یک اینترفیس ایجاد کرد!). تنها چیزی که یک اینترفیس دارا می باشد امضای (signature) تمامی اعضای آن می باشد. به این معنی که ورودی و خروجی متدها، نوع Property ها و... در آن تعریف می شوند ولی چیزی پیاده سازی نمی شود. اینترفیس ها سازنده و فیلد ندارند (امری است بدیهی! چرا؟). یک اینترفیس نمی تواند Operator Overload داشته باشد و دلیل آن این است که در صورت وجود این ویژگی، احتمال بروز مشکلاتی از قبیل ناسازگاری با دیگر زبانهای NET. مانند VB.NET که از این قابلیت پشتیبانی نمی کند وجود داشت. نحوه تعریف اینترفیس بسیار شبیه تعریف کلاس است تنها با این تفاوت که در اینترفیس پیاده سازی وجود ندارد.

حالا این اینترفیس در کجا به کار می آید؟ اگر با ++
C کار کرده باشید ( در آن صورت کارتان خیلی درست می باشد!!!) با واژه ارث بری چند گانه آشنا هستید. ولی احتمالا شنیدید که جاوا و #C از ارث بری چندگانه پشتیبانی نمی کنند. (یعنی یک کلاس از چند کلاس دیگر به ارث ببرد). گاهی لازم داریم از چند کلاس به ارث ببریم. راه حلش این است که از اینترفیس ها استفاده کنیم. ولی بدانید که اگر از اینترفیسی به ارث بردید باید تمام متدهای آن را پیاده سازی کنید. یک کلاس می تواند از n تا اینترفیس و تنها یک کلاس به ارث ببرد.

 

به آر.ام.آر سافت خوش آمدید

با عرض سلام خدمت شما کاربر گرامی

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

منتظر انتقادها و پیشنهادات شما هستیم .

با تشکر

روند پشدری