ايجاد يك متد :
در امتحان كنيد بعد، متدي خواهيد ساخت كه يك مقدار را برگرداند . تابعي كه در اين بخش ايجاد مي كنيد ميتواند مساحت يك دايره
را بر اساس شعاع آن محاسبه كند. الگوريتمي كه براي اين كار استفاده ميكنيد به صورت زير است :
)1 شعاع را به توان دو برسان .
)2 نتيجه را در عدد پي ضرب كن.
امتحان كنيد: ايجاد يك متد
)1 براي نوشتن اين برنامه ميتوانيد از برنامه Three Buttons كه در مرحله قبل ساختيد استفاده كنيد .
)2 كد زير را براي تعريف يك تابع جديد در قسمت كـد برنامـه اضـافه كنيـد (ايـن متـد مقـداري را بـه برنامـه ي فراخـوان
برميگرداند، پس يك تابع به شمار مي رود).
// CalculateAreaFromRadius – find the area of a circle
private double CalculateAreaFromRadius(double radius)
{
// Declare variables
double dblRadiusSquared;
double dblResult;
// Square the radius
dblRadiusSquared = radius * radius;
// Multiply it by pi
dblResult = dblRadiusSquared * Math.PI;
// Return the result
return dblResult;
}
)3 سپس كد نوشته شد در متد button1_Click را حذف كنيد و كد زير را به جاي آن وارد كنيد :
private void button1_Click(object sender, EventArgs e)
١٠١
{
// Declare variable
double dblArea;
// Calculate the area of a circle with radius 100
dblArea = CalculateAreaFromRadius(100);
// Print the results
MessageBox.Show(dblArea, “Area”);
}
)4 برنامه را اجرا كنيد و روي دكمه فرمان Button1 كليك كنيد. نتيجه اي را مشابه شكل -13 3 مشاهده خواهيد كرد :
13 3- شكل
چگونه كار مي كند؟
قبل از هر چيز، يك متد مجزا به نام CalculateAreaFromRadius مانند زير ايجاد مي كنيد :
private double CalculateAreaFromRadius(double radius)
{
}
هر كدي كه بين دو آكولاد قرار بگيرد به عنوان بدنه تابع به شمار مي رود و با فراخواني تابع اجرا ميشود .
قسمت double radius يك پارامتر از نوع double را براي اين متد تعريف مي كند. هنگامي كه يك متد فراخواني
مي شود، NET. قسمتي از حافظه را در اختيار آن قرار مي دهد تا متد بتواند از آن در انجام دستورات خود استفاده كند. پارامترهـايي
كه به اين ترتيب در بدنه متد تعريف شود، هنگام فراخواني متد در اين فضا كپي مي شوند تا متد بتواند از آنها است فاده كند. اين عمـل
موجب مي شود هر تغيري كه متد در مقدار پارامتر ايجاد كند، در متغيير اصلي تاثيري نداشته باشد .
مثلا در اين برنامه، هنگام احضار متد يك متغيير به نام radius در حافظه ي مخصوص متد تعريف مي شود و مقدار ارسالي بـه
متد به صورت اتوماتيك در آن قرار مي گيرد . بنابراين اگر مقدار 200 به متد ارسال شود مقدار متغيير تعريف شـده برابـر 200 خواهـد
بود. اين مورد همانند اين است كه در ابتداي متد يك متغيير به نام radius تعريف كنيد و مقدار آن را برابر 200 قرار دهيد :
double radius = 200;
نكته: يكي از مشكلات اين روش اي ن است كه اگر اندازه متغييـر بـزرگ باشـد، كپـي كـردن آن در از برنامـه اصـلي در حافظـه ي
مخصوص به متد زمان زيادي را مي گيرد و همچنين موجب مي شود حافظه ي زيادي اشغال شود . براي رفع اين مشكل مـي تـوان
١٠٢
1 متغيير هاي بزرگ را به روش ديگري به نام ارجاع
به متدها فرستاد . براي اي نكه يك پارامتر با استفاده از ارجاع به متد فرستاده شود
بايد قبل از تعريف پارامتر از كلمه كليدي ref استفاده كنيد. هنگامي كه يك پارامتر با استفاده از ارجاع به يـك متـد ارسـال شـود،
ديگر مقدار پارامتر در حافظه ي متد كپي نمي شود بلكه آدرس متغيير اصلي در حافظه، به م تـد فرسـتاده خواهـد شـد . بنـابراين هـر
تغييري كه متد در مقدار پارامتر ايجاد كند، بلافاصله در متغيير اصلي نيز تاثير خواهد گذاشت و مقدار آن نيز تغيير خواهد كرد .
كلمه double كه قبل از نام متد آمده است، مشخص مي كند كه اين متد مقداري را از نوع عدد اعشاري با دقـت مـضا عف بـه
جايي كه آن احضار شده است برمي گرداند :
private double CalculateAreaFromRadius(double radius)
حالا بهتر است به بدنه خود متد نگاه دقيقتري بي اندازيد . قبل از هر چيز، ميدانيد كه براي محاسبه مساحت يك دايره بايد از الگوريتم
زير استفاده كنيد :
)1 عددي كه بيانگر شعاع دايره است را دريافت كنيد.
)2 عدد را به توان دو برسانيد.
)3 حاصل را در عدد پي ضرب كنيد.
و همانطور كه مي بينيد، اين همان كاري است كه در بدنه متد انجام داده ايد :
// Declare variables
double dblRadiusSquared;
double dblResult;
// Square the radius
dblRadiusSquared = radius * radius;
// Multiply it by pi
dblResult = dblRadiusSquared * Math.PI;
عبارت Math.PI در كد قبلي مقدار ثابتي است كه در ويژوال #2005 C تعريف شده است و مقدار عدد پي را در خود نگهداري
مي كند. در خط آخر بايد نتيجه محاسبات را به برنامه فراخوان بازگردانيد. اين كار با كد زير انجام مي شود :
// Return the result
return dblResult;
كدي كه در متد button1_Click اضافه كرده ايد، تابع قبلي را احضار مي كند و نتيجه برگردانده شده توسـط تـابع را بـه
كاربر نمايش مي دهد :
// Declare variable
1 Reference
١٠٣
double dblArea;
// Calculate the area of a circle with radius 100
dblArea = CalculateAreaFromRadius(100);
// Print the results
MessageBox.Show(dblArea, “Area”);
اولين كاري كه بايد انجام دهيد اين است كه يك متغيير به نام dblArea تعريف كنيد كه مساحت دايره را در خود نگه دارد. بعد
از فراخواني تابع، مقدار برگشتي از آن را مي توانيد در اين متغيير نگهداري كنيد . با استفاده از پرانتز هايي كه در آخر نام تابع آمده انـد،
ميتوانيد پارامترهاي مورد نياز تابع را به آن ارسال كنيد . در اين جا فقط بايد يك پارامتر را به تابع ارسال كن يد و آن هـم شـعاع دايـره
خواهد بود .
بعد از اينكه متد را فراخواني كرديد، بايد صبر كنيد تا محاسبات آن تمام شود . پس از اتمام محاسبات تابع، نتيجه كـه مـساحت دايـره
است برگردانده مي شود و در متغيير dblArea قرار ميگيرد. اكنون ميتوانيد نتيجه را به روش هميشگي در صفحه نمايش دهيد .
انتخاب نام براي متد :
در چارچوب NET. يك سري استاندارد براي نامگذاري توابع و متدها تعريف شده اند كه بهتر است هنگام انتخـاب نـام بـراي متـد
آنها را رعايت كنيد . اين مورد باعث مي شود برنامه نويسان راحت تر بتوانند كدهاي نوشته شده توسط خود را به زبان ديگر ي منتقـل
كنند. توصيه ميكنيم كه هنگام نامگذاري متدها از روش نامگذاري پاسكال استفاده كنيد . يعني فقط اولين حـرف نـام هـر متـد را بـه
صورت بزرگ بنويسيد . البته اين مورد فقط يك توصيه براي خوانا تر شدن كدها در ويژوال #2005 C اسـت و هـيچ اجبـاري در آن
نيست. به مثال هاي زير توجه كنيد :
CalculateAreaFromRadius
OpenXmlFile
GetEnvironmentValue
توجه كنيد كه در مثال هاي بالا حتي در مواردي كه از حروف مخفف هم استفاده شده است (XML در مثال دوم) تمام حروف به جز
حرف اول به صورت كوچك نوشته شده اند . رعايت اين نكته به خصوص در زبانهايي مثـ ل #C كـه بـه كـوچكي و بزرگـي حـروف
حساس هستند، ميتواند از گيج شدن برنامه نويس در برابر نام تابع جلوگيري كند .
قاعده ديگر در مورد نامگذاري پارامتر ها است . در نامگذاري پارامتر ها بهتر است همانند نامگذاري توابع و متدها عمل كنيد اما حروف
اول هر پارامتر را نيز كوچك قرار دهيد. به مثال هاي زير در اين مورد توجه كنيد :
myAccount
customerDetails
updatedDnsRecords
در اينجا نيز، همه چيز حتي كلمات اختصاري هم بايد از قواعد نامگذاري پيروي كنند (همانند DNS در مثال بالا ).
همانطور كه ميدانيد در NET. كدها به زبان خاصي وابسته نيستن د و كدهاي موجود در يك زبان ميتوانند در زيانهـاي ديگـر مـورد
استفاده قرار بگيرند . بنابراين بهتر است از اين قواعد پيروي كنيد تا هم در زبانهايي كه به نوع حروف حساس هستند و هم در زبانهايي
كه نسبت به اين مورد حساس نيستند با مشكلي مواجه نشويد .
١٠٤
نكته: زبانهايي مانند Visual Basic به بزرگي و كوچكي حروف حساس نيستند اما زبانهاي #J# ،C و ++C حـساس
به حروف هستند . براي مثال در اين زبانها متغيير intNumber با متغيير INTNUMBER و يا intnumber متفاوت
است .