متدها :
يك متد، يك تكه كد است كه وظيفه خاصي را انجام مي دهد . متدها كه پروسيج ر هم ناميده ميـشوند بـه دو دليـل اهميـت زيـاديدارند. دليل اول اين است كه آنها برنامه را به قسمتهاي كوچكتر تقسيم مي كنند و موجب ميشوند كـه برنامـه بهتـر درك شـود . دوماينكه آنها قابليت استفاده مجدد از كدها را افزايش مي دهند . استفاده مجدد از كدها به اندازه اي مهم اس ت كه تا آخر اين كتاب بيشتروقت خود را صرف آن مي كنيد .همانطور كه ميدانيد، هنگامي كه شروع به نوشتن يك برنامه ميكنيد، ابتدا بايد الگوريتم كلي آن را تهيه كـرده و سـپس جزئيـات هـرقسمت از الگوريتم را به كد تبديل كنيد تا كل بخشهاي الگوريتم را به صورت كد داشته باشيد ، سپس با كنار هم قرار دادن اين كـدهابه الگوريتم كلي ميرسيد . يك متد، يكي از خطهاي اين الگوريتم كلي را اجرا مي كند، براي مثال “يك فايل را باز كن “، “يك مـتنرا روي صفحه نمايش بده”، “يك صفحه را چاپ كن” و يا مواردي از اين قبيل .دانستن اين كه چگونه يك برنامه را ب ه چند قسمت كوچكتر تقسيم كنيد موردي است كه به تجربه بستگي دارد . اهميت تقسيم كردنيك برنامه به چند قسمت كوچك و تاثير آن در سادگي برنامه را زماني مشاهده خواهيد كرد كه برنامه هاي بسيار پيچيده تري نسبت1 Unicodeبه آنهايي كه تاكنون نوشته ايد، بنويسيد . در ادامه ي اين بخش سعي مي كنيم به شما بگوييم چرا و چگونـه بايـد از متـدها اسـتفاده كنيم .
چرا از متدها استفاده مي كنيم؟
در استفاده از متدها، شما بايد اطلاعاتي كه يك متد براي اجرا به آنها نياز دارد را فراهم كنيد تا نتيجه ي مطلوبي دريافت كنيـد . ايـناطلاعات ممكن است يك عدد صحيح، يك رشته متني و يا تركيبي از هر دو باشد. اين اطلاعات به عنوان مقادير ورودي شـناختهميشوند. البته بعضي از متدها ورودي دريافت نمي كنند، بنابراين داشتن مقدار ورودي براي يك متد لازم نيست . يك متد با استفاده ازاين اطلاعات ورودي و نيز يك سري اطلاعات دروني (براي مثال دانستن اطلاعاتي در رابطه با وضعيت كنوني برنامه ) سعي ميكند تاوظيفه خود را انجام دهد .
هنگامي كه اين اطلاعات را به برنامه مي فرستيد، در اصطلاح داده به تابع فرستاده ايد. به اين داده ها پارامتر هم گفته ميـشود . درنهايت براي استفاده از يك تابع شما بايد آن را فراخواني كنيد. خلاصه، شما يك متد را فراخواني ميكنيد و داده هاي مـورد نيـاز آنرا به وسيله پارامتر ها به آن ميفرستيد .همانطور كه در قبل هم ذكر شد، دليل استفاده از يك تابع اين است كه از يك قطعه كد چندين بار استفاده كنيم . براي اين كار ابتـدابايد بتوانيم الگوريت م برنامه را در حالت كلي بررسي كنيم و سپس قسمتهايي كه ممكن است چند بار به آنها نياز پيدا كنيم را مشخصكنيم. بعد از مشخص كردن اين قسمتها، ميتوانيم آنها را با استفاده از متدها بنويسيم و سپس متدها را چندين بـار در برنامـه اسـتفادهكنيم .
براي مثال تصور كنيد كه بر نامه شما از الگوريتم هاي زيادي تشكيل شده است. بعضي از اين الگوريتم ها براي محاسـبات خـود نيـازدارند كه بتوانند محيط دايره را محاسبه كنند . چون بعضي از قسمتهاي الگوريتم ما نياز دارند كه نحوه محاسبه محيط دايـره را بداننـد،استفاده از يك متد در اين مورد ميتواند من اسب باشد . شما ميتوانيد متدي بنويسيد كه بتواند محيط يك دايره را بـا دانـستن شـعاع آنمحاسبه كند، سپس در هر قسمت از الگوريتم كه به محاسبه محيط نياز بود ميتوانيد اين متد را فراخواني كنيد . به ايـن ترتيـب نيـازينيست كدي كه يك كار مشخص را انجام ميدهد چند بار نوشته شو . د شما فقط يك بار كد را مي نويـسيد و چنـد بـار از آن اسـتفاده ميكنيد .
همچنين ممكن است يك قسمت از الگوريتم بخواهد محيط يك دايره به شعاع 100 را بداند و قسمتي ديگر محـيط يـك دايـره بـهشعاع 200. بنابراين متد شما ميتواند شعاع دايره را به عنوان پارامتر از ورودي بگيرد و سپس محيط را محاسبه كند . به اين ترتيب اينمتد در هر شرايطي ميتواند مورد استفاده قرار بگيرد .
نكته: در ويژوال # C يك متد يا ميتواند مقداري را برگرداند و يـا هـيچ مقـداري را برنگردانـد . بـه متـدهايي كـه مقـداري را برميگردانند يك تابع2 و به متدهايي كه هيچ مقداري را برنميگردانند يك يز ربرنامهگفته مي شود .
متدهايي كه تاكنون ديده ايد :
1 Function
2 Subroutine
بهتر است بدانيد كه تاكنون در برنامه هايي كه در قسمتهاي قبلي نوشته ايم، از متدهاي زيادي استفاده كرده ايد . به عنوان مثـال كـدزير را كه در ابتداي فصل نوشتيد ملاحظه كنيد :
private void btnAdd_Click(object sender, EventArgs e)
{
// Define a variable for intNumber
int intNumber;
// Set the initial value
intNumber = 27;
// Add 1 to the value of intNumber
intNumber = intNumber + 1;
// Display the new value of intNumber
MessageBox.Show(“The value of intNumber + 1 = ” +
intNumber, “Variables”);
}
اين كد يك متد است زيرا همانطور كه در تعريف متد گفتيم، قطعه كدي مجزا است كه كار خاصي را انجام مي دهـد . در اينجـا ايـنقطعه كد عدد يك را به متغيير intNumber اضافه ميكند و نتيجه را نمايش ميدهد .اين متد هيچ مقداري را بر نمي گرداند بنابراين نوع مقدار بازگشتي void تعريف شده است . كلمه void به كامپايلر مـي گويـدكه اين متد هيچ مقداري را بر نمي گرداند . اگر متدي مقداري را برگرداند به جاي استفاده از void بايد نوع مقـداري كـه برگـشتداده مي شود را بنويسيد (براي مثال int يا double يا …). هر دستوري كه بين دو علامت آكولاد نوشته شود جزئـي از بدنـه ي متد محسوب مي شود . يك متد به صورت زير تعريف مي شود (البته اين متد به صورت اتوماتيك توسط ويژوال # C ايجادشده است ):
private void btnAdd_Click(object sender, EventArgs e)
)1 قبل از هر چيز، كلمه private را در تعريف تابع مشاهده ميكنيد در. باره اين كلمـه در فـصلهاي بعـدي بـه تفـصيلبحث شده است . فعلا، فقط بدانيد كه اين كلمه موجب ميشود اين متد فقط توسط توابع و يا متدهاي ديگـر داخـل همـانبخش استفاده شود .
)2 كلمه بعدي، كلمه void است كه همانطور كه گفتيم به ويژوال #C مي گويد اين متد هيچ مقداري را برنمي گرداند
)3 بعد از void با كلمه btnAdd_Click روبرو ميشويد. همانطور كه ممكن است حدس زده باشيد، اين كلمه ناممتدي است كه تعريف كرده ايم.
)4 چهارمين مورد در تعريف اين تابع پارامترهايي است كه به آن فرستاده مي شود . همانطور كه مشاهده ميكنيد ايـن تـابع دوپارامتر را دريافت ميكند. پارامتر اول، sender از نوع object است و پارامتر دوم e از نـوع EventArgsاست. در مورد اين پارامتر ها در بخشهاي بعدي بيشتر صحبت خواهيم كرد.در امتحان كنيد بعدي، يك متد ايجاد خواهيد كرد كه يك عبارت را با استفاده از كادر پيغام در صفحه نمايش دهد و سپس ا ين متد را به وسيله سه دكمه فرمان متفاوت فراخواني خواهيد كرد .
)1 يك پروژه ويندوزي با ويژوال #2005 C ايجاد كنيد و نام آن را برابر Three Buttons قرار دهيد .
)2 با استفاده از جعبه ابزار سه دكمه فرمان بر روي فرم خود قرار دهيد.
)3 روي دكمه فرمان اول دو بار كليك كنيد و سپس كد مشخص شده در زير را به آن اضافه كنيد:
private void button1_Click(object sender, EventArgs e)
{
// Call your method
SayHello();
}
private void SayHello()
{
// Display a message box
MessageBox.Show(“Hello, World!”, “Three Buttons”);
}
)4 برنامه را اجرا كنيد . فرمي را با سه دكمه فرمان مشاهده خواهيد كرد. بر روي بـالاترين دكمـه فرمـان كليـك كنيـد . كـادرپيغامي با عبارت !Hello, World را خواهيد ديد .
همانطور كه مي دانيد، هنگامي كه در محيط طراحي بر روي يك دكمه فرم ان دو بار كليك مي كنيد، ويژوال #2005 C تابعي مانندزير را به صورت اتوماتيك ايجاد مي كند :
private void button1_Click(object sender, EventArgs e)
{
}
1 هنگامي كه كاربر روي اين دكمه در برنامه كليك كند، اصطلاحا يك يرو داددر برنامه رخ داده اسـت . ويـژوال #2005 C هنگـامكامپايل اين متد، كدي را به آن اضافه مي كند تا اين متد هنگام رخ دادن رويداد كليك اين دكمه اجرا شود . به عبارت ديگـر ويـژوال#C زماني كه كاربر روي اين دكمه فرمان در برنامه كليك كرد، اين متد را فراخواني مي كند . اين متد دو پارامتر را به عنوان ورودي دريافت مي كند، كه فعلا در مورد آنها صحبتي نمي كنيم . در فصلهاي بعد بيشتر با رويدادها و نحوه اسـتفاده از آنهـا در برنامـه آشـناخواهيد شد .
1 Event
در بيرون از اين متد، متد ديگري را به صورت زير تعريف مي كنيد :
private void SayHello()
{
// Display a message box
MessageBox.Show(“Hello, World!”, “Three Buttons”);
}
اين متد جديد، SayHello ناميده ميشود . هر چيزي كه در بين دو آكولاد متد قرار بگيرد، جزئي از كد اين متد محسوب ميـشودو هنگامي كه متد فراخواني شود، اجرا خواهد شد. در اين حالت، كد نوشته شده در اين متد يك كادر پيغام را نمايش مي دهد .همانطور كه ميدانيد با كليك كردن بر روي دكمه فرمان، ويژوال #2005 C متد button1_Click را اجرا ميكنـد و ايـنمتد نيز SayHello را احضار ميكند . نتيجه اين كه با كليك بر روي دكمه فرمان، كد داخل متد SayHello اجرا ميـشودو كادر پيغامي نمايش داده ميشود .
private void button1_Click(object sender, EventArgs e)
{
// Call your method
SayHello();
}
تا اينجا مقداري با تعريف تابع و نيز استفاده از آن آشنا شديد، اما سوالي كه ممكن است به وجود آيد اين است كه چرا نياز داريد متديبنويسيد كه كادر پيغامي را نمايش دهد؟ در بخش امتحان كنيد بعد دليل اين كار را بيشتر متوجه خواهيد شد .
)1 اگر پروژه قبلي در حال اجرا است، آن را ببنديد .
)2 روي دكمه فرمان دوم دو بار كليك كنيد و كد زير را در متد ايجاد شده وارد كنيد:
private void button2_Click(object sender, EventArgs e)
{
// Call your method
SayHello();
}
)3 به قسمت طراحي برگرديد و روي دكمه فرمان سوم دو بار كليك كنيد. در متد ايجاد شده كد زير را وارد كنيد :
private void button3_Click(object sender, EventArgs e)
{
// Call your method
SayHello();
}
)4 حالا برنامه را اجرا كنيد و روي دكمه هاي فرمان كليك كنيد . مشاهده مي كنيد كه همه دكمه ها كادر پيغـام يكـساني رانمايش مي دهند
)5 اجراي برنامه را متوقف كنيد و متد SayHello را در بخش كد برنامه پيدا كنيد . متني كه در كادر پيغام نمـايش دادهميشود را به صورت زير تغيير دهيد:
private void SayHello()
{
// Display a message box
MessageBox.Show(“I have changed!”, “Three Buttons”);
}
)6 برنامه را مجددا اجرا كنيد و روي دكمه هاي فرمان كليك كنيد . توجه كنيد كه متن مورد نمايش در كادر پيغام تغيير كـرده
است .
1 هر كدام از متدهاي مخصوص به رويداد كليك دكمه هاي فرمان، متد SayHello را فراخواني مي كنند :
private void button1_Click(object sender, EventArgs e)
{
// Call your method
SayHello();
}
private void button2_Click(object sender, EventArgs e)
{
// Call your method
SayHello();
}
private void button3_Click(object sender, EventArgs e)
{
// Call your method
SayHello();
}
همانطور كه از اسم اين متدها نيز مشخص است، هر كدام از آنها براي كنترل رويداد يكي از دكمه فرمانهاي روي فرم هستند .به اين متدها كه براي كنترل يك رويداد به كار مي روند، Event Handler نيز گفته مي شود .توجه كنيد هنگامي كه شما نحوه كارك رد متد SayHello را كه هر سه متد از آن استفاده مي كنند تغيير دهيد، تغييرات بـه هـرسه دكمه فرمان اعمال ميشود . اين مورد در برنامه نويسي موضوع بسيار مهمي است . اگر شما متدهاي كد خود را به نحـوي منطقـيتنظيم كنيد، ميتوانيد با تغيير يك متد در قسمتي از برنامه، بر روي تمام قسمتهاي برنامه تاثير بگذاريد . همچنين اين مـورد شـما را از وارد كردن كدهاي يكسان و مشابه به صورت تكراري نيز نجات ميدهد