ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 2 از 2
  1. #1
    2012/01/04
    101
    2

    چگونه يک کد تميز و قابل توسعه بنويسيم !

    سلام.
    شايد يکم عنوان تاپيک يه جوري باشه. پس بهتره اول توضيح بديم که منظورمون از کد تميز و قابل توسعه چيه :smile:
    کد تميز در مقابل کد کثيف قرار ميگيره :redface: براي نمونه به اين کد دقت کنيد :

    کد:
    #include <iostream>
    
    using namespace std;
    
    int plt(int a, int b)
    {
      int w;
      w = a+b;
      return w;
    }
    int main(int a, char** b)
    {
      cout<<"10 + 30 : "<< plt(10,30)<<"\n";
      system("pause");
    }
    اين يه کد نسبتا کثيفه ! نسبتا چون راستش تو اين چند خط زياد تميز و کثيف بودن کد مشخص نيست. بري اين که بهتر متوجه بشيد کد زير رو نگاه کنيد که يک همون کد بالا ولي نسخه تميزش هست :

    کد:
    #include <iostream>
    
    using namespace std;
    
    int PlusOfTwoNumber(int firstValue, int secondValue);
    
    int main(int a, char** b)
    {
      cout<<"10 + 30 : "<< PlusOfTwoNumber(10,30)<<"\n";
      system("pause");
    }
    
    int PlusOfTwoNumber(int firstValue, int secondValue)
    {
      int result;
      result = firstValue+secondValue;
      return result;
    }
    همونطور که ميبينيد به اين کد خيلي خوانا تر از کد قبليه. به عنوان مثال از روي اسم تابع به راحتي ميشه تشخيص داد چه کاري انجام ميده و يا اينکه در ورودي ها چه چيزي بايد نمايش داده بشه.
    خرورجي دو برنامه يکيه ولي تفاوتش وقتي مشخص ميشه که شما قرار باشه يه برنامه نسبتا طولاني و يکم بزرگ تر از يک برنامه کوچيک مثل اين بنويسيد :read:
    يا مثلا قرار باشه برنامتون يه لايبري باشه و کس ديگه اي بخواد ازش استفاده کنه. يا يک فاجعه بزرگ تر اين که روزي نياز داشته باشيد برنامتون رو گسترش بديد يا چيزي رو از توي اون پيدا کنيد.
    مورد آخر معمولا شايع تر هست. و کد ميتونه کثيف منجر به اين ميشه که برنامه نويس مجبور شه از اول همون برنامه رو با تغيراتي که ميخاد بنويسيه. و اينکار تقريبا توي پروژه هاي بزرگ غير ممکنه. چون يک پروژه بزرگ ( يک نرم افزار خاص رو مثلا در نظر بگيريد مثلا فوتوشاپ) خيلي چيزا در نسخه هاي مختلف ثابت هست ولي به مرور زمان به اون نرم افزار چيزاي جديد اضافه ميشه يا برخي از مشکلاتش رفع ميشه. حالا اگه کد کثيف باشه نه ميشه به راحتي گسترشش داد و نه به اين راحتيا ميشه عيبش رو پيدا و برطرف کرد.

    و اگه کد کثيف بنويسيد ديگه تقريبا بايد بيخيال اين بشيد که يکي بياد کدتون رو گسترش بده ....

    خوب همه اينا رو گفتيم که بدونيم چرا بايد سعي کنيم کدمون تميز باشه ( راستي کد تميز و کد کثيف که ميگم لغت انگليسيش اصطلاحه توي برنامه نويسي)

    کد تميز نوشتن کهر زياد سختي نيست فقط کافيه يه سري نکات رو رعايت کنيم :read:

    بنابر اين ميريم سر اصل مطلب. اينکه چجوري بايد يک کد تميز بنويسيم :smile:


    1. استفاده از نام هاي معني دار

    يکي از چيزايي که واقعا کمک ميکنه يک کد تميز باشه اينه که براي متغير ها , توابع , کلاس ها .... از نام هاي معني دار استفاده کنيد. بهتره تا ميشه از کلمه کامل استفاده کنيد. مگر اينکه کلمه خلاصش خيلي معروف باشه.
    مثلا در مثال بالا به جاي اينکه PlusOfTwoNumber رو اينجوري خلاصه کنيم و بنويسيم ptn بنويسيم همون PlusOfTwoNumber تا کد تميز تر بشه. البته مثلا PlusOfTwoNumber رو ميشه به اين شکل هم نوشت که شايد بهتر هم باشه PlusTwoNum چون Num نسبتا چيز معروفي به نظر مياد Of هم زياد مهم نيست. اصلا بهتره زياد به گرامر دقت نکنيد. همينکه منظورو واضح برسونه کافيه.


    2. شتري بنويسيد !!

    نه اين توهين نيست :redface: اگه تو گوگل سرچ کنيد Camel Syntax يا Camel Case توي اولين نتيجه صفحه

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    رو مياره که يه توضيح کامل راجبه تاريخچه و .... توش هست. دقيق نميدونم اولين بار از کجا مرسوم شد ولي فکر ميکنم با اومدن زبان هاي سطح بالا و ويرايش گر هاي جديد اين اتفاق افتاد.
    ولي حالا چرا بش همچين اسمي دادند ؟
    دليلش به خاطر اينه که مثل اين جور نوشتن کوهان هاي شتر فراز و نشيب داره. براي مثال بجاي اينکه عبارت plus of two number رو به اين اشکال براي اسم تابع استفاده کنيم :
    plusoftwonumber
    plus_of_two_number
    ...
    به اين شکل استفاده ميکنيم : PlusOfTwoNumber
    در واقع کلمات رو با حروف کوچيک و بزرگ از هم جدا ميکنيم .
    اگه جاوا کار کرده باشيد يا C# احتمالا از اين چيزا زياد ديديد ( مثلا ()Console.WriteLine )
    من شخصا با اينکه حتي توابع و متغير هارو جدا ميکنم. به اين شکل که کلمه اول توابع و کلاس با حروف بزرگ شروع ميشه ولي کلمه اول متغير ها و شي ها با حروف کوچيک


    3. حتما درخت کاري کنيد !

    اگه از زبان هاي سطح بالا مثل C# , يا java يا ... استفاده ميکنيد احتمالا ديگه به اين بخش نيازي نداريد چون عموما ويرايش گر هاي اين زبان ها خودشون زياد اجازه آزادي عمل براي درخت نکاشتن نميدن ! البته مگه اينکه سراغ تنظيماتشون رفته باشيد. ولي اگه از زبان هاي مثل C++ استفاده ميکنيد حتما درختي نوشتن رو رعايت کنيد. چون مطمعن باشيد قطعا در جاهايي که از if ها يا ... تو در تو استفاده کرده باشيد به مشکل ميخوريد. خيلي وقتا کامپايلر ها دقيق نميگند کجا يک کروشه يا پرانتز کم گزاشتيد و اصلا ممکنه خودشون هم قاطي کنند و ارور هاي مثل ( To Many Error ) يا ... بدند که ديگه پيدا کردن مشکل خيلي سخت ميشه.
    براي مثال يه قسمت از کد بازي 2048 هست که کد کاملش رو از

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    ميتونيد ببينيد. کافيه يکي از کروشه ه ارو کم و زياد کنيد تا ارور هايي که ميده رو ببينيد :smile:
    يه نکته هم شايد بد نباشيه اينجا اشاره کنيم اينه خوب خيلي ها کاربرد Tab رو ميدونند ولي کاربرد Shift + Tab رو نه :smile:
    (راستي نميدونم درختي نوشتن رو از خودم در اوردم يا همچين چيزي هست. فکر کنم باشه)


    نمونه غير درختي :

    کد:
    for(int i=0; i<4; i++)
    {
    for(int j=0; j<4; j++)
    {
    for(int _j=0; _j<j; _j++)
    {
    for(int __j=0; __j<j; __j++)
    {
    if(__j<3)
    {
    if(tiles[i][__j] == EMPTY_TILE)
    {
    tiles[i][__j] = tiles[i][__j+1]; 
    tiles[i][__j+1] = EMPTY_TILE;
    moved=true;
    }
    else if((tiles[i][__j] == tiles[i][__j+1]) && !mergedTiles[__j+1])
    {	
    tiles[i][__j] *= 2;
    tiles[i][__j+1] = EMPTY_TILE;
    mergedTiles[__j] = true;
    moved=true;
    }
    }
    }
    }
    }
    }
    نمونه درختي :

    کد:
    for(int i=0; i<4; i++)
    	{
    		for(int j=0; j<4; j++)
    		{
    			for(int _j=0; _j<j; _j++)
    			{
    				for(int __j=0; __j<j; __j++)
    				{
    					if(__j<3)
    					{
    						if(tiles[i][__j] == EMPTY_TILE)
    						{
    							tiles[i][__j] = tiles[i][__j+1]; 
    							tiles[i][__j+1] = EMPTY_TILE;
    							moved=true;
    						}
    						else if((tiles[i][__j] == tiles[i][__j+1]) && !mergedTiles[__j+1])
    						{	
    							tiles[i][__j] *= 2;
    							tiles[i][__j+1] = EMPTY_TILE;
    							mergedTiles[__j] = true;
    							moved=true;
    						}
    					}
    				}
    			}
    		}
    	}

    4. هر شي نشان دهنده کلاسي باشد که از آن ساخته شده

    فرض کنيد کلاسي به نام Box داشته باشيم و قرار باشه 3 تا شي ديگه ازش تعريف کنيم. مثلا يه جعبه چوبي , سنگي , کاغذي
    بهتره سه جعبه رو به اين شکل تعريف کنيم تا بعدا هرجا ديديمشون بدونيم از چه کلاسي هستند :

    کد:
    Box woodBox;
    Box stoneBox;
    Box paperBox;
    5. ثابت و تعريف تعريف کنيد !

    حتما سعي کنيد جاهايي که از چيزي مثل عدد ثابت استفاده ميکنيد حتما از define يا اعداد ثابت استفاده کنيد.
    شخصا اگه از يه عدد ثابت بخام استاده کنم بيشتر از define استفاده ميکنم (البته اگر جاوا نباشه) چون اينطوري ديگه در هنگام اجرا رم هم اشغال نميشه (البته زياد فرقي نداره چون معمولا يه داده ثابت چيز زيادي از رم اشغال نميکنه) . اين پيشنهاد بيشتر شخصي بود يعني مثلا اگه قراره تو برنامه مدام از يه عدد ثابت مثلا 4 استفاده کنيد بهتره يک define براي اون تعريف کنيد. ولي يه پيشنهاد وِيژه هم دارم که شايد تو پروژه هايي مثل پردازش تصوير و ... که سرعت مهم باشه خيلي تاثير داره. اون اينکه اگه عدد ثابتتون حاصل از يک محاسبه باشه حتما محاسبه رو در يک متغير ثابت انجام بديد.
    فکر کنم يکم پيچيده شد.
    ببنيد اگه قرار بود از يه عدد ثابت مثلا طول پنجره استفاده کنيد ميتونيد به اين شکل اونو تعريف کنيد :


    کد:
    #define WINDOW_W 640
    ولي اگه قرار بود نسبت طول به عرض صفحه رو بدست بياريد اونو به اين شکل تعريف کنيد تا اگه قرار بود پشت سر هم روش استفاده بشه فقط يک بار حاصل تقسيم محاسبه بشه و از CPU زمان نگيره :

    کد:
    const float aspectRatio = 640/480;
    براي مثال کلا ميتونيد به اين شکل تعريف کنيد که خيلي بهتره و به راحتي قابل تغيره :

    کد:
    #define WINDOW_W 640
    #define WINDOW_H 480
    
    const float aspectRatio = WINDOW_W/WINDOW_H;
    6. نوشتن متغير با تعريف ها فرق دارد

    براي اينکه مشخص باشه يه چيز يک define هست يا نه ميتونيد همه define هارو با حروف بزرگ بنويسيد و بين کلمات با _ فاصله ايجاد کنيد
    مثلا ميتونيم يه define که يک اسم کتاب هست رو اينجوري تعريف کنيم :


    کد:
    #define ABAS_DAST_TALA_BOOK "Abas Dast Tala"
    7. کلا بين همه چيز فرق بگزاريد

    هرچي بيشتر بين اجزاي مختلف کد تفاوت باشه کد جالب تر ميشه (البته به شرطي که از حد نگزره )
    مثلا متغير هاي private کلاس رو اولش _ بزاريد (البته من خودم اينکارو معمولا نميکنم) :


    کد:
    private:
    	int _clickCounter;
    n. شرطي نشيد !

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

    -----------------------------------------------------------------------
    اگه خوشتون اومد صلواتي براي تعجيل در فرج آقا صاحب الزمان بفرستيد :smile:

    ان شاءالله اين پست به روز ميشود.
    غفلت از يار, گرفتار شدن هم داد
    از شما دور شدن, زار شدن هم دارد
    هرکه از چشم بي افتاد, محلش ندهند
    عبد آلوده شدن, خوار شدن هم دارد
    عيب از ماست, که هر سال نمي بينيمت چشم بيمار شده, تار شدن هم دارد ...
  2. #2
    2012/01/04
    101
    2

    پاسخ : چگونه يک کد تميز و قابل توسعه بنويسيم !

    پست اول به روز شد :read:
    غفلت از يار, گرفتار شدن هم داد
    از شما دور شدن, زار شدن هم دارد
    هرکه از چشم بي افتاد, محلش ندهند
    عبد آلوده شدن, خوار شدن هم دارد
    عيب از ماست, که هر سال نمي بينيمت چشم بيمار شده, تار شدن هم دارد ...
نمایش نتایج: از 1 به 2 از 2

موضوعات مشابه

  1. تعمير و تميز کردن چربي از روي مدار ميکسر صوتي
    توسط meelmeal در انجمن مدار چاپی (PCB)
    پاسخ: 1
    آخرين نوشته: 2014/10/14, 20:07
  2. شستن و تميز کردن زير ايسي ها
    توسط ((O-I-O)) در انجمن مدار چاپی (PCB)
    پاسخ: 33
    آخرين نوشته: 2014/07/28, 23:24
  3. PIC12 , PIC10 با چي کد بنويسيم؟
    توسط AliTabaie در انجمن میکروکنترلرهای PIC
    پاسخ: 8
    آخرين نوشته: 2014/02/25, 16:27
  4. چجوري تو لب ويو C يا baseic بنويسيم...؟؟؟
    توسط kenza1370 در انجمن Labview
    پاسخ: 8
    آخرين نوشته: 2012/02/16, 20:21
  5. مقاله: چگونه بنويسيم ربات؟
    توسط pesar.sabz.shad در انجمن رباتيك و مكاترونيك
    پاسخ: 0
    آخرين نوشته: 2011/05/18, 06:34

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •