loading...
طراحی وب سایت

hadi بازدید : 1 سه شنبه 16 مهر 1392 نظرات (1)

قطعا يکي از مهمترين امکاناتي که مي شه روي يک سايت قرار داد طراحی وب سایت سيستم احراز هويت ، ثبت نام در سايت ،تعيين نقش براي کاربر اينکه کاربر وارد شده به سايت مدير سايت است يا نويسنده و … اما زماني که به اين امکانات نگاه مي کنيم فکر مي کنيم قضيه پيچيده اي است و پياده کردن تک تک اينها زمان بره البته در حالتي که بخوايم به صورت حرفه اي و با امنيت بالا پياده کنيم . اما همونطور که حتما همه دوستان مي دونند و اين مقاله بيشتر براي تازه کارها هست ASP.NET امکاناتي براي اين کار در اختيار ما قرار داده که مي تونيد ابزارهاي اين کار رو در قسمت toolbox/login مشاهده کنيد .

معرفي اين ابزارها :

ابزار پياده سازي سيستم ورود کاربرLogin

ابزار بازيابي رمز عبورPasswordRecovery

ابزار پياده سازي سيستم ثبت نامCreateUserWizard

ابزار تغيير رمز عبورChangePasword

اين ابزار نشان مي دهد که آيا کاربر وارد شده است يا خيرLoginStatus

نام کاربري کاربر وارد شده را نشان مي دهدLoginName

اين ابزار دو حالت داره ، حالت کاربر وارد شده ( logintemplate ) و حالت کاربر ناشناس ( anonymoustemplate ) و کارش اينه که چيزهايي رو که قراره کاربر وارد شده بايد ببينه رو در حالت کاربر وارد شده قرار مي ديم و چيزهايي رو که کاربر ناشناس بايد ببينه رو در حالت کاربر ناشناس قرار مي ديمLoginView

اما نکته اي که هست اينه که اين ابزارها چجوري کار مي کندد !! چيزي که شايد خودم براي بار اول خيلي گيجم مي کرد و خوب اطلاعاتي در اين باره نداشتم اين بود که وقتي ابزار login روي صفحه مي زاريم حالا بايد با کدوم ديتابيس و چجوري بايد کار کند . براي اين قسمت هم ASP.NET امکاناتي رو تدارک ديده که به توضيح اون مي پردازيم .

 

براي تنظيم ديتابيس بايد وارد قسمت   ASP.NET Confiquration  بشيم که در تصوير مشخص شده است :

بعد از کليک روي اين قسمت وارد صفحه زير مي شيم بلافاصله بعد از وارد شدن به اين صفحه اگر مراجعه کنيد به فولدر App_Data داخل پروژتون مي بينيد که ديتابيس مورد نياز براي اين کار داخل اين فولدر کپي شده  :

 

خوب تا الان ديتابيس کپي شده اما تو اين ديتابيس کاربري تعريف نشده براي اين کار روي تب security سپس روي گزينه create user کليک مي کنيم  :

 

دقت کنيد که پسوردي که مي ديد بايد حداقل ? کاراکتر و ترکيبي از عدد و کاراکترهاي غير الفبايي باشد

 

بعد از افزودن کاربر دوباره برمي گرديم  به تب security و در قسمت roles روي گزينه Enable roles کليک مي کنيم

role

 

بعد از فعال شدن اين قسمت گزينه  Create or Manage roles فعال مي شود وارد طراحی وب سایت اين قسمت مي شيم و يک نقش با نام admin اضافه مي کنيم 

 

role2

دوباره برمي گديم به تب security  و در قسمت  Access Rules روي گزينه Create access rules کليک مي کنيم

 

access-rules

در اين صفحه ما تعيين مي کنيم که چه کاربري و به چه قسمت هايي حق دسترسي دارد يا نه

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

    <style type="text/css">

        textarea

        {

            resize: none;

        }

    </style>

</head>

<body>

    <form id="form1" runat="server">

    <asp:TextBox ID="TextBox2" runat="server" TextMode = "MultiLine"></asp:TextBox>

    </form>

</body>

</html>

 

سيستم احراز هويت در ASP.NET4.0 نوشته شده توسط مصطفيASP.NET ?? مرداد ????

قطعا يکي از مهمترين امکاناتي که مي شه روي يک سايت قرار داد سيستم احراز هويت ، ثبت نام در سايت ،تعيين نقش براي کاربر اينکه کاربر وارد شده به سايت مدير سايت است يا نويسنده و … اما زماني که به اين امکانات نگاه مي کنيم فکر مي کنيم قضيه پيچيده اي است و پياده کردن تک تک اينها زمان بره البته در حالتي که بخوايم به صورت حرفه اي و با امنيت بالا پياده کنيم . اما همونطور که حتما همه دوستان مي دونند و اين مقاله بيشتر براي تازه کارها هست ASP.NET امکاناتي براي اين کار در اختيار ما قرار داده که مي تونيد ابزارهاي اين کار رو در قسمت toolbox/login مشاهده کنيد .

 

معرفي اين ابزارها :

 

ابزار پياده سازي سيستم ورود کاربرLogin

ابزار بازيابي رمز عبورPasswordRecovery

ابزار پياده سازي سيستم ثبت نامCreateUserWizard

ابزار تغيير رمز عبورChangePasword

اين ابزار نشان مي دهد که آيا کاربر وارد شده است يا خيرLoginStatus

نام کاربري کاربر وارد شده را نشان مي دهدLoginName

اين ابزار دو حالت داره ، حالت کاربر وارد شده ( logintemplate ) و حالت کاربر ناشناس ( anonymoustemplate ) و کارش اينه که چيزهايي رو که قراره کاربر وارد شده بايد ببينه رو در حالت کاربر وارد شده قرار مي ديم و چيزهايي رو که کاربر ناشناس بايد ببينه رو در حالت کاربر ناشناس قرار مي ديمLoginView

اما نکته اي که هست اينه که اين ابزارها چجوري کار مي کندد !! چيزي که شايد خودم براي بار اول خيلي گيجم مي کرد و خوب اطلاعاتي در اين باره نداشتم اين بود که وقتي ابزار login روي صفحه مي زاريم حالا بايد با کدوم ديتابيس و چجوري بايد کار کند . براي اين قسمت هم ASP.NET امکاناتي رو تدارک ديده که به توضيح اون مي پردازيم .

 

hadi بازدید : 1 شنبه 30 شهریور 1392 نظرات (0)

آموزش PHP - كنترل جريان در PHP - بخش دوم دستورات تکرار و حلقه هاي while و for

 فرستادن به ايميل چاپ مشاهده در قالب PDF

برخي اوقات نياز است يک عمل خاص بار ها و بارها براي تعداد معين و يا تا تحقق يک شرط خاص انجام شود . مثلا چاپ اعداد 1 تا 100 انجام عمليات چاپ يک عدد صحيح به تعداد 100 بار است . و يا چاپ مشخصات تمامي دانشجويان که در يک جدول خاص از ديتا بيس هستند  با عمليات يکساني صورت مي گيرد منتها اين عمليات بايد به تعداد دانشجويان تکرار شود بديهي است که چون از قبل نمي دانيم تعداد دانشجويان چقدر است نمي توانيم اين دستورات را copy & paste نمائيم . (اگر هم تعداد را مي دانستيم اين کار بسيار غير منطقي است .) بنابراين در چنين وضعيت هايي که نياز به تکرار يک سري عمليات معين داريم از  طراحی وب سایت  دستورات تکرار و حلقه ها استفاده مي کنيم . در php چهار نوع حلقه تکرار وجود دارد که به ترتيب آنها را شرح خواهيم داد :

حلقه for :

اين حلقه معمولا در مواردي استفاده مي شود که تعداد تکرار ها دقيقا معلوم است . مثلا براي چاپ اعداد 1 تا 100 معلوم است که عمليات چاپ بايد 100 بار اجرا شود . حالت کلي کد اين حلقه به شکل زير نوشته مي شود :

 

<?php

for(<counter initialization> ; <conditional statement> ; <new assignment to counter>)

//some codes

?>

 

حلقه for بالا داراي چهار قسمت است :

1- <Counter Initialization> : که يک شمارنده را براي شمارش تعداد تکرار حلقه مقدار دهي اوليه مي کند .

2- <Conditional Statement> : يک عبارت شرطيست که تعيين مي کند تا چه زماني اين حلقه تکرار شود و تا وقتي که اين شرط (که مي تواند يک عبارت شرطي ترکيبي باشد) ارزش درستي يا true داشته باشد اين حلقه ادامه مي يابد و هنگامي که اين مقدار برابر نادرستي يا false قرار بگيرد منجر به خروج از حلقه مي شود .

3- <new assignment to counter> : موجب مي شود مقدار جديدي در شمارنده حلقه قرار بگيرد و مقدار قبلي آن تغيير کند .

4- Body : اين قسمت کدي است که بايد در صورت درستي شرطي که در بند 2 ذکر شد اجرا شود .

روند اجراي دستور for بدين شکل است که ابتدا مرحله 1 يعني Counter Initiialization انجام مي شود ، سپس در مرحله دوم درستي عبارت شرطي بررسي مي شود . در اين عبارت شرطي معمولا به نوعي از Counter يا شمارنده حلقه استفاده مي شود که با انتساب مقدار جديد به آن بايد در اين جهت حرکت کند که يک زماني عبارت شرطي مقدار نادرست به خود بگيرد تا بدين شکا از حلقه بي نهايت يا هميشه درست اجتناب شود .

در مرحله سوم نوبت به اجراي بدنه حلقه مي رسد و پس از اجرا در مرحله چهارم انتساب جديد به شمارنده صورت مي گيرد . در مرحله پنجم دوباره عبارت شرطي بررسي ميشود و در صورت درستي يکبار ديگر اين حلقه اجرا مي شود و به همين ترتيب تا زماني که شرط نادرست شود شمارنده تغيير کرده ، شرط بررسي شده و بدنه حلقه اجرا مي شود . به مثال زير توجه کنيد و سعي کنيد آنرا اجرا کنيد :

<?php

for($cnt = 1 ; $cnt<6 ; ++$cnt)

echo $cnt."<br />";

?>

در حلقه فوق قصد بر اينست که اعداد 1 تا 5 را چاپ کنيم . در مرحله اول طراحی سایت مقدار متغير cnt برابر 1 شده و شرط بررسي مي شود چون 1 کوچکتر از 6 است بدنه داخلي دستور for اجرا مي شود . در مرحله بعد يک واحد به cnt اضافه شده و شرط دوباره بررسي مي شود و کار همينطور ادامه مي يابد تا جايي که مقدار cnt به 6 برسد در اينجا چون 6 از 6 کوچکتر نيست اجراي حلقه for به پايان مي رسد و دستور پس از بلوک for اجرا مي شود. توجه کنيد که در مثال فوق متغير cnt براي اينکه سطر به سطر چاپ شود به يک تگ br ، الحاق شده است .

لازم به ذکر است که نوشتن دستور for به شکل بالا مربوط به زمانيست که بدنه دستور for تک خطي باشد اگر بدنه اين دستور چند خطي باشد يعني در هر بار تکرار بيش از يک خط کد اجرا شود بايد مجموعه دستورات را در داخل آکولاد باز و بسته يعني } و { قرار داد.

ضمن اينکه هر چهار قسمت اول تا چهارم اختياري هستند و مي توانند وجود نداشته باشند بنابراين دستور زير نيز يک دستور کاملا درست (از لحاظ دستوري) تلقي مي شود :

<?php

for( ; ; );

?>

اين حلقه for اگر چه از نظر دستوري درست است ولي داراي يک خطاي منطقي است چرا که نشاندهنده يک حلقه بي نهايت است که هيچ گاه پايان نمي پذيرد و پردازنده را تا ابد مشغول نگاه مي دارد . در حقيقت نبود هر يک از اين پارامتر ها به معني انجام ندادن کار مشخصي است . حلقه بالا هيچ شمارنده اي ندارد و براي ادامه کار خود به تأمين هيچ شرطي نيز نياز ندارد و علامت (;) آخر نيز به اين معني است که هيچ کاري انجام نده بنابراين پردازنده تا ابد مشغول انجام دادن "هيچ کاري" مي شود .

 

حلقه تکرار while :

در تکرار اين حلقه معمولا از قبل تعداد خاصي مد نظر نيست بلکه اين حلقه دائما يک شرط يا عبارت شرطي مرکبي را بررسي مي کند و تا زماني که آن شرط درست باشد بدنه حلقه اجرا مي شود . شکل کلي دستور while به شکل زير است :

<?php

while(<conditional statement>)

//do somethings;

?>

با دستور while حتي مي توانيد حلقه هاي بسازيد که تعداد تکرار در آنها مشخص است .(مانند دستور for) منتها چون در اينجا شمارنده اي وجود ندارد خود برنامه نويس بايد يک شمارنده در نظر بگيرد و افزايش يا کاهش آنرا مديريت کند . به عنوان مثال ، مسئله چاپ اعداد 1 تا 5 را که در بالا با for نوشتيم در اينجا با دستور while مي نويسيم :

<?php

$cnt=1;

while($cnt<6)

{

echo $cnt."<br />";

++$cnt;

}

?>

اين برنامه را به شکل زير نيز مي توان نوشت :

<?php

$cnt=1;

while($cnt<6)

echo $cnt++."<br />";

?>

همانطور که مي بينيد عملگر Increment به همراه متغير  طراحی وب سایت  در دستور echo به کار رفته است و چون به صورت پسوندي به کار رفته اول عمل چاپ متغير انجام شده و سپس يک واحد به متغير اضافه مي شود . اين کد را هم اکنون امتحان کنيد .

اين حلقه به اين شکل کار مي کند که با پيمايش آرايه هر بار يکي از خانه هاي آنرا در متغيري بنام var ميريزد و در داخل بدنه دستور foreach با متغير var کار مي کند . بار ديگر که دستور foreach اجرا مي شود خانه بعدي آرايه را واکشي کرده و در var مي ريزد و اين ماجرا تا انتهاي آرايه تکرار مي شود . در زير مثالي از کاربرد حلقه foreach را مي بينيد .

<?php

$cars = new array("BMW" , "Audi" , "Benz");

foreach($cars as $vehicle)

echo $vehicle."<br />";

?>

hadi بازدید : 1 دوشنبه 25 شهریور 1392 نظرات (0)

آموزش php - آرايه ها

آرايه ها انواع خاصي از متغيرها به حساب مي آيند که مي توانند چندين داده را در قالب يک نام ذخيره کنند. براي مثال فرض کنيد قرار است اسامي 5 دانشجو را موقتا ذخيره کنيد ، در اين حالت در صورتيکه نخواهيم از آرايه استفاده کنيم مجبوريم براي هر دانشجو يک متغير جديد در نظر بگيريم و نام دانشجو را در آن ذخيره نماييم. 

$std1 = "ali";

$std2 = "hamid";

$std3 = "moeen";

$std4 = "amin";

$std5 = "mina";

اين کار بسيار خسته کننده ، سخت و طاقت فرساست ، بخصوص زمانيکه تعداد داده هاي موجود زياد و مثلا نياز به جستجو بين اين اسامي باشد سختي کار بيشتر و بيشتر نمايان مي شود.

در مواردي که ليستي از عناصر را در اختيار داريد و مي خواهيد آنها را در حافظه ذخيره کنيد آرايه بهترين راه حل ممکن است که ميتواند به شما کمک کند. يک آرايه مي تواند يکسري مقادير را تحت يک نام واحد ذخيره نمايد و هر زمان که به هر کدام از مقادير نياز داشتيد به کمک يک انديس و نام آرايه به آن مقدار دسترسي داشته باشيد.

در زبان php روش هاي مختلفي براي ايجاد آرايه وجود دارد. ساده ترين روش براي ساخت ليست اسامي دانشجويان مثال قبل به صورت زير است:

$stdNames = array("ali", "hamid", "moeen", "amin", "mina");

روش ديگر ايجاد يکي يکي عناصر اين آرايه است

 

$stdNames[] = "ali";

$stdNames[] = "hamid";

$stdNames[] = "moeen";

$stdNames[] = "amin";

$stdNames[] = "mina";

اين روش نيز مانند روش قبلي است با اين تفاوت که شماره انديس عناصر طراحی وب سایت  آرايه را ذکر نکرديم و php خود براي اين عناصر شماره هاي 0 الي 4 را در نظر خواهد گرفت. اين عمل را در آينده auto-incremented keys مي ناميم. اينکه از کدام روش براي ايجاد آرايه استفاده نماييد هيچ تاثيري در نتيجه کار نخواهد داشت.

 

براي نمايش مقدار يک عنصر از آرايه کافي است که نام آرايه و بعد شماره انديس آرايه را داخل کروشه ذکر کنيم:

 

echo $stdNames[1];

در مثال قبل php نام hamid را در مرورگر نمايش خواهد داد. مي توانيد از يک حلقه براي نمايش همه عناصر آرايه استفاده نماييد.

 

for($i=0;$i<=4;$i++)

   echo $stdNames[$i];

روش قبل روش خوبي براي نمايش همه عناصر يک آرايه است ولي بهترين روش نيست چراکه تعداد عناصر آرايه hard-code شده است. روش بهتر استفاده از حلقه هاي foreach به شکل زير است:

 

foreach($stdNames as $name){

   echo $name;

}

در صورتيکه براي اشغال زدايي نياز داريد همه عناصر آرايه را نمايش دهيد مي توانيد از دو توابع داخلي php به نام هاي print_r و var_dump استفاده نماييد:

 

$print_r($stdNames);

echo "<br />";

$var_dump($stdNames);

 

 

آرايه هاي انجمني (Associative arrays)

اگر بخواهيم به زبان ساده تعريفي از مکانيزم آرايه ها در php داشته باشيم بايد از نگاشت ياد کنيم. به عبارت ديگر آرايه php يک نگاشت از کليد (key) به مقدار (value)  است. در مثال اسامي دانشجويان کليد 0 نگاشتي از مقدار "ali" و کليد 1 نگاشتي از مقدار "hamid" است. php به ما اجازه مي دهد که کليدهاي با معني تري داشته باشيم. associative array به اين معني است که php به شما اجازه مي دهد براي مقادير آرايه کليدهاي دلخواه در نظر بگيريد. گاهي اوقات به آرايه هاي associative ديکشنري نيز گفته مي شود. ليست اسامي دانشجويان به صورت آرايه associative به شکل زير تعريف مي شود:

 

$stdNames = array(

     "84212234" => "ali",

     "86287638" => "hamid",

     "83862837" => "moeen",

     "79829273" => "amin",

     "89736286" => "mina"

);

در مثال بالا شماره دانشجويي را به عنوان کليد در نظر گرفتيم. اين نکته را حتما به خاطر بسپاريد که کليدها case-sensitive ولي type-insensitive هستند.

 

case-sensitive: يعني بين حروف کوچک و بزرگ بايد تفاوت قائل شويم براي مثال Air با aiR تفاوت خواهند داشت.

type-insensitive: به اين معناست که نوع داده اي کليد براي ما تفاوتي ندارد مثلا 1 که از نوع int است با '1' که از نوع رشته اي است با هم تفاوتي نخواهند داشت.

 

آرايه هاي associative در زبان php به صورت زير نيز قابل تعريف اند:

 

$stdNames["84212234"] = "ali";

$stdNames["86287638"] = "hamid";

$stdNames["83862837"] = "moeen";

$stdNames["79829273"] = "amin";

$stdNames["89736286"] = "mina";

براي نمايش و استفاده از مقادير اين نوع آرايه ها نيز مي توانيد مثل قبل عمل کنيد با اين تفاوت که بايد از کليدهاي جديد براي دسترسي به عناصر آرايه استفاده نماييد.

 

$echo 'Name ------- Student No'.'<br />';

$echo stdNames["84212234"].'-84212234';

 

 

آرايه هاي چند بعدي (Multidimensional)

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

 

$students["Physics"] = array(

     "84212234" => "ali",

     "86287638" => "hamid",

     "83862837" => "moeen",

     "79829273" => "amin",

     "89736286" => "mina"

);

 

$students["Computer"] = array (

     "84534243" => "samira",

     "85432255" => "payam",

     "82355234" => "hossain",

     "88553289" => "mehrdad",

     "83826264" => "fatemeh"     

);

براي دسترسي به عناصر آرايه چندبعدي php کافي است به شکل زير عمل نماييم:

echo $students["Computer"]["88553289"];

در مثال بالا مفسر php نام  mehrdad را در مرورگر به نمايش خواهد گذاشت.

براي کاربا آرايه ها و دستکاري آنها php توابع زيادي مانند sizeof ، unset ، asort و ... در اختيار برنامه نويس قرار مي دهد. مطالعه و تحقيق در مورد کاربرد اين توابع را بر عهده خوانندگان معترم قرار مي دهيم. در صورت آشنايي با اين توابع مي توانيد کاربرد و مثال هاي بيشتر را در بخش نظرات اين مطلب اضافه نماييد.

hadi بازدید : 3 چهارشنبه 20 شهریور 1392 نظرات (0)

? تابع سودمند Php

 

بعد از مدتها کار با php ممکنه هنوز توابعي باشن که باهاشون برخورد نکرديم و نميدونيم چنين توابعي هم وجود دارن که ميتونن کار

 

مارو راحتتر کنن.در زير اشاره اي ميکنم به ? عدد از توابع مفيدي که ممکنه خيلي ها هنوز بهش بر نخورده باشن.

 

?- توابعي با تعداد آرگومانهاي دلخواه

ممکنه قبلا شما توابعي نوشته باشين که به تعداد دلخوله ميتنين آرگومان بهش پاس بدين اما تابعي توي php وجود داره که به شما

 

اجازه ميده توابعي بسازيد طراحی وب سایت که تعداد آرگومانها به صورت واقعي دلخواه هستند.

در ابتدا يک مثال از تابعي ميزم که ميتونه تعداد آرگ.مانهاي دلخواه رو بهش پاس بديد

 

// yes, the argument list can be empty

function foo() {

 

// returns an array of all passed arguments

$args = func_get_args();

 

foreach ($args as $k => $v) {

echo "arg".($k+1).": $vn";

}

}

 

foo();

/* prints nothing */

foo('hello');

/* prints

arg1: hello

*/

 

foo('hello', 'world', 'again');

/* prints

arg1: hello

arg2: world

arg3: again

*/

حالا شما با تابع func_get_args() به تعداد دلخواه ميتونيد به توابعتون آرگومان بفرستيد و توي تابع ازش استفاده کنيد.

?-استفاده از تابع glob() براي پيدا کردن فايلها :

تابع glob() براي پيدا کردن فايلها با استفاده از يک الگوي خاص ميتونه به شما کمک کنه :

 

// get all php files

$files = glob('*.php');

 

print_r($files);

/* output looks like:

Array

(

[0] => phptest.php

[1] => pi.php

[2] => post_output.php

[3] => test.php

)

*/

 

شما ميتونيد چند نوع فايل مختلف رو جستجو کنيد

1

$files = glob('*.{php,txt}', GLOB_BRACE);

 

print_r($files);

/* output looks like:

Array

(

[0] => phptest.php

[1] => pi.php

[2] => post_output.php

[3] => test.php

[4] => log.txt

[5] => test.txt

)

*/

 

و يا يه مسير بهش بديد :

1

$files = glob('../images/a*.jpg');

print_r($files);

/* output looks like:

Array

(

[0] => ../images/apple.jpg

[1] => ../images/art.jpg

)

*/

 

براي گرفتن مسير واقعي فايلها هم ميتونيد ازrealpath()  تابع  استفاده کنيد :

1

$files = glob('../images/a*.jpg');

 

// applies the function to each array element

$files = array_map('realpath',$files);

 

print_r($files);

/* output looks like:

Array

(

[0] => C:wampwwwimagesapple.jpg

[1] => C:wampwwwimagesart.jpg

)

*/

3- مقدار حافظه استفاده شده :

 

وقتي شما بدونيد که برنامه اي که نوشتيد چقدر از فضاي حافظه رو اشغال ميکنه بهتر ميتونيد برنامه خودتون رو بهينه کنيد.

پي اچ پي يک طراحی وب سایت  مديريت حافظه و GC قوي داره.مقدار فضايي که اسکريپت شما در حافظه اشغال ميکنه ميتونه روي سرعت اجراي برنامه

 

تاثير گذار باشه.ما ميتونيم از تابع memory_get_usage() براي مقدار حافشه مصرفي و از تابع memory_get_peak_usage() براي اطلاع

 

از بيشترين حافظه مصرفي در اسکريت استفاده کنيم.

 

echo "Initial: ".memory_get_usage()." bytes n";

/* prints

Initial: 361400 bytes

*/

 

// let's use up some memory

for ($i = 0; $i < 100000; $i++) {

$array []= md5($i);

}

 

// let's remove half of the array

for ($i = 0; $i < 100000; $i++) {

unset($array[$i]);

}

 

echo "Final: ".memory_get_usage()." bytes n";

/* prints

Final: 885912 bytes

*/

 

echo "Peak: ".memory_get_peak_usage()." bytes n";

/* prints

Peak: 13687072 bytes

*/

4-مقدار استفاده از CPU

براي اينکار از تابع getrusage() استفاده ميکنيم.اسن تابع روي سرور هاي ويندوز جواب نميده.

 

print_r(getrusage());

/* prints

Array

(

[ru_oublock] => 0

[ru_inblock] => 0

[ru_msgsnd] => 2

[ru_msgrcv] => 3

[ru_maxrss] => 12692

[ru_ixrss] => 764

[ru_idrss] => 3864

[ru_minflt] => 94

[ru_majflt] => 0

[ru_nsignals] => 1

[ru_nvcsw] => 67

[ru_nivcsw] => 4

[ru_nswap] => 0

[ru_utime.tv_usec] => 0

[ru_utime.tv_sec] => 0

[ru_stime.tv_usec] => 6269

[ru_stime.tv_sec] => 0

)

*/

5- ثابتهاي جادويي!

 

Php ثابتهاي بسيار مفيدي استفاده ميکنه که در زير يه تعدادي رو براتون ميذارم :

__LINE__ خط فعلي برنامه

__FILE__ مسير فايل

__DIR__ مسير دايرکتوري فايل جاري

__FUNCTION__ نام تابع جاري

__CLASS__ نام کلاس جاري

__METHOD__ نام متد جاري

__NAMESPACE__ فضاي نام جاري

 

// this is relative to the loaded script's path

// it may cause problems when running scripts from different directories

require_once('config/database.php');

 

// this is always relative to this file's path

// no matter where it was included from

require_once(dirname(__FILE__) . '/config/database.php');

6-ساخت يک شناسه منحصر به فرد :

گاهي اوقات ممکنه شما بخوايد يک رشته منحصر به فرد درست کنيد.پي اچ پي يک تابع با نام uniqid() براي همين کار در اختيار ما گذاشته :

 

// generate unique string

echo uniqid();

/* prints

4bd67c947233e

*/

 

// generate another unique string

echo uniqid();

/* prints

4bd67c9472340

*/

اگر توجه کنيد ميبينيد که ابتداي رشته هاي ايجاد شده مثل هم هستند.اين به دليله که تابع uniqid() براي ساخت چنين رشته هايي از زمان سيستم استفاده ميکنه.

براي اينکه امکان شباهت دوتا رشته رو کم کنيم ميتونيم يک پيشوند به تابع پاس بديم.

 

// with prefix

echo uniqid('foo_');

/* prints

foo_4bd67d6cd8b8f

*/

 

// with more entropy

echo uniqid('',true);

/* prints

4bd67d6cd8b926.12135106

*/

 

// both

echo uniqid('bar_',true);

/* prints

bar_4bd67da367b650.43684647

*/

7-Serialization

 

آيا تا حالا نياز داشتيد که يک متغير پيچيده رو توي فايل يا ديتابيس ذخيره کنيد؟ لازم نيست با يک راه حل فانتزي يک آرايه رو به رشته

 

قالب بندي شده تبديل کنيد.بااستفاده از تابع serialize() وunserialize() به راحتي ميتونيد اين کارو انجام بديد :

 

// a complex array

$myvar = array(

'hello',

42,

array(1,'two'),

'apple'

);

 

// convert to a string

$string = serialize($myvar);

 

echo $string;

/* prints

a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}

*/

 

// you can reproduce the original variable

$newvar = unserialize($string);

 

print_r($newvar);

/* prints

Array

(

[0] => hello

[1] => 42

[2] => Array

(

[0] => 1

[1] => two

)

 

[3] => apple

)

*/

اين دوتا تابع از توابع بومي پي اچ هستن.اما از وقتي که JSON مجبوب تر شده دوتاتابع ديگه هم به پي اچ پي اضافه شد که

 

json_encode() و json_decode() نام دارن که توابع بسيار مفيدي هستند.

 

// a complex array

$myvar = array(

'hello',

42,

array(1,'two'),

'apple'

);

 

// convert to a string

$string = json_encode($myvar);

 

echo $string;

/* prints

["hello",42,[1,"two"],"apple"]

*/

 

// you can reproduce the original variable

$newvar = json_decode($string);

 

print_r($newvar);

/* prints

Array

(

[0] => hello

[1] => 42

[2] => Array

(

[0] => 1

[1] => two

)

 

[3] => apple

)

*/

اين توابع خيلي بهتر از دوتا تابع قبلي هستن چون با جاوااسکريپت و بيشتر زبانهاي برنامه نويسي ديگه سازگارن.

?-فشرده سازي رشته ها

وقتي بحث از فشرده سازي ميشه ما معمولا فايلها به ذهنمون مياد.اين امکان در پي اچ پي وجود داره که بشه رشته هارو به حالت

 

فشرده در آورد.

در مثال زير ما از دوتا تابع gzcompress() و gzuncompress() براي اين کار استفاده ميکنيم :

 

$string =

"Lorem ipsum dolor sit amet, consectetur

adipiscing elit. Nunc ut elit id mi ultricies

adipiscing. Nulla facilisi. Praesent pulvinar,

sapien vel feugiat vestibulum, nulla dui pretium orci,

non ultricies elit lacus quis ante. Lorem ipsum dolor

sit amet, consectetur adipiscing elit. Aliquam

pretium ullamcorper urna quis iaculis. Etiam ac massa

sed turpis tempor luctus. Curabitur sed nibh eu elit

mollis congue. Praesent ipsum diam, consectetur vitae

ornare a, aliquam a nunc. In id magna pellentesque

tellus posuere adipiscing. Sed non mi metus, at lacinia

augue. Sed magna nisi, ornare in mollis in, mollis

sed nunc. Etiam at justo in leo congue mollis.

Nullam in neque eget metus hendrerit scelerisque

eu non enim. Ut malesuada lacus eu nulla bibendum

id euismod urna sodales. ";

 

$compressed = gzcompress($string);

 

echo "Original size: ". strlen($string)."n";

/* prints

Original size: 800

*/

 

echo "Compressed size: ". strlen($compressed)."n";

/* prints

Compressed size: 418

*/

 

// getting it back

$original = gzuncompress($compressed);

با اين توابع ما ميتونيم حدود ??% از حجم يک رشته رو کم کنيم.همچين توابع gzencode() و gzdecode()با يک الگوريتم ديگه ميتونن

 

همين مقدار از حجم رشته هارو فشرده کنن.

?- register_shutdown_function()

 

تابع register_shutdown_function() ميتونيد تعيين کنيد قبل از اينکه اسکريپت شما به اتمام برسه چه تابعي اجرا بشه.اما اگر

 

اسکريپت شما با دستور exit به پايان برسه يا يک خطا رخ بده ويا برنامه به وسيله کاربر متوقف بشه (باکليک روي دوکمه stop مرورگر )

 

$start_time = microtime(true);

 

register_shutdown_function('my_shutdown');

 

// do some stuff

// ...

 

function my_shutdown() {

global $start_time;

 

echo "execution took: ".

(microtime(true) - $start_time).

" seconds.";

}

hadi بازدید : 3 پنجشنبه 07 شهریور 1392 نظرات (0)

با استفاده از اديتور آنلاين شما ميتوانيد تمرين ها را به سرعت انجام داده و آنها را تغيير دهيد. در زير مثال ها دکمه اي براي تمرين وجود دارد.

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

<!DOCTYPE html>

<html>

<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>

</html>

HTML چيست ؟

HTML زبان توصيف صفحات وب است.

HTMl از Hyper Text Markup Language (به معني زبان نشانه گذاري فرا متني ) گرفته شده است.

HTML يک زبان برنامه نويسي نيست . در واقع يک زبان نشانه گذازي است.

زبان هاي نشانه گذاري از مجموعه اي از برچسب هاي نشانه گذاري (markup tags) تشکيل شده اند.

HTML از برچسب هاي نشانه گذاري براي توصيف صفحات وب استفاده مي کند.

برچسب ها در HTML

برچسب هاي نشانه گذاري در HTML معمولا به نام تگ هاي HTML خوانده مي شوند.

تگ هاي HTML کلمات کليدي هستند که بين علامت هاي <> قرار مي گيرند. مثل : <html>

تگ هاي HTML معمولا به صورت دوتا ظاهر مي شوند. مثل : <b>  و </b>

اولين تگ در تگ هاي دوتايي را تگ شروع و دومين تگ را تگ پايان مي ناميم.

آغاز و پايان برچسب ها را به اصلاح باز کردن تگ و بستن تگ مي ناميم.

سند هاي HTML صفحات وب هستند !

سند هاي HTML صفحات وب را توصيف ميکنند

سند هاي HTML از تگ هاي HTML و نوشته هاي ساده تشکيل شده اند.

به اسناد HTML صفحات وب مي گويند.

هدف مرورگر هاي وب (مثل اينترنت اکسپلورر ، موزيلا فاير فاکس و … ) خوانده اسناد HTML و نمايش طراحی وب سایت  آن ها به صورت يک صفحه وب است. مرورگرهاي وب تگ هاي HTML را نشان نمي دهند بلکه از آن ها براي تفسير محتواي صفحه استفاده مي کنند.

نمونه اي از يک سند HTML :

<!DOCTYPE html>

<html>

<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>

</html>

توضيحات مثال :

- نوشته هاي بين <html> و </html> محتويات يک صفحه وب را تشکيل مي دهند.

-نوشته هاي بين <body> and </body> محتويات قابل نمايش يک صفحه وب هستند.

- نوشته هاي بين <h1> و </h1> يک تيتر (عنوان) را نمايش مي دهند.

- نوشته هاي بين <p> و </p> به عنوان يک پاراگراف به نمايش در مي آيند.

hadi بازدید : 2 دوشنبه 28 مرداد 1392 نظرات (0)

 

 

کارهاي دستي

در اين قسمت مي بايست جملات و در واقع Quote هاي مورد علاقه تان را در داخل Array يا آرايه myQuotes ذخيره نماييد.

در viewDidLoad تکه کد زير را بعد از [super viewDidLoad]; اضافه طراحی وب سایت  نماييد. در اينجا مي توانيد جملات مورد علاقه خودتان را حتي به فارسي اضافه کنيد.

@"Nobody's perfect",

@"Can't see the woods for the trees",

@"Better to have loved and lost then not loved at all",

@"The early bird catches the worm",

@"As slow as a wet week"

];

در اينجا در واقع به myQuotes ليستي از جملات را مي دهيد. البته syntax اين کار شايد کمي برايتان عجيب باشد که مي بايست آن را توضيح دهم.

- self يک کلمه کليدي خاص است که نشان مي دهد منظور ما « همين کلاس » که بر رويش هستيم مي باشد – اين کلمه کليدي تقريبا شبيه this در زبان هاي برنامه نويسي ديگر است.

- شما مي توانيد به property هاي يک کلاس با گذاشتن نقطه بعد از اين کلمه کليدي دسترسي داشته باشيد. در اينجا self.myQuotes به شما اجازه دسترسي به property اي قبلا ساخته بوديد را مي دهد.

- براي ساخت يک Array ميانبر بسيار خوبي در Objective-C وجود دارد به اين شکل : @[ item1, item 2, item 3]

- هر عنصري در Array ما يک string است. براي ساخت string ها در Objective-C مي بايست آنها را با پيشوند @ بسازيم. اگر با زبان هاي برنامه نويسي ديگر کار کرده باشيد احتمال آن وجود دارد که به راحتي اين نکته را فراموش کنيد و برنامه شما درست کار نکند. پس اگر در برنامه تان از string استفاده کرديد مطمئن شويد که علامت @ را نيز قبل آن string گذاشته ايد.

خب حالا Array اي از جملات محبوبتان داريد و آماده هستيد. نوبت به آن مي رسد که يکسري کد براي آنکه بتوانيد جملات را به صورت تصادفي بر روي صفحه نشان دهيد به برنامه تان اضافه کنيد!

نوبت کار با Outlet هاست

شما هنوز رابط کاربري برنامه تان را نساخته ايد اما وقتي اين کار را انجام دهيد يک text view به برنامه تان اضافه خواهيد کرد که اين جملات را بتواند نشان دهد و يک button نيز خواهيد گذاشت تا با لمس کردن آن يک جمله تصادفي در آن text view به نمايش در بيايد.

براي نمايش يک جمله تصادفي بر روي صفحه? به دو چيز احتياج داريد – يک reference به text view تا بتوانيد متن روي آن را به درستي تنظيم نماييد و notification براي آنکه از لمس شدن button مطلع گرديد.

اما چگونه مي توان اتفاقاتي که بر روي رابط کاربري مي افتد را با کد ارتباط داد ؟ اين کار توسط دو کلمه کليدي خاص با نام IBOutlet و IBAction صورت مي گيرد!

بياييد ببينيم اين دو چه طور کار مي کنند. خب با IBOutlet شروع مي کنيم. تکه کد زير را به زير array ها در ViewController.h اضافه نماييد :

@property (nonatomic, strong) IBOutlet UITextView *quoteText;

در اينجا شما باز هم يک property مانند قبل تعريف کرده ايد اما اين بار براي کلاس UITextView و بر روي آن نيز يک کلمه کليدي خاص با نام IBOutlet گذاشته ايد.

IBOutlet به اين معني است که quoteText يک object است که مي تواند به يکي از عناصر رابط کاربري در فايل XIB متصل گردد تا view controller بتواند به property هاي آن عنصر دسترسي داشته و يا آنها را تغيير دهد. در اين مثال ما متن نشان داده شده بر روي کنترل UITextView را تنظيم خواهيم کرد اما مي توانيد به آساني رنگ? فونت? سايز و چيزهاي ديگر را نيز تغيير دهيد.

در اينجا تکه کد زير را بعد از ليست property ها اضافه نماييد :

- (IBAction)quoteButtonTappedid)sender;

اين کار يک method را مشخص کرده که در داخل اين کلاس پياده سازي خواهد شد. اين اولين باري است که شما تعريف يک method را در Objective-C مي بينيد. پس بايد تکه تکه آن را بررسي کنيم :

?- در ابتدا يک خط فاصله يا dash گذاشته ايد. اين کار بدين معناست که شما در حال تعريف يک instance method مي باشيد.

?- سپس value خروجي method خود را تعريف مي کنيد. اين method خاص IBAction را خروجي مي دهد که در واقع به شکل void تعريف شده است.

اين بدين معني است که اين method چيزي را خروجي نمي دهد. اما IBAction يک property خاص ديگر دارد – اين کلمه کليدي method شما را به شکلي علامت گذاري مي کند که مي توانيد آن را به يک action بر روي يک عنصر رابط کاربري متصل نماييد.

در اين مثال شما اين اتصالات را به شکلي انجام خواهيد داد که وقتي button لمس گردد اين method صدا شود.

 

?- سپس نام method را قرار مي دهيد که در اينجا quoteButtonTapped مي باشد.

?- سپس يک علامت دونقطه يا colon قرار داده و در داخل پرانتز نوع پارامتر اول را تعيين مي کنيد.

id يک تايپ خاص بوده که به معناي هر « object اي که از NSObject به ارث رسيده است » مي باشد.

معمولا هنگامي که callback هايي که button ها و يا ديگر control ها آنها را صدا مي کنند مي سازيد? آنها به عنوان اولين پارامتر هر buttol يا کنترلي که callback را فرستاده است مي فرستند. از آنجايي که نمي توانيد مطمئن باشيد از چه تايپي مي تواند باشد در اينجا id را قرار مي دهيد.

 

?- در آخر نيز نام پارامتر را قرار مي دهيد که در اينجا sender است.

اگر بيشتر از يک پارامتر داشته باشيد? مي توانيد قدم ? تا ? را چندين بار تکرار نماييد.

syntax نام گذاري method ها در Objective-C کمي غير معمول است اما وقتي به آن عادت کنيد از آن خوشتان خواهد آمد.

 

حال به فايل ViewController.m برويد تا پياده سازي method با نام quoteButtonTapped: را در آن انجام دهيد.

براي اين کار تکه کد زير را به اين فايل و قبل @end اضافه نماييد :

 

خب بياييد اين تکه کد را نيز خط به خط بررسي کنيم :

-(IBAction)quoteButtonTappedid)sender {

// 1 – Get number of rows in array

int array_tot = [self.myQuotes count];

// 2 – Get random index

int index = (arc4random() % array_tot);

// 3 – Get the quote string for the index

NSString *my_quote = self.myQuotes[index];

// 4 – Display the quote in the text view

self.quoteText.text = [NSString stringWithFormat: @"Quote:\n\n%@", my_quote];

}

?- ابتدا تعداد عناصر موجود در array تان را پيدا مي طراحی وب سایت   کنيد.

اينجا نيز اولين باري است که صدا شدن method ها را در Objective-C مي بينيد و syntax آن کمي عجيب است – ابتدا يک براکت باز مي کنيد و سپس نام object اي که بر روي آن مي خواهيد method را صدا کنيد مي آوريد ( self.myQuotes ) ? سپس نام method اي که مي خواهيد صدا کنيد مي آيد ( count ).

در آخر نيز صدا زدن method را با بستن براکت به پايان مي رسانيد.

توجه کنيد که اين method هيچ پارامتري دريافت نمي کند – در قدم چهارم مثالي از method اي که پارامتر دريافت کند را خواهيد ديد.

 

?- سپس از function اي به نام arc4random استفاده کرده ايد تا يک عدد اتفاقي يا random براي شما بسازد.

arc4random() يک function معمولي C و نه method مي باشد و بنابراين از syntax پرانتزي که از قبل مي شناسيد و دوستش داريد استفاده مي کنيد.

در اينجا چون مي خواهيد يکي از جملاتتان را به صورت اتفاقي انتخاب کنيد مي بايست بزرگترين عدد ممکن تعداد رديف ها در array باشد و پايين ترين مقدار نيز صفر خواهد بود.

در Objective-C مانند بسياري زبان هاي ديگر اولين رديف در array صفر مي باشد و ? نيست.

 

?- سپس شما يک عنصر را در myQuotes پيدا مي کنيد. syntax جديد Objective-C به شما اين امکان را مي دهد که به عناصر داخل يک NSArray توسط دادن شماره رديف آن در داخل براکت دسترسي پيدا کنيد.

?- در آخر? از method اي با نام stringWithFormat استفاده مي کنيد تا string خروجي را فرمت دهي کنيد تا ابتدا يک ليبل نشان داده شده و سپس به سر خط بعدي برود تا جمله نوشته شود.

در اين قسمت از جايگذاري متغيرها مانند printf در C/C++ استفاده مي شود. %f براي float و %d براي integer و %@ براي object هاي Objective-C.

hadi بازدید : 3 چهارشنبه 23 مرداد 1392 نظرات (0)

در قسمت قبل با چکونگي ارسال argument از طريق reference و همچنين با کلمات کليدي out، ref و params آشنا شديد. در اين قسمت قصد داريم با return کردن object از متد، Method Overloading و overload کردن constructor آشنا شويم.

Return کردن object از متد

 

تا اين‌جا type هاي مختلفي را از يک متد return مي‌کرديم البته در سي‌شارپ   طراحی وب سایت  شما مي‌توانيد هر data type اي را از يک متد return کنيد مثل int، double، float و… اما در اين‌جا قصد داريم چيز ديگري را از متد بازگردانيم: class types.

 

 

در برنامه‌ي زير کلاسي به اسم Person وجود دارد که در اين کلاس متدي به اسم ()CreateNewPerson است که يک شيء از جنس Person مي‌سازد و اين شيء را return مي‌کند:

using System;

class ReturnObExample

{

    static void Main()

    {

        Person firstPerson = new Person("Catherine", "Gilbert");

        Console.Write("Fist Person = ");

        firstPerson.Show();

 

        Person secondPerson = firstPerson.CreateNewPerson("Damon", "Salvatore");

 

        Console.Write("Second Person = ");

        secondPerson.Show();

    }

}

class Person

{

    string Name, Family;

 

    public Person(string name, string family)

    {

        Name = name;

        Family = family;

    }

 

    public Person CreateNewPerson(string name, string family)

    {

        Person ob = new Person(name, family);

        ob.Name = name;

        ob.Family = family;

        return ob;

    }

 

    public void Show()

    {

        Console.WriteLine("Name: {0}, Family: {1}", Name, Family);

    }

}

همان‌طور که مي‌بينيد secondPerson را توسط متد ()CreateNewPerson از شيء firstPerson به‌وجود آورديم. در اين متد يک شيء از جنس Person ساخته شده و نام و نام‌خانوادگي (از طريق پارامتر) به فيلدهاي اين شيء اختصاص مي‌يابد و سپس reference اين شيء return مي‌شود. در متد ()Main متد ()CreateNewPerson از شيء firstPerson فراخواني شده و شيء جديدي که به‌وجود آورده است را به secondPerson متصل مي‌کند. به اين ترتيب يک شيء از جنس Person ساخته و به secondPerson reference متصل شد که داراي فيلدهاي نام و نام‌خانوادگي مخصوص به خودش است.

 

Return کردن يک آرايه

 

از آن‌جا که آرايه‌ها در سي‌شارپ object هستند، يک متد همچنين مي‌تواند يک آرايه را نيز return کند. براي مثال به برنامه‌ي بالا يک متد ديگر به اسم ()CreateFriends اضافه کرديم که در آرايه‌اي از جنس string يک سري اسم (اسامي دوستان) را ذخيره مي‌کند و در نهايت توسط متد ()GetFriends اين آرايه را return مي‌کنيم:

 

using System;

class ReturnObExample

{

    static void Main()

    {

        Person firstPerson = new Person("Catherine", "Gilbert");

        Console.Write("Fist Person = ");

        firstPerson.Show();

 

        Person secondPerson = firstPerson.CreateNewPerson("Damon", "Salvatore");

 

        Console.Write("Second Person = ");

        secondPerson.Show();

 

        Console.WriteLine();

 

        firstPerson.CreatFriends("Stefan", "Damon", "Elena");

        string[] personFriends = firstPerson.GetFriends();

 

        Console.Write("Catherine's Friends: ");

        for (int i = 0; i < personFriends.Length; i++)

        {

            Console.Write(personFriends[i] + ", ");

        }

        Console.WriteLine();

    }

}

class Person

{

    string Name, Family;

    string[] Friends;

    public string[] GetFriends()

    {

        return Friends;

    }

 

    public Person(string name, string family)

    {

        Name = name;

        Family = family;

    }

 

    public Person CreateNewPerson(string name, string family)

    {

        Person ob = new Person(name, family);

        ob.Name = name;

        ob.Family = family;

        return ob;

    }

 

    public void Show()

    {

        Console.WriteLine("Name: {0}, Family: {1}", Name, Family);

    }

 

    public void CreatFriends(params string[] buddies)

    {

        Friends = new string[buddies.Length];

 

        for (int i = 0; i < buddies.Length; i++)

            Friends[i] = buddies[i];

    }

}

توجه کنيد که متد ()GetFriends چگونه آرايه‌اي از جنس string را بازمي‌گرداند. شما مي‌توانيد آرايه‌اي با ابعاد بيشتر را نيز return کنيد.

 

Method Overloading

 

در سي‌شارپ دو يا بيشتر از دو متد مي‌توانند نام يکساني داشته باشند، به‌شرطي که  تعريف پارامترهاي آن‌ها متفاوت باشد. در اين‌جور موارد گفته مي‌شود که متدها overload شده‌اند و درکل به اين پروسه method overloading گفته مي‌شود. Method overloading يکي از جنبه‌هاي اجراي polymorphism (چند ريختي) است.

 

1class Program

{

 

    static void Main()

    {

        MethodA();

        MethodA("");

    }

 

    static void MethodA()

    {

    }

 

    static void MethodA(string a)

    {

    }

}

همان‌طور که مي‌بينيد در مثال بالا دو متد هم‌نام به اسم ()MethodA داريم که يکي بدون پارامتر است و ديگري يک پارامتر از جنس string دارد. درکل براي overload کردن يک متد کافي است که ورژن‌هاي مختلفي از آن متد را تعريف کنيد. براي اين کار بايد يک محدوديت را در هنگام overload کردن رعايت کنيد: نوع يا تعداد پارامترهاي هر متد overload شده بايد با بقيه متفاوت باشد. همچنين کافي نيست که فقط return-type يک متد overload شده با ديگري متفاوت باشد بلکه نوع يا تعداد پارامترهاي استفاده شده در آن بايد با بقيه متدهاي overload شده فرق کند.

 

به مثال زير توجه کنيد:

 

using System;

class MethodOverloading

{

    public int Addition(int a, int b)

    {

        return a + b;

    }

    public int Addition(int a, int b, int c)

    {

        return a + b + c;

    }

    public float Addition(float a, float b)

    {

        return a + b;

    }

    public float Addition(float a, float b, float c)

    {

        return a + b + c;

    }

}

 

//Now you can use those Addition method four types

class hub

{

    public static void Main()

    {

        MethodOverloading methOverload = new MethodOverloading();

 

        Console.WriteLine("Addition of two integers: "

            + methOverload.Addition(2, 5));

 

        Console.WriteLine("Addition of two double type values: "

            + methOverload.Addition(0.40f, 0.50f));

 

        Console.WriteLine("Addition of three integers: "

            + methOverload.Addition(2, 5, 5));

 

        Console.WriteLine("Addition of three double type values: "

            + methOverload.Addition(0.40f, 0.50f, 0.60f));

    }

}

در مثال بالا ما چندين ورژن از متد ()Addition را داريم که هر کدام از نظر نوع و تعداد پارامترهاي استفاده شده در آن‌ها با بقيه متفاوت هستند و همچنين return-type آن‌ها هم مي‌تواند متفاوت باشد. توجه کنيد که overload کردن به شکل زير کاملاً نادرست است:

// One OvlDemo(int) is OK.

public void OvlDemo(int a)

{

    Console.WriteLine("One parameter: " + a);

}

 

/* Error! Two OvlDemo(int)s are not OK even though

return types differ. */

public int OvlDemo(int a)

{

    Console.WriteLine(“One parameter: “ + a);

    return a * a;

}

توجه به اين نکته ضروري است که overload کردن ربطي به return-type ندارد و تنها پارامترها و جنس پارامترها اهميت دارند. در مثال بالا با توجه به اين‌که return-type متفاوت است اما به‌دليل يکي بودن پارامترها overload اتفاق نمي‌افتد و برنامه کامپايل نمي‌شود. در ويژوال استوديو هنگامي‌که يک متد را صدا مي‌زنيد که چندين overload دارد با چنين چيزي مواجه مي‌شويد:

 

 

 

در اين‌جا IntelliSense ويژوال استوديو به شما نشان مي‌دهد که اين متد چهار overload دارد و شما مي‌توانيد مقادير مختلفي را به‌عنوان argument به اين متد بدهيد. کافي است که کليدهاي بالا و پايين را فشار دهيد تا overload هاي اين متد را مشاهده کنيد.

 

همان‌طور که ذکر شد، method overloading يکي از جنبه‌هاي اجراي polymorphism است و باعث اجراي الگوي “one interface, multiple methods” مي‎شود. مثلاً در زباني مثل C که method overloading را ساپورت نمي‌کند هر متد بايد يک اسم منحصربه‌فرد داشته باشد درحالي‌که شما مکرراً نياز داريد تا توسط يک متد روي data type هاي مختلف کاري را انجام دهيد. همان برنامه بالا که از متد ()Addition استفاده شده بود را در نظر بگيريد. اگر قرار بود اين‌کار را توسط زبان C انجام دهيم مي‌بايست چهار function مختلف با اسم‌هاي مختلف تعريف مي‎کرديم درحالي‌که اين چهار function همه‌گي يک کار يکسان را انجام مي‌دهند. مسلماً اين‌کار اندکي قضيه را پيچيده‌تر مي‌کند زيرا با توجه به اين‌که همه‌ي اين function ها يک کار را انجام مي‌دهند و مفهوم يکساني دارند شما مجبوريد ? اسم مختلف را به‌خاطر بسپاريد. مثلاً متد ()WriteLine از کلاس Console نوزده overload دارد. تصور کنيد در اين موارد که تعداد overload ها زياد است آن‌گاه تعريف کردن متدهاي جداگانه با اسامي مجزا عملاً کار احمقانه‌اي است.

 

Overload Constructors

 

Constructor ها نيز مي‌توانند همانند متدها overload شوند. اين‌کار باعث مي‌شود بتوانيد به طرق مختلفي object هاي خود را بسازيد. به مثال زير توجه کنيد:

44

// Demonstrate an overloaded constructor.

using System;

class MyClass

{

    public int x;

 

    public MyClass()

    {

        Console.WriteLine("Inside MyClass().");

        x = 0;

    }

 

    public MyClass(int i)

    {

        Console.WriteLine("Inside MyClass(int).");

        x = i;

    }

    public MyClass(double d)

    {

        Console.WriteLine("Inside MyClass(double).");

        x = (int)d;

    }

 

    public MyClass(int i, int j)

    {

        Console.WriteLine("Inside MyClass(int, int).");

        x = i * j;

    }

}

class OverloadConsDemo

{

    static void Main()

    {

        MyClass t1 = new MyClass();

        MyClass t2 = new MyClass(88);

        MyClass t3 = new MyClass(17.23);

        MyClass t4 = new MyClass(2, 4);

 

        Console.WriteLine("t1.x: " + t1.x);

        Console.WriteLine("t2.x: " + t2.x);

        Console.WriteLine("t3.x: " + t3.x);

        Console.WriteLine("t4.x: " + t4.x);

    }

}

خروجي:

 

 

 

در اين‌جا ()MyClass چهار overload دارد که هر کدام باعث مي‌شوند object به شکل متفاوتي ساخته شود. توسط کلمه‌کليدي new و argument هايي که براي ساخت شيء به‌کار مي‌بريد، constructor مربوط به آن فراخواني مي‌شود و شيء را به‌وجود مي‌آورد. با overload کردن constructor هاي کلاس، شما اين امکان را به‌وجود مي‌آوريد که object ها به طرق مختلفي بتوانند ساخته شوند.

using System;

class Employee

{

    public int IdNumber;

    public double Salary;

 

    public Employee()

    {

        IdNumber = 999;

        Salary = 0;

    }

    public Employee(int empId)

    {

        IdNumber = empId;

        Salary = 0;

    }

    public Employee(int empId, double sal)

    {

        IdNumber = empId;

        Salary = sal;

    }

    public Employee(char code)

    {

        IdNumber = 111;

        Salary = 100000;

    }

}

public class CreateSomeEmployees

{

    public static void Main()

    {

        Employee aWorker = new Employee();

        Employee anotherWorker = new Employee(234);

        Employee theBoss = new Employee('A');

 

        Console.WriteLine("{0} --- {1}", aWorker.IdNumber,

        aWorker.Salary);

 

        Console.WriteLine("{0} --- {1}", anotherWorker.IdNumber,

        anotherWorker.Salary);

 

        Console.WriteLine("{0} --- {1}", theBoss.IdNumber,

        theBoss.Salary);

    }

}

در اين برنامه چهار overload از ()Employee وجود دارد که هرکدام به‌نحوي باعث ساخت شيء مي‌شوند.

 

درخواست يک overloaded constructor از طريق this

 

هنگامي‌که با constructor هاي overload شده کار مي‌کنيد، يک constructor مي‌تواند، constructor ديگري را درخواست کند. اين‌کار از طريق کلمه‌کليدي this انجام مي‌شود و فرم کلي آن به‌شکل زير است:

 

1

2

3

constructor-name(parameter-list1) : this(parameter-list2) {

    // ... body of constructor, which may be empty

}

در اين‌جا ابتدا با توجه به parameter-list2 يکي از constructor هاي overload شده اجرا مي‌شود و سپس اگر کدي درون constructor اصلي (constructor اوليه) وجود داشته باشد، اجرا مي‌شود.

// Demonstrate invoking a constructor through this.

using System;

class AlphaBeta

{

    public int Alpha, Beta;

    public AlphaBeta() : this(0, 0)

    {

        Console.WriteLine("Inside AlphaBeta()");

    }

    public AlphaBeta(AlphaBeta obj) : this(obj.Alpha, obj.Beta)

    {

        Console.WriteLine("Inside AlphaBeta(obj)");

    }

    public AlphaBeta(int i, int j)

    {

        Console.WriteLine("Inside AlphaBeta(int, int)");

        Alpha = i;

        Beta = j;

    }

}

class OverloadConsDemo

{

    static void Main()

    {

        AlphaBeta ob1 = new AlphaBeta();

        AlphaBeta ob2 = new AlphaBeta(8, 9);

        AlphaBeta ob3 = new AlphaBeta(ob2);

 

        Console.WriteLine();

        Console.WriteLine("ob1.x, ob1.y: " + ob1.Alpha + ", " + ob1.Beta);

        Console.WriteLine("ob2.x, ob2.y: " + ob2.Alpha + ", " + ob2.Beta);

        Console.WriteLine("ob3.x, ob3.y: " + ob3.Alpha + ", " + ob3.Beta);

    }

}

خروجي:

 

 

 

به اين نکته توجه کنيد، پارامترهايي که بعد از this مي‌آيند مشخص مي‌کنند که کدامين constructor بايد در ابتدا اجرا شود. مثلاً براي ()AlphaBeta که خودش پارامتري ندارد، (this(0, 0 دو عدد integer دارد و مشخص مي‌کند که ابتدا بايد آن constructor اي اجرا شود که دو پارامتر int دارد. بنابراين ابتدا محتويات (AlphaBeta(int i, int j اجرا شده و سپس محتويات ()AlphaBeta اجرا مي‌شود. در مورد (AlphaBeta(AlphaBeta obj نيز مراحل به‌ترتيب قبل است. (This(obj.Alpha, obj.Beta دو عدد int گرفته است بنابراين  طراحی وب سایت   ابتدا محتويات (AlphaBeta(int i, int j اجرا شده و سپس محتويات (AlphaBeta(AlphaBeta obj اجرا مي‌شود. يکي از مزاياي اين کار اين است که از کدنويسي اضافي جلوگيري مي‌کند. با اين‌کار شما ديگر در هر constructor نياز نداريد که براي مقداردهي به Alpha و Beta کد تکراري بنويسيد.

 

به مثال ديگري در اين زمينه توجه کنيد:

 

using System;

class Mouse

{

    public Mouse()

        : this(-1, "")

    {

        // Uses constructor initializer.

    }

 

    public Mouse(int weight, string name)

    {

        // Constructor implementation.

        Console.WriteLine("Constructor weight = {0}, name = {1}",

            weight,

            name);

    }

}

 

class Program

{

    static void Main()

    {

        // Test the two constructors for Mouse type.

        Mouse mouse1 = new Mouse();

        Mouse mouse2 = new Mouse(10, "Sam");

    }

}

تمرين شماره ??: در اين تمرين مي‌بايست يک جعبه‌ي موسيقي درست کنيد. اين جعبه موسيقي، بايد چندين هنرمند داشته باشد و هر هنرمند مي‌تواند چندين آلبوم و تک آهنگ داشته باشد. همچنين مي‌بايست قابليت Play و Stop کردن را به اين جعبه موسيقي بدهيد و بتوانيد آلبوم‌ها و آهنگ‌ها را حذف و اضافه کنيد.

 

راهنمايي:

using System;

using System.Media;

class MyClass

{

    static void Main()

    {

        SoundPlayer myPlayer = new SoundPlayer(@"c:\mywavfile.wav");

        myPlayer.Play();

        myPlayer.Stop();

    }

}

اين تمرين را تا آن‌جا که مي‌توانيد شي‌گرا بنويسيد. در قسمت بعد حل تمرين روي سايت قرار مي‌گيرد.

 

توجه: زين پس هر يک از دوستان که جواب تمرين‌هاي زنگ سي‌شارپ را براي ما ايميل کند، به عنوان تشويقي يک نکته‌ي سي‌شارپ به‌صورت شخصي براي وي فرستاده مي‌شود.

 

DOWNLOAD PDF‌

hadi بازدید : 6 سه شنبه 15 مرداد 1392 نظرات (0)

Conversion Operators

در قسمت قبل اندکي با conversion operators آشنا شديد و همين‌طور چگونگي استفاده از implicit conversion را فرا گرفتيد. براي تبديل implicit به‌صورت زير عمل مي‌کرديم:

 

using System;

class TwoD

{

    int X, Y;

    public TwoD()

    {

        X = Y = 0;

    }

    public TwoD(int a, int b)

    {

        X = a;

        Y = b;

    }

    public static implicit operator int(TwoD op)

    {

        return op.X * op.Y;

    }

}

class OpOvDemo

{

    static void Main()

    {

        TwoD ob1 = new TwoD(2, 2);

        int i = ob1;

        Console.WriteLine(i);

    }

}

 

در اين حالت، تبديل به‌طور اتوماتيک انجام مي‌شود و مقدار ? در i قرار مي‌گيريد. اگر conversion را به‌طور explicit تعريف کنيد، تبديل به‌صورت اتوماتيک انجام نمي‌شود و cast مورد نياز است. در زير برنامه‌ي بالا را بازنويسي کرده‌ايم اما اين‌بار به‌جاي implicit از explicit استفاده شده است:

using System;

class TwoD

{

    int X, Y;

    public TwoD()

    {

        X = Y = 0;

    }

    public TwoD(int a, int b)

    {

        X = a;

        Y = b;

    }

    public static explicit operator int(TwoD op)

    {

        return op.X * op.Y;

    }

}

class OpOvDemo

{

    static void Main()

    {

        TwoD ob1 = new TwoD(2, 2);

        int i = (int)ob1;

        Console.WriteLine(i);

    }

}

همان‌طور که مي‌بينيد، مقدار شيء ob1 درون i قرار نمي‌گيرد مگر اين‌که ابتدا cast انجام شود:

 

1

int i = (int)ob1;

اگر cast را حذف کنيد برنامه کامپايل نخواهد شد.

 

محدوديت‌هايي که در conversion operators وجود دارد:

 

Target-type يا source-type در conversion بايستي از جنس همان کلاسي  طراحی وبسایت  باشد که conversion در آن تعريف شده است. براي مثال نمي‌توانيد تبديل double‌ به int را از نو تعريف کنيد.

نمي‌توانيد class type را به نوع داده‌ي object تبديل کنيد.

نمي‌توانيد براي يک source-type و target-type هم تبديل implicit و هم تبديل explicit تعريف کنيد.

نمي‌توانيد از يک base class به يک derived class تبديل انجام دهيد (با مبحث ارث‌بري بعداً آشنا خواهيد شد).

نمي‌توانيد براي يک class-type به/از interface تبديل انجام دهيد (با مبحث interface بعداً آشنا خواهيد شد).

علاوه‌بر اين قوانين، براي انتخاب بين implicit يا explicit بايد دقت کنيد. implicit conversion بايد زماني مورد استفاده قرار گيرد که تبديل کاملاً عاري از خطا باشد. براي کسب اطمينان در اين مورد از اين دو قانون پيروي کنيد: يک، هيچ فقدان اطلاعاتي (مثل کوتاه‌سازي، سرريز، تغيير علامت و…) نبايد رخ دهد. دو، تبديل نبايد باعث بروز exception يا خطا در برنامه شود. اگر conversion نتواند اين دو قانون را رعايت کند، بايد از explicit conversion بهره ببريد.

 

هيچ نياز و اجباري نيست که عملکرد اپراتور overload‌ شده با عمکرد اصلي آن operator ارتباط داشته باشد. با اين حال، به‌دليل اين‌که ساختار و خوانايي کد حفظ شود، بهتر است اپراتور overload‌ شده بازتابي از رفتار اصلي آن operator باشد. براي مثال، + مربوط به کلاس TwoD از نظر مفهومي، مشابه + در نوع integer است و اينکه اين operator رفتاري مشابه / داشته باشد چندان جالب نيست.

 

توجه کنيد که الويت operator ها قابل تغيير نيست و نمي‌توانيد اين الويت را عوض کنيد همچنين تعدادي از operator ها قابل overload شدن نيستند. در جدول زير operator هايي که قابل overload شدن نيستند مشخص شده‌اند:

 

 

 

با operator هاي ناآشنا در جدول بالا، در مقالات آينده آشنا خواهيد شد. قابل ذکر است که operator هاي انتسابي نيز overload نمي‌شوند و همين‌طور operator هايي به‌شکل += نيز قابل overload‌ شدن نيستند. البته اگر يک operator را overload کنيد که به‌طور کلي حالت ترکيبي مثل =+ را هم دارا باشد، اين حالت ترکيبي براي شيء شما نيز به‌صورت اتوماتيک اعمال مي‌شود. به‌عنوان مثال اگر + را overload کنيد، =+ نيز براي استفاده فعال است:

 

TwoD a = new TwoD(2, 2);

TwoD b = new TwoD(3, 4);

a += b;

نکته‌ي ديگر اين‌که، اگرچه نمي‌توانيد اپراتور [ ] که مربوط به index آرايه است را overload کنيد، اما مي‌توانيد از indexer استفاده کنيد که در ادامه به آن مي‌پردازيم.

 

Indexers

 

همان‌طور که مي‌دانيد، index گذاري آرايه از طريق اپراتور [ ] انجام مي‌شود. تعريف کردن اپراتور [ ] براي کلاس نيز امکان‌پذير است اما براي اين منظور از operator method‌ استفاده نکرده و در عوض از Indexer استفاده مي‌کنيد. Indexer اجازه مي‌دهد يک شيء مانند يک آرايه index گذاري شود. Indexer ها مي‌توانند يک يا بيشتر از يک بعد داشته باشند و ما در اين‌جا با Indexer‌ يک بعدي شروع مي‌کنيم.

 

فرم کلي Indexer يک بعدي به‌شکل زير است:

 

 

element-type this[int index] {

    // The get accessor

    get {

        // return the value specified by index

    }

 

    // The set accessor

    set {

        // set the value specified by index

    }

}

در اين‌جا، element-type مشخص کننده‌ي نوع عنصر indexer است. از اين‌رو، هر عنصري که توسط indexer قابل دسترسي باشد، از نوع element-type است. اين نوع با نوع يک آرايه (که براي indexer در نظر مي‌گيريد و اصطلاحاْ به آن backing store مي‌گويند) يکسان است. پارامتر index در واقع index عنصري که مي‌خواهيد به آن دسترسي داشته باشيد را مشخص مي‌کند. توجه کنيد که نيازي نيست حتماْ جنس پارامتر int‌ باشد اما از آن‌جا که indexer ها مشابه با index آرايه مورد استفاده قرار مي‌گيرند، استفاده از int در اين مورد رايج است.

 

درون بدنه‌ي indexer کلمه‌هاي get و set را مشاهده مي‌کنيد که به هر کدام از آن‌ها accessor گفته مي‌شود. يک accessor‌ مشابه يک متد است با اين تفاوت که return-type و parameter ندارد. هنگامي‌که از indexer استفاده مي‌کنيد اين accessor ها به‌طور اتوماتيک فراخواني مي‌شوند و هر دوي accessor ها index را به‌عنوان پارامتر دريافت مي‌کنند. اگر indexer در طرف چپ تساوي قرار گرفته باشد، بنابراين set accessor فراخواني و يک مقدار به عنصري که توسط index مشخص شده است، اختصاص داده مي‌شود. در غير اين‌صورت get accessor فراخواني شده و عنصر مشخص شده توسط index، return مي‌شود. Set method‌ همچنين يک پارامتر به اسم value دارد که شامل مقداري است که به يک index مشخص اختصاص داده مي‌شود.

 

يکي ديگر از مزيت‌هاي indexer اين است که مي‌توانيد دسترسي به آرايه را دقيقاً تحت کنترل داشته باشيد و از دسترسي‌هاي نامناسب جلوگيري کنيد.

 

به مثال ساده‌ي زير توجه کنيد:

using System;

class IndexerDemo

{

    int[] arr; // reference to underlying array (backing store)

    public int Lenght;

 

    public IndexerDemo(int size)

    {

        arr = new int[size];

        Lenght = size;

    }

 

    // Indexer

    public int this[int index]

    {

        // get accessor

        get

        {

            return arr[index];

        }

 

        // set accessor

        set

        {

            arr[index] = value;

        }

    }

}

class idx

{

    static void Main()

    {

        IndexerDemo ob = new IndexerDemo(4);

 

        ob[0] = 10;

        ob[1] = 20;

        ob[2] = 30;

        ob[3] = 40;

 

        for (int i = 0; i < ob.Lenght; i++)

        {

            Console.WriteLine(ob[i]);

        }

    }

}

همان‌طور که مي‌بينيد، يک indexer تعريف کرده‌ايم که با عناصري از نوع int سروکار دارد. Indexer را به‌صورت public تعريف کرده‌ايم تا خارج از کلاس نيز قابل دسترس باشد. در قسمت get accessor مقدار [arr[index را return کرده‌ايم و همين‌طور در قسمت set accessor نيز value به index عنصر مربوطه اختصاص داده مي‌شود. Value يک پارامتر بوده و شامل مقداري است که به آرايه اختصاص داده مي‌شود. نيازي نيست که يک indexer هم get و set را داشته باشد بلکه مي‌توانيد يک indexer داشته باشيد که تنها get يا set را دارد و read-only يا write-only است. البته در مثال بالا براي سادگي بيشتر، هيچ کنترلي روي مقاديري که قرار است get يا set شوند اعمال نکرده‌ايم.

 

در مثال زير روي get و set کنترل بيشتري اعمال کرده‌ايم:

using System;

class IndexerDemo

{

    int[] arr;

    public int Length;

    public bool ErrFlag;

    public IndexerDemo(int size)

    {

        arr = new int[size];

        Length = size;

    }

 

    public int this[int index]

    {

        get

        {

            if (Ok(index))

            {

                ErrFlag = false;

                return arr[index];

            }

            else

            {

                ErrFlag = true;

                return 0;

            }

        }

        set

        {

            if (Ok(index))

            {

                ErrFlag = false;

                arr[index] = value;

            }

            else

                ErrFlag = true;

        }

    }

 

    private bool Ok(int index)

    {

        if (index >= 0 && index < Length) 

            return true;

        return false;

    }

}

class Idx

{

    static void Main()

    {

        IndexerDemo ob = new IndexerDemo(5);

 

        for (int i = 0; i < 10; i++)

        {

            ob[i] = i * 10;

 

            if (ob.ErrFlag)

                Console.WriteLine("ob[{0}] is out of bound!", i);

            else

                Console.WriteLine("ob[{0}]: {1}", i, ob[i]);

        }

    }

}

خروجي:

 

 

 

همان‌طور که مي‌بينيد، پيش از آن‌که get يا set کنيم، ابتدا توسط متد ()Ok صحيح بودن index را بررسي کرده‌ايم تا در محدوده‌ي درست بوده و out of bound نباشد. همچنين هنگامي‌که index نامناسبي در حال get يا set شدن است، متغيري به اسم ErrFalg مقداردهي مي‌شود که نشان‌دهنده‌ي بروز خطا است. البته براي خطايابي در مقالات آينده با روش مناسب‌تري آشنا خواهيد شد اما در حال حاضر همين روش مناسب است.

 

يک indexer مي‌تواند overload شود. در مثال زير علاوه‌بر indexer هاي int مي‌توانيد indexer هايي از نوع double نيز داشته باشيد. در اين مثال double indexer به نزديک‌ترين index گرد (round) مي‌شود:

   public int this[double index]

    {

        get

        {

            int idx = (int)Math.Round(index);

 

            if (Ok(idx))

            {

                ErrFlag = false;

                return arr[idx];

            }

            else

            {

                ErrFlag = true;

                return 0;

            }

        }

        set

        {

            int idx = (int)Math.Round(index);

            if (Ok(idx))

            {

                ErrFlag = false;

                arr[idx] = value;

            }

            else

            {

                ErrFlag = true;

            }

        }

    }

 

    private bool Ok(int index)

    {

        if (index >= 0 && index < Length) 

            return true;

        return false;

    }

}

class Idx

{

    static void Main()

    {

        IndexerDemo ob = new IndexerDemo(5);

 

        for (int i = 0; i < 10; i++)

        {

            ob[i] = i * 10;

 

            if (ob.ErrFlag)

                Console.WriteLine("ob[{0}] is out of bound!", i);

            else

                Console.WriteLine("ob[{0}]: {1}", i, ob[i]);

        }

 

        Console.WriteLine();

 

        ob[1] = 4;

        ob[2] = 8;

 

        Console.WriteLine("ob[1]: {0}", ob[1]);

        Console.WriteLine("ob[2]: {0}", ob[2]);

        Console.WriteLine("ob[1.3]: {0}", ob[1.3]);

        Console.WriteLine("ob[1.7]: {0}", ob[1.7]);

    }

}

خروجي:

 

 

 

همان‌طور که در خروجي مي‌بينيد، index هاي double توسط متد ()Math.Round به نزديک‌ترين عدد صحيح، گرد شده‌اند. ??? به ? و ??? به ? گرد شده است.

 

قابل ذکر است که نيازي نيست حتماً يک آرايه براي indexer داشته باشيد. مهم اين است که به يک کلاس اين قابليت را اضافه کنيد تا به‌شکل آرايه نيز بتوان از آن استفاده کرد.

 

به مثال زير توجه کنيد:

using System;

class IndexerDemo

{

    public int this[int index]

    {

        get

        {

            if (index >= 1 && index <= 10)

            {

                return index * 10;

            }

            else return -1;

        }

    }

}

class Idx

{

    static void Main()

    {

        IndexerDemo ob = new IndexerDemo();

 

        Console.WriteLine(ob[1]);

        Console.WriteLine(ob[2]);

        Console.WriteLine(ob[3]);

        Console.WriteLine(ob[11]);

        Console.WriteLine(ob[10]);

    }

}

 

يعني استفاده به‌شکل زير، نادرست است:

 

1

ob[2] = 5;

اما به‌صورت زير، کاملاً صحيح است:

 

1

int i = ob[2];

دو محدوديت ديگر براي Indexer ها موجود است. يک، به‌دليل اين‌که indexer ها درواقع storage location (محل ذخيره سازي) تعريف نمي‌کنند و به نوعي متد هستند، استفاده از آن‌ها به‌عنوان پارامتر ref و out غيرمجاز است. دو، indexer نمي‌تواند به‌صورت static تعريف شود.

 

Indexer هاي چند بعدي

 

شما مي‌توانيد براي آرايه‌هاي چند بعدي نيز، indexer بسازيد.

 

به مثال زير توجه کنيد:

// A two-dimensional fail-soft array.

using System;

class FailSoftArray2D

{

    int[,] a; // reference to underlying 2D array

    int rows, cols; // dimensions

    public int Length; // Length is public

    public bool ErrFlag; // indicates outcome of last operation

 

    // Construct array given its dimensions.

    public FailSoftArray2D(int r, int c)

    {

        rows = r;

        cols = c;

        a = new int[rows, cols];

        Length = rows * cols;

    }

 

    // This is the indexer for FailSoftArray2D.

    public int this[int index1, int index2]

    {

        // This is the get accessor.

        get

        {

            if (ok(index1, index2))

            {

                ErrFlag = false;

                return a[index1, index2];

            }

            else

            {

                ErrFlag = true;

                return 0;

            }

        }

        // This is the set accessor.

        set

        {

            if (ok(index1, index2))

            {

                a[index1, index2] = value;

                ErrFlag = false;

            }

            else ErrFlag = true;

        }

    }

    // Return true if indexes are within bounds.

    private bool ok(int index1, int index2)

    {

        if (index1 >= 0 & index1 < rows &

        index2 >= 0 & index2 < cols)

            return true;

        return false;

    }

}

// Demonstrate a 2D indexer.

class TwoDIndexerDemo

{

    static void Main()

    {

        FailSoftArray2D fs = new FailSoftArray2D(3, 5);

        int x;

 

        // Show quiet failures.

        Console.WriteLine("Fail quietly.");

        for (int i = 0; i < 6; i++)

            fs[i, i] = i * 10;

        for (int i = 0; i < 6; i++)

        {

            x = fs[i, i];

            if (x != -1) Console.Write(x + " ");

        }

        Console.WriteLine();

 

        // Now, display failures.

        Console.WriteLine("\nFail with error reports.");

        for (int i = 0; i < 6; i++)

        {

            fs[i, i] = i * 10;

            if (fs.ErrFlag)

                Console.WriteLine("fs[" + i + ", " + i + "] out-of-bounds");

        }

 

        Console.WriteLine();

        for (int i = 0; i < 6; i++)

        {

            x = fs[i, i];

            if (!fs.ErrFlag) Console.Write(x + " ");

            else

                Console.Write("\nfs[" + i + ", " + i + "] out-of-bounds");

        }

        Console.WriteLine();

    }

}

API

hadi بازدید : 3 دوشنبه 31 تیر 1392 نظرات (0)

 

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

APIهاي تبديلي، پروژه تبليغاتي جديدي است که به مشاغل در توليد يک پروفايل براي هر فرد کمک مي کند.گوگل مدتي است تمرکز خود را روي ذخيره سازي اطلاعات جستجوي کاربران قرار داده است و مي تواند تبليغات خاصي را به افراد خاص هدايت کند. مثلا اگر کسي به موسيقي کلاسيک علاقه دارد، تبليغ سي دي هاي جيمي هندريکس را بيشتر از بقيه تبليغات در اينترنت خواهد ديد.

اما API هاي تبديلي اين اقدام را يک مرحله جلوتر خواهد برد ، اين پروفايل ها نه تنها بر اساس جستجوهاي کاربران، بلکه براساس خريدهاي آفلاين آنها نيز شکل مي گيرد.گوگل اين پروژه جديد را در وبلاگش رونمايي کرد.محتواي اين وبلاگ اين مي باشد:

«تبليغات آنلاين به تبادلات آفلاين نياز دارد. براي به دست آوردن اين فاصله خالي و حساب صحيح آن در تبليغات آنلاين، نسخه بتاي APIهاي تبديلي را براي ارسال خودکار خريدهاي آفلاين ايجاد کرده ايم.»

اين APIها اطلاعاتي از جمله تبادلات درون فروشگاهي را نيز در بر مي گيرد. لبته مواردي نيز براي احتياط بايد انجام شود تا اطلاعات کاربران امن بماند ، اما اگر خريد آفلاين از سوي کاربر در تبليغات آنلاينش نيز نشان داده شود، نبايد تعجب کرد.

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

سمت ا

اين که اجازه بدهيم آدم ها سوارخودرو شوند، کار اشتباهي است.

او همچنين در مصاحبه اي پيش تر گفته بود:

به نظر من، مردم نمي خواهند گوگل جواب سوالات شان را بدهد، مردم مي خواهند گوگل به آنها بگويد چه کاري را الان انجام دهند.

بسياري معتقدند کورزويل که نظريه Singularity را مطرح کرده است يک طراح علمي ـ تخيلي است ، اما گوگل اعتقاد دارد با کمک ديدگاه هاي او مي تواند علمي ـ تخيلي را به واقعيت نزديک تر کند.

 

 

رآمد شغل طراحي وب سايت چقدر است، و ويژگيهاي اين شغل چيست؟

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

 

طبعا يکي از راحتترين پاسخها نيز اين است که بستگي به خودتان و پشتکارتان دارد! اما اگر بخواهيم دقيقتر شويم، شغل طراحي وب ويژگيهايي دارد که آنرا از بسياري شغلهاي ديگر متمايز مي کند. اينجا به چند مورد به صورت خلاصه اشاره مي کنيم:

 

 

 

1. درآمد طراح سايت:

 

بستگي دارد شما براي يک شرکت به عنوان کارمند کار کنيد يا به صورت مستقل و انفرادي. در حالت اول حقوق ميانگين براي طراح وب به شکل تمام وقت (در سال 91 - تهران) معمولا بين 600 هزار تومان تا 1.5 ميليون تومان است که ميزان دقيق آن بستگي به سطح مهارتهاي شما، سختي کار خواسته شده، بزرگي شرکتي که براي آن کار مي کنيد و... دارد. اما در حالت دوم، يعني اگر به صورت مستقل کار کنيد، بستگي به اينکه چند پروژه در ماه بگيريد مي توانيد قيمتهايتان را بالا و پايين کنيد. براي اينکه حدود درآمد دستتان بيايد، بابت طراحي اختصاصي يک وبسايت دايناميک با امکانات معمول سايتهاي شرکتي، معمولا بين 400 تا 600 تومان مي توانيد دريافت کنيد. حالا اگر فرض کنيد ماهانه فقط دو پروژه بگيريد، حدود يک ميليون در ماه درآمد خواهيد داشت که گرچه بالا نيست، اما براي شروع بد هم نيست. اين البته براي طراحان وب در سطح متوسط و در ايران است و اگر شما يک طراح وب حرفه اي باشيد به نسبت بزرگي پروژه ها و قيمتها بسيار بالاتر از اين خواهد بود. ضمن آنکه تعرفه طراحي وب در کشورهاي اروپايي و امريکا جزء شغلهاي پردرآمد است و اصلا قابل مقايسه با درآمدهاي ايران نيست.

اما شغل طراحي وب ويژگيهاي منحصر به فرد ديگري نيز دارد که اينها بازدهي و سود اين حرفه را بيشتر مي کنند.

 

 

2. عدم وابستگي به موقعيت جغرافيايي:

 

در واقع يک طراح وب مي تواند در کلبه اي در يک روستاي دور افتاده هم مشغول به حرفه خود باشد! کافي است يک خط تلفن و برق باشد تا بتواند تقريبا از همه جاي دنيا سفارش بگيرد. در واقع يک طراح وب (چه به عنوان طراح مستقل و فريلنسر، و چه به عنوان کارمند دورکار يک شرکت) تمام کارهاي خود را در بستر وب انجام مي دهد و لزوما نيازي به حضور نيست. در خانه خود مي توانيد بنشينيد و با ده ها مشتري از شهرهاي مختلف سر و کله بزنيد. کمتر شغلي چنين ويژگي‌اي دارد.

از طرفي، يک طراح وب اصولا بايد به اين اصل ايمان داشته باشد که وبسايت يک فرد يا شرکت نقش فروشگاهي بين المللي را دارد. اگر زبانتان هم خوب باشد شايد بتوانيد روي درآمدهاي خارجي (که بسيار بسيار بسيار بالاتر از نرخهاي معمول در ايران است) هم حساب کنيد.

 

3. عدم نياز به سرمايه‌ي اوليه، به جز زمان:

 

زمان: بزرگترين سرمايه براي طراحي وبسايت

براي اينکه شغل طراحي سايت را شروع کنيد مي توانيد با يک کامپيوتر قديمي که فقط نوت‌پد دارد شروع کنيد! اگر مصرف برق و پول اينترنت را روي حساب مصارف خانگي بگذاريم، هيچ خرج ديگري نخواهيد داشت. در واقع بزرگترين سرمايه اي که بايد بگذاريد تا به شما سود برساند، زمان است. شما بايد زمان قابل توجهي بگذاريد تمام تکنيکهاي به روز مورد نياز براي طراحي وب را ياد بگيريد، و اين يادگيري بايد هميشه استمرار داشته باشد. از طرف ديگر طراحي و برنامه نويسي شما (اگر بخواهيد حرفه اي کار کنيد) وقت قابل توجهي خواهد گرفت. از طرفي اين حرفه، جزء دسته خدمات قرار مي گيرد، و بنابراين احتمالا بيشتر از نود درصد پولي که از مشتري مي گيريد سود خالص است. پس در مقايسه با شغلهايي که با فروش محصول به سود مي رسند، واقعا شغل پر سودي به حساب مي رسد!

 

4. بازاريابي پويا:

 

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

اينها تجربياتي بود که شخصا طي سالها سابقه طراحي وب به دست آورده ام و سعي کردم نه خيلي آرماني باشد و نه خيلي بدبينانه. اگر اين مطلب به درد شما خورد، مي توانيد با يکي از اين شيوه ها جبران کنيد: لينک دادن به اين وبلاگ، به اشتراک گذاشتن اين مطلب، و کامنت گذاشتن! مرسي.

 

hadi بازدید : 4 پنجشنبه 20 تیر 1392 نظرات (0)

assistance are listed in this article. Welcome to the exciting world of WordPress!

 

flowchart

WordPress is a great product. It's easy-to-use, quite powerful, and flexible. Before you invest your valuable time and energy into installing WordPress, there are some documents you need to read to help you get started.

 

About Weblogs - What is Blogging all about?

What is WordPress?

WordPress Features

Before You Install WordPres

 

Website Host Requirements Checked and Verified

Your Web Browser of Choice

The following documents will help you understand more about how WordPress works and how to make a plan for your WordPress site:

طراحی وب سایت 

WordPress Semantics

First Steps With WordPress

WordPress Lessons

It is important to make a plan about how you want to use WordPress on your site. Here are some questions to ask yourself.

 

Will you install WordPress in the root directory, subdirectory, or you just want to make a test site to make sure you want to use it?

Have you made a list of your site categories to organize your content by groups?

Have you made a list of Pages you may want to add to your site, such as About, Contact, or Events?

Have you thought about what you want in the header art of the site?

Have you developed a content strategy and list of topics to help start blogging?

Have you thought about how to integrate social media into your WordPress site and workflow?

Step Three - Install WordPress

With this information and your plan, it's time to install WordPress.

 

Before You Install WordPress

Installing WordPress

Hosting WordPress

Editing the wp-config.php file

Frequently Asked Questions About Installing WordPress

Using FTP Clients and Softwar

 

With your installation complete, it's time to set up WordPress so it will work the way you want it to work.

 

To help you understand how all the various features and screens on the WordPress Administration Panels work, check out the Administration Screens guide for a detailed walkthrough.

 

For help on creating your user profile information, of which some or all may appear on your WordPress Theme, see the Users > Your Profile pages for guidance.

 

To set the site name and other information, go to Administration > Settings > General.

 

After you've published a few posts, you can experiment with the full edit or quick edit features in the Administration > Posts > Posts panel.

 

Add your "About," "Contact," and other information Pages by going to Administration > Pages > Add New.

 

Want to change the look and feel of your WordPress site? Go to Administration > Appearance > Themes.

 

Take time to explore the WordPress Codex site, the official documentation site for WordPress. You'll find helpful information by reading WordPress Lessons, and these helpful documents:

 

Learn WordPress for WordPress.com and beginning self-hosted WordPress tutorials and guides.

Appearance and Themes

 

Changing the look of your WordPress website is easy with just a few clicks.

 

Using WordPress Themes Introduction

The WordPress Theme Directory features thousands of WordPress Themes

WordPress Widgets can quickly add more information and content to your Theme.

WordPress blog design and layout tutorials on the 

Lessons: Designing Your WordPress Site

CSS Overview, Tips, Techniques, and Resources

WordPress Widgets

Custom Navigation Menus

The WordPress Loop in Action

Editing Files in WordPress

Frequently Requested Design Help

Frequently Asked Questions about Site Layout and Design

If you want to create a new WordPress Theme from scratch, or do major renovations, or even design WordPress Themes for public release, you will need to be familiar with HTML, XHMTL, and CSS. The following documents will get you started:

 

Developing Your Own WordPress Theme

Validating a Website

Lessons: Website Development

CSS Fixing Browser Bugs

CSS Troubleshooting

If you want a custom-made WordPress Theme creaqualified web designers on the Internet, or look in your local community.

 

There are many "add-on" scripts and programs forour WordPress site. WordPress Plugins do many things, including customizing the results of your site information, adding weather reports, adding spell cnyms. For more on how to work with Plugins and where to find WordPress Plugins for your site:

 

Managing your WordPress Plugins

WordPress Plugins

The WordPress Plugin Directory

Advanced Use of WordPress

Now that you are familiar with the basic features and functions of how WordPress works, it might be time for you to plunge deeper into the power of WordPress. The links below will expand your familiarity with PHP, HTML, XHTML, and CSS:

 

Lessons: WordPress Features and Functions

Using Permalinks

Photoblogs and Galleries

WordPress Advanced Techniques

Advanced Techniques for Plugins and Customization

WordPress Server and Database Information

Developer Documentation

Need More Help

As simple and easy as it is to use WordPress, if troubles arise, if something is confusing, if things aren't working, don't despair because help is available! Even though WordPress is free and open source, there are literally hundreds of volunteers eager to help you. Here are some helpful official resources for WordPress

WordPress Codex (where you are!)

Getting More Help

طراحی وب سایت 

FAQ

Giving Back to WordPress

Now that you're a full fledged WordPress user, consider contributing to the WordPress Codex, Support Forum, Development, and other volunteer efforts that keep WordPress going. WordPress is free and totally supported by volunteers, and your help is needed.

تعداد صفحات : 2

اطلاعات کاربری
  • فراموشی رمز عبور؟
  • آرشیو
    آمار سایت
  • کل مطالب : 14
  • کل نظرات : 0
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • آی پی امروز : 7
  • آی پی دیروز : 1
  • بازدید امروز : 2
  • باردید دیروز : 0
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 2
  • بازدید ماه : 2
  • بازدید سال : 4
  • بازدید کلی : 216