|
Iranian Experts
|
||
|
نکاتی در رابطه با برنامه نویسی و فن آوری اطلاعات |
نکاتی که در برنامه نويسی بايد (ترجيحا) رعايت شود (قسمت دوم)
نگارش 1
مطالبی را که در اين مقاله ملاحظه می فرماييد، صرفا روش ها و عملکردهايی است که اينجانب شخصا در پروژه هايم لحاظ کرده و می کنم. قضاوت درستی و يا نادرستی آنها با خواننده محترم می باشد.
- هرچند که در زمان طراحی و پياده سازی کلاسها، امکان تعريف فيلدهای Public وجود دارد، ولی به عنوان يک برنامه نويس حرفه ای به هيچ وجه از فيلدهای Public استفاده ننماييد!. حال ممکن است از خود سوال نماييد که چگونه می توان فيلدهای Public را شبيه سازی نمود؟ بسيار ساده است! شما بهتر است فيلدهايی را که می خواهيد Public تعريف نماييد، به صورت Private تعريف نموده و برای قابل دسترس بودن آنها به طور متناظر از Property استفاده نماييد:
روش نادرست:
public int Age;
روش صحيح:
private int _age;
public int Age
{
get
{
return(_age);
}
set
{
_age = value;
}
}
توجه: دلايل عدم استفاده از فيلدهای Public بسيار زياد می باشد و از حوصله اين مقاله خارج است.
- يکی ديگر از مواردی که در زمان طراحی و پياده سازی کلاس ها حائز اهميت می باشد، نحوه نامگذاری متغيرها می باشد. البته لازم به ذکر است که استانداردهای متفاوتی در اين زمينه وجود دارد که شخصا استاندارد ذيل را مطلوب تر ارزيابی کرده و بسيار علاقه مندم که ديگر دوستان، ما را با استانداردهای ديگری نيز آشنا نمايند. استانداردی که در ذيل عنوان خواهد شد، يکی از استانداردهای استفاده شده در زبان برنامه نويسی Java بوده که طبعا بکارگيری آن در زبان برنامه نويسی #C، خالی از لطف نمی باشد:
1- در اين استاندارد، اسامی فيلدهای Public و Property ها با حرف اول بزرگ آغاز شده و بقيه حروف، به صورت کوچک نوشته می شوند. مانند کلمات: Age و FullName
دقت کنيد که اگر نام فيلد مانند FullName از چند کلمه تشکيل شده باشد، قاعده مذکور در مورد هر کلمه صادق می باشد.
2- فيلدهای Private و Protected مانند فيلدهای Public و Property ها بوده و تنها تفاوت آنها اين است که حرف اول، اولين کلمه آن با حروف کوچک آغاز گردد و قبل از آن از Underline استفاده می شود. مانند کلمات: age_ و fullName_
3- پارامترهای ورودی توابع نيز مانند فيلدهای Public و Property ها تعريف شده و تنها کافی است که حرف اول، اولين کلمه آن با حروف کوچک آغاز گردد. مانند کلمات: age و fullName
4- متغيرهای تعريف شده در داخل توابع و Block ها نيز مانند فيلدهای Public و Property ها تعريف شده و تنها کافی است که مشخصه يا نوع آنها، ترجيحا با سه حرف کوچک در قبل از آنها قرار بگيرد. مانند کلمات: intAge و strFullName
نمونه ذيل را با هم می بينيم:
public class Person
{
private string _fullName;
public string FullName
{
get
{
return(_fullName);
}
set
{
_fullName = value;
}
}
public Person(string fullName)
{
string strFullName = "Dariush Tasdighi!";
if(fullName == "")
FullName = strFullName;
else
FullName = fullName;
}
}
سربلند و سرافراز باشيد
داريوش تصديقی
مقدمه ای بر Design Pattern قسمت اول
نگارش 1
با عرض سلام خدمت دوستان عزيز و گرامی. در اين مقاله و مقاله بعدی، تصميم دارم که شما را با مفاهيم Design Pattern آشنا نمايم. دوستان عزيز، در صورتيکه که با زبان های NET. به عنوان زبانهای کاملا شیء گرا آشنايی داشته باشيد، مطمئنا با کلاس های متعددی آشنا شده و يا شخصا نسبت به ايجاد آنها اقدام کرده ايد. حال اگر به زبان ساده Member های يک کلاس را Fields, Property, Method, Event بناميم، شايد شما تاکنون با صدها و يا هزاران کلاسی که با يک و يا ترکيبی از اين Member ها ايجاد می شوند، آشنا شده و يا ايجاد کرده باشيد. حال با توجه به مطالب عنوان شده، سوال اين است که يادگيری Pattern ها چه جايگاهی در طراحی و يا پياده سازی کلاس ها دارد؟
اجازه دهيد که با مثال ساده، اين مساله را بررسی نماييم:
دوستان، شايد در زمان طراحی و يا پياده سازی برنامه های خود، با کلاسهايی روبرو شده ايد که اصطلاحا کلاسهای کلاسيک نبوده اند! و در زمان طراحی و يا پياده سازی آنها، شما را کمی به فکر فرو برده و يا بعضا دچار سردرگمی کرده باشند!. در اينگونه موارد Pattern ها به ياری شما آمده و مشکلاتتان را تا حجم قابل قبولی حل می نمايند. اجازه دهيد نمونه ای را با هم بررسی نماييم. تصور کنيد که تصميم داريد در پروژه خود، کلاسی طراحی نماييد که بتوان از آن تنها يک شیء ايجاد نمود! ممکن است کمی تعجب کنيد!! ولی باور کنيد که در يک پروژه واقعی به کرات اتفاق می افتد که شما تمايل به ايجاد چنين کلاس هايی داشته باشيد. اجازه دهيد نمونه هايی از اين دست را برای شما ذکر نمايم:
1- کلاس مديرعامل. (در يک سازمان بيش از يک مديرعامل وجود ندارد)
2- کلاس رئيس هيات مديره. (در يک سازمان بيش از يک رئيس هيات مديره وجود ندارد)
3- کلاس Supervisor.
4- کلاس Connection. با توجه به اينکه در اکثر موارد پيشنهاد می شود که در هر پروژه، خصوصا در پروژه های Windows Based بيش از يک Connection به بانک اطلاعاتی نداشته باشيم، ايجاد کلاسی که تنها امکان يک شیء Connection داشته باشد، بسيار اهميت خواهد داشت.
با توجه به نمونه های فوق، ايجاد کلاسی که بتوان از آن فقط يک شیء ايجاد نمود، اهميت زيادی پيدا می کند. ولی چگونه چنين کلاسی ايجاد نماييم:
1- در صورتيکه خودمان می خواهيم از چنين کلاسی استفاده نماييم، تا آخر پروژه حواسمان را جمع کنيم که خدای نکرده، بيش از يک شیء از آن ايجاد نکنيم!
2- در صورتيکه در پروژه تيمی کار می کنيم، همکارانمان را قسم دهيم! که از اين کلاس بيش از يک شیء ايجاد نکنند!!
3- ساعتها فکر کنيم تا يک راه حل نسبتا قابل قبولی پيدا کنيم!!!
صبر کنيد! اين روشها را فقط برای مزاح عرض کردم!! مطمئن باشيد که بکارگیری هر يک از اين سه روش فوق، پروژه شما را با بحران جدی مواجه می کند. پس راه حل چيست؟
در واقع طراحی چنين کلاس هايی، به مرور زمان، گريبانگير هر برنامه نويسی شده است و به مرور زمان، برنامه نويسان خبره با توجه به تجربيات شخصی و ديگران، تصميم به ايجاد الگوهايی کرده اند که راه حل اينگونه مشکلات خواهد بود. در حال حاضر شايد در حدود يکصد الگو يا Pattern در اين رابطه وجود داشته باشد که تنها بيست و پنج مورد از آنها استاندارد شده و مورد استفاده طراحان و برنامه نويسان قرار می گيرد. شايد يکی از ساده ترين و پرکاربرد ترين اين الگوها، الگوی Singleton بوده که با استفاده از آن، نمونه های فوق به راحتی قابل طراحی و پياده سازی می باشند. نکته قابل توجه اين است که در برنامه Rational XDE 2003، تمامی اين الگوهای معروف به صورت Built in وجود داشته و طراحان می توانند تنها با يک Drag & Drop ساده، از اين الگوها در طراحی خود استفاده نمايند. لذا يادگيری اين الگوها را برنامه نويسان عزيز و خصوصا طراحان گرامی پيشنهاد می کنم.
نکته اول: در نگارش 2 همين مقاله، پس از Upload فايل آموزشی Introduction to Design Pattern with C# Language، که توسط شرکت IBM نوشته شده است، لينک مربوط به آن را برای دريافت فايل PDF مربوطه، قرار می دهم.
نکته دوم: به اميد خداوند متعال، در مقاله بعدی، پياده سازی و تحيل اين الگو (Singleton) را به شما عزيزان آموزش خواهم داد.
شاد و پيروز باشيد
داريوش تصديقی
لينک مربوط به دريافت برنامه Visual Studio 2005 Beta 2
نگارش 1
سلام دوستان گرامی، لينک مربوط به صفحه ای که از طريق آن می توانيد نسخه جديد برنامه Visual Studio 2005 Beta 2 را Download نماييد، در اختيارتان قرار می دهم. در صورتی که در بين دوستان، شخص با محبت و با حوصله ای وجود دارد که امکان دريافت اين فايل ها داشته باشد (البته حجم اين فايلها نسبتا قابل توجه می باشد و نياز به خطوط ارتباطی پر سرعت می باشد!)، تقاضا می کنم که پس از Download، در صورت تمايل، در قسمت نظردهی نام و آدرس پست الکترونيکی خود را نوشته تا اينجانب و يا ديگر دوستان امکان دريافت نسخه هايی از آن را داشته باشيم.
قبلا از محبت شما دوست گرامی سپاسگزارم
در پناه حق باشيد
داريوش تصديقی
نکاتی که در برنامه نويسی بايد (ترجيحا) رعايت شود (قسمت اول)
نگارش 1
مطالبی را که در اين مقاله ملاحظه می فرماييد، صرفا روش ها و عملکردهايی است که اينجانب شخصا در پروژه هايم لحاظ کرده و می کنم. قضاوت درستی و يا نادرستی آنها با خواننده محترم می باشد.
- مسوولين مايکروسافت تاکيد دارند در صورتيکه تداخلی (Conflict) در بکارگيری کلاس ها وجود نداشته باشد، هميشه فضاهای نامی (Namespace) را در بالای صفحات، با استفاده از کلمه Using مشخص نماييم. البته اين گفته تا حدودی نيز صحيح می باشد و شايد اکثر دوستان نيز اين قاعده را رعايت کرده و می کنند و اکثرا در بالای صفحات خود با عباراتی مانند نمونه های ذيل برخورد کرده اند:
Using System;
Using System.Windows.Forms;
ولی نظر اينجانب کاملا متفاوت است! اگر تمامی نمونه برنامه های اينجانب را چه در پروژه های در مقياس کوچک و يا متوسط مشاهده نماييد، خواهيد ديد که حتی يک Using نيز در بالای صفحات وجود ندارد! علت اين است که هر چند با توجه به پيشنهاد مايکروسافت، از نوشته شدن سورس کد اضافی، اجتناب می شود، ولی يادگيری فضاهای نامی کلاسهای پرکاربرد مايکروسافت، به شدت دچار اشکال می شود. اجازه دهيد نمونه ای را مطرح نمايم. بارها مشاهده شده است که برنامه نويسان، برای حل مشکلی، نمونه سورس کدی را از اينترنت بدست می آورند و از آنجاييکه اکثر برنامه نويسان بی حوصله هستند، مگر خلاف آن ثابت شود! از کل سورس کد، تنها قسمت کوچکی را که تمايل دارند، کپی نموده و در برنامه خود Paste می کنند. زمانيکه برنامه را Compile می کنند، با هزاران خطا مواجه می شوند! و چون حوصله جستجو در اينترنت و MSDN را برای يافتن فضاهای نامی مناسب ندارند، کل فضاهای نامی سورس کد اوليه را کپی کرده و سورس کد خود را با حجمی بيهوده از فضاهای نامی مزين می کنند! تجربه ای که اينجانب و ديگر دوستانم در حذف تمامی فضاهای نامی به روش معمول داشته ايم، اين بوده است که به لطف خداوند و به مرور زمان، تقريبا روی اکثر فضاهای نامی پرکاربرد مسلط شده و در اين راستا با کلاسها و فضاهای نامی مفيد ديگری نيز در حين کار آشنا شده ايم. لذا از اين پس در تمامی سورس کدهايی که تقديم حضور خواهد شد، هيچ گونه فضای نامی به گونه متعارف استفاده نخواهد شد!
- شايد خيلی از دوستان، قبل از برنامه نويسی با زبان های شیء گرا خصوصا #C با زبان های برنامه نويسی Structured مانند Foxpro و يا Event Oriented مانند Visual Basic و غيره آشنايی داشته باشند. در آن زبانها بسيار اتفاق افتاده است که برنامه نويسان تمايل داشته باشند تا قسمت هايی از سورس کد خود را در داخل يک زير برنامه (Sub Routine) نوشته و در مکانهای مناسبی صدا (Call) نمايند. اين تفکر کماکان با حفظ احتياط در زبان های برنامه نويسی شیء گرا نيز قابل پياده سازی می باشد. تعجب نکنيد! تصور نکنيد که برای هر کاری در زبانهای برنامه نويسی شیء گرا بايد کلاسی خلق کرده و از آن شيئی ايجاد کرده تا بتوانيد تابعی (متدی) از آنرا اجرا نماييد!. در زبان برنامه نويسی #C، شما می توانيد کلاسی ايجاد کرده و در آن متد و يا متدهايی به صورت استاتيک (Static) تعريف نماييد. متدهای استاتيک مربوط به خود کلاس بوده و اساسا ارتباطی با اشياء کلاس ندارند. لذا شما می توانيد از طريق خود کلاس، تابع استاتيک مربوطه را اجرا نماييد. در صورتی که با Console Application کار کرده باشيد، به کرات با دستوراتی به شکل ذيل مواجه شده ايد:
System.Console.WriteLine("Hello World!");
در نمونه فوق، در فضای نامی System، کلاسی به نام Console وجود دارد که در داخل آن تابع استاتيکی به نام WriteLine در نظر گرفته شده است. در نمونه فوق شما نيازی به ايجاد شيئی از نوع کلاس Console برای به اجرا درآوردن تابع WriteLine نداريد!
با توجه به مطالب فوق، شايد در يک پروژه واقعی ايجاد توابعی که چندان ارتباطی با مفهوم کلاس و شیء و غيره ندارند، بسيار ضروری باشد. ما اينگونه پيشنهاد می کنيم:
معمولا بهتر است که در هر پروژه يک کلاس با نام Globals و يا Publics و يا Utilities به شکل ذيل تعريف نماييد:
public sealed class Utilities
{
private Utilities(){}
}
و سپس تمامی توابعی که تمايل داريد به طور کاملا مستقل اجرا شوند را به صورت استاتيک در داخل آن تعريف نماييد:
public sealed class Utilities
{
private Utilities(){}
public static bool CreateFolder(string pathName)
{
bool blnResult = true;
return(blnResult);
}
}
در تکميل مطالب فوق، عنوان چند نکته ضروری می باشد:
اول آنکه در تعريف اين کلاس، از کلمه sealed استفاده شده است. بکارگيری اين کلمه بدين معنی است که از اين کلاس نمی توان Inherit کرد، که بديهی است ارث بری از چنين کلاسی که تنها با يک سری توابع استاتيک تعريف شده است، چندان کار عاقلانه ای نباشد.
دوم آنکه سازنده (Constructor) اين کلاس به صورت Private تعريف شده است. علت اين امر آن است که ما نه تنها تمايل نداريم بلکه به طور کلی معنی ندارد که کاربر (کسی که از اين Library استفاده می کند) بتواند از اين کلاس شيئی بسازد.
- يکی از مواردی که شايد در برنامه نويسی مفيد باشد، ايجاد کلاس ها در فضاهای نامی مناسب و لايه ای است، که البته در اين زمينه اختلاف نظرهايی نيز وجود دارد. اجازه دهيد موضوع را با يک مثال توضيح دهيم. فرض کنيد که می خواهيم يک Library در رابطه با مديريت فايل ها و پوشه ها مانند ايجاد پوشه، تغيير نام پوشه، حذف پوشه و غيره ايجاد نماييم و تصور کنيد که برای انجام اين عمل، به کلاسی با نام Utilities به شکل تعريف شده در مطلب قبلی نياز داشته باشيم. حال سوال اين است که اين کلاس را در چه فضای نامی تعريف نماييم:
راه حل اول: برخی بر اين عقيده اند، برای اينکه بکارگيری Library آسان تر باشد، بهتر است در همان فضای نامی که مايکروسافت تعريف کرده است، مشخص شود:
namespace System.IO
{
public sealed class Utilities
{
private Utilities(){}
public static bool CreateFolder(string pathName)
{
bool blnResult = true;
return(blnResult);
}
}
}
يکی از مزيت هايی که در اين روش مستتر می باشد اين است که کاربری که سالها با فضای نامی System.IO کار کرده، برای استفاده از کلاس Utilities شما، ديگر نيازی به مطالعه فضاهای نامی که در مستندات خود مشخص کرده ايد، نخواهد داشت! و به راحتی می تواند در قسمت های مختلف برنامه، از کلاس شما استفاده نمايد:
System.IO.Utilities.CreateFolder("C:\\Temp");
راه حل دوم: راه حل دوم نيز بی شباهت به راه حل اول نمی باشد، در اين روش به جای استفاده از کلمه System از نام شخص يا شرکت سازنده استفاده می شود و به ازای هر يک از لايه های فضای نامی يک پوشه در ريشه پروژه ايجاد می شود. به عنوان نمونه تصور کنيد که شرکت ايران خودرو تمايل دارد که يک Library به شکل فوق ايجاد نمايد. در اين صورت ابتدا در ريشه پروژه، يک پوشه به نام IranKhodro ايجاد کرده و در داخل آن پوشه ديگری به نام IO ايجاد می نمايد و سپس در داخل پوشه IO کلاسی به شکل ذيل ايجاد می نمايد:
namespace IranKhodro.IO
{
public sealed class Utilities
{
private Utilities(){}
public static bool CreateFolder(string pathName)
{
bool blnResult = true;
return(blnResult);
}
}
}
در اين نمونه نيز کاربر به راحتی می تواند با سابقه ذهنی که از فضاهای نامی مايکروسافت دارد و تنها با جايگزينی کلمه System به IranKhodro به تابع مورد نظر خود دسترسی پيدا کند:
IranKhodro.IO.Utilities.CreateFolder("C:\\Temp");
که البته اينجانب به شخصه، روش دوم را بيشتر می پسندم.
- شرمنده! می دانم که خسته شده ايد!! ولی يه چند لحظه تحمل کنيد تا اين نکته آخر را نيز خاطر نشان نمايم. به عنوان حسن ختام، پيشنهاد می کنم که تمامی توابعی که تعريف می کنيد، چه توابعی که به صورت استاتيک تعريف می کنيد و چه توابعی که به صورت غير استاتيک تعريف می نماييد، بايد (بهتر است) به صورت امری تعريف کرده و با يک فعل آغاز نماييد. اين مطلب در ادبيات شیء گرايی بسيار حائز اهميت می باشد. به عنوان نمونه بکارگيری توابعی که با کلماتی همچون Get, Put, Set و غيره آغاز می شوند، بسيار مناسب تر می باشد.
در صورتيکه اين نظرات مورد توجه شما دوستان گرامی قرار گرفت، مرا را نيز در جريان قرار دهيد، تا نکات ديگری را نيز در اين راستا مطرح نمايم.
قبلا از اينکه حوصله کرديد، سپاسگزارم
هميشه سر سبز و خرم باشيد
داريوش تصديقی
آشنايی با زبان RSS و نحوه دريافت و مشاهده فايلهای آن در رايانه شخصی
نگارش 2
شايد بتوان به جرات گفت که يکی از فرزندان خلف استاندارد XML، زبان RSS می باشد. RSS مخفف کلمات Really Simple Syndication بوده و در حال حاضر يکی از پرطرفدارترين زبان ها در بين طراحان و برنامه نويسان تحت وب می باشد. بسيار علاقه مند هستم که آموزش هايی را در رابطه با استاندارد XML به زبان ساده شروع نمايم و در رابطه با زبان RSS و نحوه ايجاد و بکارگيری آن در سايت ها، مقالاتی را به رشته تحرير درآورم، ولی چون فی المجلس تمايل دارم که به صورت يک حمله گازنبری! برای خوانندگان علاقه مند نحوه دريافت و مشاهده فايلهای RSS را بر روی رايانه شخصی، عنوان نمايم، اقدام به نوشتن اين مقاله کردم.
RSS به زبان ساده:
RSS يک زبان مبتنی بر استاندارد XML می باشد. اين زبان نيز مانند تمامی زبانهای Markup Language دارای استانداردهای نگارشی مشخصی می باشد که به مرور زمان از نسخه های قديمی به آخرين نسخه قابل اعتماد، يعنی نسخه 2.0 متحول شده است. در سالهايی نه چندان دور، يکی از مشکلات اساسی طراحان و برنامه نويسان صفحات وب، عدم وجود استانداردهايی برای استفاده از محتوای طبقه بندی شده ديگر سايتها و درج آنها در سايت های مربوطه بوده است. پس از بکارگيری اين زبان در سايتهای مختلف و فراگير شدن آن، به مرور زمان اکثر سايتها مطالب خود را به صورت طبقه بندی شده، نه تنها در داخل سايت خود، بلکه به صورت فايل هايی با استاندارد XML برای استفاده مجدد آنها در ديگر سايت ها، در دسترس عموم قرار می دادند. اين مساله نه تنها از دوباره کاری مسوولين سايتها در زمينه جمع آوری و ورود اطلاعات اجتناب می کرد، بلکه برای بالا بردن Rank سايتها در Search Engine ها نيز بسيار مناسب بود. برای اثبات اين ادعا در صورتی که برای مدت کوتاهی در سايتهای مختلف ايرانی و خارجی گشت و گذار نماييد، با تصاوير کوچکی مانند
،
مواجه خواهيد شد، اين تصاوير در واقع لينک هايی به همان فايلهای RSS می باشند. در صورتی که بر روی آنها Click نماييد، يک متن که با استاندارد XML نوشته شده است را مشاهده خواهيد نمود. دقت کنيد که اين فايل و محتوای آن، چندان برای کاربرانی چون شما که هميشه به دنبال زيبايی و خوانايی صفحات می باشيد، باب طبع نخواهد بود!، ولی برای ديگر سايت ها، برای استفاده مجدد از محتوای موجود در آنها، بسيار حائز اهميت می باشد.
با گذشت زمان، علاقه کاربران خانگی نيز به محتوای طبقه بندی شده اين سايت ها افزايش يافت و نياز به برنامه هايی که بتوانند به طور خودکار به اين سايت ها متصل شده و اين فايلها را بر روی رايانه شخصی منتقل نمايند، بوجود آمد. اين برنامه ها متن اينگونه فايل ها را خوانده (Parse) و به شکلی مناسب برای خواننده قابل مشاهده می نمايند.
به عنوان نمونه، آدرس دو سايت را برای شما ذکر می کنم که می توانيد برنامه های مربوطه را به طور کاملا رايگان! دريافت کرده و بر روی رايانه شخصی خود نصب نماييد. لازم به ذکر است که در آدرس اول، سورس برنامه مربوطه نيز به زبان Net. قابل بارگزاری (Download) می باشد:
در انتها برای عزيزانی که علاقه مند مطالعه در زمينه استاندارد (زبان) RSS بوده و تمايل دارند که آشنايی بيشتری با تاريخچه و آخرين استانداردهای اين زبان پيدا کنند، آدرس هايی را در ذيل مطلب تقديم می نمايم:
http://blogs.law.harvard.edu/tech/rss
http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html
http://www.webreference.com/authoring/languages/xml/rss/intro
موفق و پيروز باشيد.
داريوش تصديقی
آيکون مربوط به Show Desktop من پاک شده! حالا چکار کنم؟
نگارش 2
سلام دوستان عزيز، لطفا مرا به سخره نگيريد، می دانم که اين نکته نه تنها به NET. مربوط نمی شود!، بلکه به زبانهای برنامه نويسی هم هيچگونه ارتباطی ندارد!!، ولی از آنجايی که اين مشکل چندين بار پوست مرا کنده و دوستان زيادی را دچار مشکل کرده است، لازم ديدم که يک جستجوی دقيق توی اينترنت بکنم و راه حل علمی و عملی آنرا از خود سايت مايکروسافت بدست آورده و برای شما بنويسم. البته چون آدرس های سايت مايکروسافت خيلی حساب و کتاب ندارد و چون ممکن است که با نوشتن آدرس مرجع خبر، چند ماه ديگر اين متن، از حيظ اعتبار خارج شود، لذا متن پيشنهادی مايکروسافت را عينا برای شما Paste می کنم. اميدوارم که مفيد واقع شود.
To re-create the Show Desktop icon on the Quick Launch toolbar, follow these steps:
1. Use any text editor (such as Notepad) to create a file with the following lines:
[Shell]
Command=2
IconFile=explorer.exe,3
[Taskbar]
Command=ToggleDesktop
2. Save the new file as a file named Show Desktop.scf in the Windows\System or Winnt\System32 folder. Note that Notepad may automatically append a .txt extension to the file name. Remove this extension if Notepad adds it. These steps do not work if the file is named Show Desktop.scf.txt.
3. Quit Notepad.
4. Using Windows Explorer or My Computer, right-click the Show Desktop .scf file, and then click Create Shortcut.
5. Copy the new shortcut to the appropriate folder.
In Microsoft Windows 95 or Windows 98, copy the shortcut to this folder:
Windows\Application Data\Microsoft\Internet Explorer\Quick Launch
In Microsoft Windows NT or Microsoft Windows 2000, copy the shortcut to this folder:
Winnt\System32
In Microsoft Windows XP, copy the shortcut to the following folder:
WINDOWS\System32\Config\Systemprofile\Application Data\Microsoft\Internet Explorer\Quick Launch
6. Rename the shortcut to Desktop.
موفق و پيروز باشيد
داريوش تصديقی
آموزش Delegate قسمت دوم
نگارش 2
همانگونه که در قسمت اول آموزش Delegate مشاهده کرديد، ما تابعی از يک شیء را در داخل يک شیء Delegate ثبت (Register) نموديم. حال در اين قسمت تصميم داريم توابع مربوط به چندين شیء را در داخل شیء Delegate ثبت نماييم تا در صورت صدا زدن (Call) شیء Delegate تمامی توابع ثبت شده در داخل آن به ترتيب اجرا شوند. برای اين منظور به مثال ذيل توجه نماييد:
Employee oEmployee1 = new Employee("Ali Reza Alavi", 12);
Employee oEmployee2 = new Employee("Mohammad Ahmadi", 22);
Employee oEmployee3 = new Employee("Dariush Tasdighi", 32);
DelegateInstance = new MyDelegate(oEmployee1.DoIt);
DelegateInstance += new MyDelegate(oEmployee2.DoIt);
DelegateInstance += new MyDelegate(oEmployee3.DoIt);
در اين مثال، ما سه شیء از کلاس Employee ايجاد کرده و به ترتيب توابع DoIt آنها را در داخل شیء Delegate ثبت کرديم. حال در صورتيکه شیء Delegate را با پارامتر 4 اجرا نماييم، تمامی توابع اين سه شیء به ترتيب اجرا می شوند:
DelegateInstance(4);
چهار نکته اساسی:
نکته اول: توجه داشته باشيد که هيچ لزومی ندارد شما توابع اشياء يک کلاس خاص را در داخل يک شیء Delegate ثبت نماييد. شما می توانيد توابع مربوط به اشيائی که از کلاس های مختلفی ايجاد شده اند را نيز تنها به شرط اينکه پارامترهای ورودی و خروجی آنها يکسان باشند در داخل شیء Delegate تبت نماييد.
نکته دوم: دقت کنيد که برای ثبت اولين تابع درداخل يک شیء Delegate، بايد از عملگر = (مساوی) استفاده کنيد. در صورتيکه بخواهيد توابع ديگری را نيز در داخل همان شیء Delegate ثبت نماييد، بايد از عملگر =+ (بعلاوه مساوی) برای اين منظور استفاده نماييد. لازم به ذکر است که اگر در اين حالت، سهوا به جای استفاده از عملگر =+ از عملگر = استفاده کنيد، تمامی توابع از قبل ثبت شده در داخل شیء Delegate به طور خودکار Unregistered می گردند!
نکته سوم: در صورتيکه تابعی از يک شیء (oEmployee2) را در داخل يک شیء Delegate ثبت کرده ايد و بخواهيد که شیء مذکور (oEmployee2) را از بين ببريد، ابتدا بايد تابع مربوطه را با استفاده از عملگر =- (منها مساوی) Unregistered نموده و سپس نسبت به از بين بردن آن شیء اقدام نماييد:
DelegateInstance -= new MyDelegate(oEmployee2.DoIt);
oEmployee2 = null;
نکته چهارم: سوء تفاهم نشود! هر چند که در تمامی مثالهايی که تاکنون عنوان کرديم، تنها نسبت به ثبت توابع اشياء در داخل شیء Delegate اقدام نموديم، ولی دقت کنيد که شما قادر به ثبت توابع استاتيک (Static) کلاس ها نيز در داخل اشياء Delegate خواهيد بود و همانطور که بارها نيز عنوان کرديم تنها شرط آن اين است که پارامترهای ورودی و خروجی اين توابع استاتيک نيز با ساختار کلاس Delegate مطابقت داشته باشند.
زنگ تفريح!:
خوب دوستان، با يک تمرين برای دست گرمی چطورين؟ حل اين تمرين نه تنها تا حدی فلسفه استفاده از Delegate را مشخص می کند، بلکه مصداقی واقعی از بکارگيری Delegate در پروژه های واقعی خواهد بود:
تصور کنيد کلاس عمومی در پروژه خود تعريف کرده ايد که در داخل آن تابع استاتيکی با نام SendEmail تعبيه شده است. در جای ديگری در برنامه خود کلاس عمومی ديگری نيز برای چاپ اطلاعات در نظر گرفته ايد و در آن تابعی با عنوان Print تعريف کرده ايد. در اين ميان کلاس ديگری نيز وجود دارد که اشياء آن وظيفه ثبت اطلاعات در بانک اطلاعاتی را با استفاده از تابعی به نام Save بر عهده دارند. تعريف اين سه تابع نيز به گونه ای است که پارامترهای ورودی و خروجی آنها يکسان می باشند. حال تصور کنيد که می خواهيم يک کلاس Delegate ايجاد و شیئی از آن تعريف نماييم. سپس اين سه تابع را به ترتيب دلخواه در شیء Delegate مربوطه ثبت نماييم. دوستان عزيز، حال يکی از زيبايی های Delegate را در اين تمرين تجربه خواهيد کرد. با صدا زدن شیء Delegate همراه با پارامترهای مناسب، به طور خودکار متن مورد نظر در بانک اطلاعاتی ثبت و از طريق چاپگر چاپ و نامه الکترونيکی در رابطه با اين عمليات برای مدير سيستم ارسال می گردد!. بسيار خرسند خواهم شد که اين برنامه ساده را نوشته و برای اينجانب ارسال نماييد.
به اميد خداوند متعال در ادامه اين آموزش، با مثالهای جذاب و پيچيده تری آشنا خواهيد شد، پس با ما همراه باشيد...
در پناه حق باشيد
داريوش تصديقی
آموزش Delegate قسمت اول
نگارش 2
می توان گفت که Delegate يکی از ويژگی های جذاب زبان برنامه نويسی سی شارپ بوده که امکانات بالقوه فوق العاده ای را به اين زبان می افزايد.
Delegate چيست؟
در واقع Delegate کلاسی است که اشياء ساخته شده از آن می توانند توابع ثبت شده (Register) در خود را به ترتيب اجرا نمايند!. صبر کنيد!!، فرار نکنيد!!!، می دانم که اين تعريف کمی وحشت آور است ولی نگران نباشيد تا پايان بحث، موضوع کاملا شيرين خواهد شد.
برای استفاده از Delegate چهار مرحله اصلی وجود دارد که در ذيل، هر مرحله با مثال مشخص خواهد شد:
مرحله اول:
در اين مرحله اقدام به تعريف کلاس Delegate می کنيم:
public delegate void MyDelegate(int n);
معنی عبارت فوق اين است که ما می خواهيم يک کلاس Delegate تعريف کنيم که اشياء آن بتوانند توابعی را در داخل خود ثبت کنند که پارامتر ورودی آنها يک عدد صحيح (int n) بوده و پارامتر خروجی (void) نداشته باشند.
برای روشن شدن مطلب کلاسی به نام Employee و به شکل ذيل تعريف می نماييم:
public class Employee
{
public int Age;
public string FullName;
public Employee(string fullName, int age)
{
Age = age;
FullName = fullName;
}
public void DoIt(int n)
{
System.Console.WriteLine("I'm " + FullName + ", I did it " + n + " times .");
}
}
همانگونه که مشاهده می کنيد، ما به طور عمدی در اين کلاس تابعی تعريف کرده ايم (DoIt) که پارامترهای ورودی و خروجی آن با آنچه که در تعريف Delegate عنوان گرديده است، مطابقت داشته باشد.
مرحله دوم:
در اين مرحله نسبت به ايجاد يک شیء از کلاس MyDelegate اقدام می کنيم:
MyDelegate DelegateInstance;
در اين دستور، ما يک شیء به نام DelegateInstance از کلاس (MyDelegate) تعريف نموده ايم.
حال برای ادامه مسير، از کلاس Employee يک شیء به نام oEmployee به شکل ذيل ايجاد می کنيم:
Employee oEmployee = new Employee("Dariush Tasdighi", 33);
مرحله سوم:
در اين مرحله تنها کافی است که تابع (متد) DoIt شیء oEmployee را در شیء DelegateInstance به شکلی که در ذيل ذکر گرديده است ثبت نماييم:
DelegateInstance = new MyDelegate(oEmployee.DoIt);
و اما مرحله چهارم (مرحله آخر):
در اين مرحله با صدا زدن (Call) شیء DelegateInstance همراه با يک پارامتر عددی، تابع ثبت شده در داخل آن به همان پارامتر عددی مشخص شده اجرا می شوند. دقت کنيد که در اين مثال تنها يک تابع ثبت شده در داخل شیء Delegate وجود دارد.
DelegateInstance(5);
دست نگه داريد!، باور کنيد که عقل خود را از دست نداده ايم!! کاملا واضح است که به راحتی می توانستيم پس از ايجاد شی، oEmployee، با اجرا کردن تابع Doit همراه با همان پارامتر عددی، به همان نتيجه نائل آييم. ولی دقت کنيد که هميشه اين چهار مرحله به اين شکلی که در اينجا مطرح گرديده است در کنار هم قرار نمی گيرند. نکته جالبی که در اين فنآوری وجود دارد اين است که در يک پروژه واقعی، اين چهار مرحله، هر کدام در يک قسمت از برنامه تعريف و بکارگرفته می شوند و اين مساله امکانات بسيار مفيد و جذابی را برای زبان برنامه نويسی سی شارپ به ارمغان می آورد.
هميشه سربلند و پيروز باشيد
داريوش تصديقی
نکاتی در رابطه با وبلاگ نويسی تخصصی
نگارش 2
برای دوستان عزیزی که مبادرت به نوشتن وبلاگ های تخصصی در زمینه زبان برنامه نويسی سی شارپ می نمایند، دو آدرس سايت معرفی می کنم که اميدوارم مفيد باشد:
اولين آدرس مربوط به سايت Code Project به آدرس http://www.codeproject.com/aspnet/CSharpColorizer.asp می باشد. در اين آدرس شما برنامه ای (Open Source) به زبان #C و با فنآوری ASP.NET خواهيد يافت که اگر سايت شخصی داشته و بخواهيد که به سورس های سی شارپ خود در زمان اجرا (Run Time)، رنگ و فرمت مناسبی تخصيص دهيد، می توانيد از اين Library استفاده نماييد.
دومين آدرس عبارت است از: http://www.manoli.net/csharpformat، در اين آدرس شما با يک Multiline Textbox مواجه خواهيد شد. در اين صفحه می توانيد سورس سی شارپ خود را در داخل آن کپی کرده و با انتخاب دکمه Format my code سورس سی شارپ خود را با رنگ و فرمت مناسبی بدست آوريد. پس از بدست آوردن سورس HTML، می توانيد آنرا در صفحات مختلف وبلاگ و يا سايت شخصی خود بکار گيريد.
موفق و منصور باشيد
داريوش تصديقی
|
|