PDA

View Full Version : سوال: آصول برنامه نویسی با C++



MIDOSE
پنج شنبه 13 فروردین 1388, 05:39 صبح
نمی دونم سوالم را در جای درستی دارم مطرح می کنم یا نه. من با اصول برنامه نویسی سی پلاس پلاس در حد یک مبتدی آشنایی دارم ولی سوالی که برایم پیش امده این است که واقعا چه چیز هایی باعث می شه که برنامه ی دو برنامه نویس که با یک زبان برنامه ی خود را نوشته اند بسیار تفاوت کند منظور اصلیم را بدین گونه بیان می کنم

باگ چیست و به چه کدی حرفه ای و چه کدی غیر حرفه ای می گویید یعنی معیار حرفه ای یا غیر حرفه ای بودن برای شما چیست. ممنون می شم نمونه کدی را برای نشان دادن این تفاوت بنویسید. چگونه می توانم سطح کد نویسی خود را بالا ببرم قطعا تمرین موثره ولی هزار بار نوشتن دستور for به تنهایی موثر نیست.

با تشکر فراوان

Sundown
پنج شنبه 13 فروردین 1388, 11:16 صبح
با سلام و پوزش فراوان به علت سخن در محضر اساتید :
چند وقت پیش یک برنامه مدیریت نامه و پاسخ و ارسال خودکار جواب نامه برای سازمان بنیاد شهید شیراز نوشتم ( البته با یک زبان سطح بالا ) و این برنامه مثل ساعت میکرد و از نظر خودم و صاحب کارانم هیچ ایرادی نداشت ولی وقتی آن را به استاد برنامه نویسی ام نشان دادم و نظر او را جویا شدم در کمال ناباوری به من این جمله را گفت : " کدهات حرفه ای نیست و هیچ یک روی اصول برنامه نویسی نیستند ":متعجب: بسیار ناراحت شدم و گفتم یعنی چه کدهات حرفه ای نیستند ؟:عصبانی: جوابی را که داد میگویم شاید بدردتون بخوره :
رعایت نکردن تورفتگی ها
عدم نام گذاری مناسب برای متغیر ها ( تقریبا اسم هر جک و جونوری رو روی متغیر ها گذاشته بودم )
عدم رعایت بهینگی توی کدها مثلا توی یک بانک با استفاده از حلقه سرچ میکرد !!!
بر هم زدن عادت کاربر ( مثلا منوی Edit رو قبل از منوی فایل گذاشته بودم )
و وجود باگ فراوان
اگر چه برنامه رو ویرایش کردم و دوباره تحویل دادم ولی تجربه ی خوبی برام شد

یک برنامه نویس حرفه ای توی کدش خیلی کم از لیترال ها استفاده میکنه و بجای اون لیترال را در متغیری ذخیره و در همه جا ازش استفاده میکنه. با این کار اگر روزی روزگاری خواست اون لیترال رو تغییر بده فقط یک جا اون رو عوض میکنه ( این مسئله در کدهای بزرگان به خوبی دیده میشه )
یک برنامه نویس حرفه ای آینده نگر هست و به جای حال به آینده نگاه میکنه ( مثلا وقتی میخواد ویندوز بنویسه نمیآد توابع رو توی سورس برنامه به کار ببره بجاش توابع رو توی یک سری فایل ذخیره میکنه تا 5 سال دیگه که یکی خواست بیاد برای ویندوز برنامه بنویسه بتونه از این توابع به راحتی استفاده کنه مانند توابع API ویندوز )
البته کد حرفه ای یک معنی دیگه ای هم داره که فکر کنم اون منظور شما نباشه ( کد حرفه ای به لحاظ استفاده از دستوراتی که همه کس باهاش آشنا نیستند مانند کدهای لینوکس )
یک برنامه نویس حرفه ای دستورات برنامش رو قرو قاطی یا به عبارتی Spagetti نمینویسه بلکه وظایف برنامه رو به چندین دسته تقسیم میکنه و برای هر قسمت تابع یا احتمالا کلاسی مینویسه
برنامه نویس حرفه ای برای اکثر خطهای کدش و مهمتر از اون برای تمام توابع توضیح مینویسه
برنامه نویس حرفه ای تو رفتگی های کدش رو حتما رعایت میکنه
برنامه نویس حرفه ای تمام زوایا و تمام حالت های خاص رو در نظر میگیره ( مثلا برای ساخت یک ماشین حساب ساده دقت میکنه که خوب اگر تقسیم بر صفر به وجود اومد چی بشه یا ... )
یک برنامه نویس حرفه ای از تمام امکانات زبان مورد استفاده استفاده میکنه تا کدهای کمتر و با کلاس تری بنویسه ( مثلا خود من VB کار کرده بودم بعد رفتم سی شارپ یاد گرفتم و تا مدتها همون دستورات VB رو فقط در قالب سی شارپ در میآوردم و مینوشتم )
یک برنامه نویس حرفه ای سعی میکنه از حافظه درست و به جا استفاده کنه ( مثلا برای ذخیره یک عدد دو رقمی نیاد از Double , Float استفاده کنه )
یک برنامه نویس خوب کسی هست که به موقع حافظه ها رو آزاد کنه
از همون اول پیش بینی به وجود اومدن خطای منطقی رو میکنه ( البته کامپایلر های زبان هایی مثل جاوا یا سی شارپ در این موارد خیلی سخت گیر هستند اما زبان هایی مثل سی و سی پلاس پلاس این کار به عهده خود برنامه نویس هست مثلا بعد از تعریف هر متغیر اون را با یک لیترال پر میکنند تا خطای منطقی استفاده از Memory Trash ها پیش نیاد )
یک برنامه نویس حرفه ای متغیر ها رو با حرف کوچک و ثوابت رو با حرف بزرگ و توابع و کلاس ها رو با استفاده از حرف بزرگ در اول و بقیه با حرف کوچک منویسه ( این موارد اگر چه پیش پا افتاده هست اما در کدهای بیش از 100 هزار خط همین مسائل به برنامه نویس کمک میکنن که کنترل برنامه از دستش در نره )

مطالب زیادی هست که باید رعایت بشن که الان همین ها یادم بود
در ضمن این نکات بسیار بسیار مهمه :
ریچارد استالمن : اگر کدی که در نوشتن آن ماهرید 10 بار بنویسید 10 مطلب جدید یاد میگیرید
اریک ریموند : همه میتوانند کدی بنویسند که کامپیوتر آن را درک کند ولی یک برنامه نویس حرفه ای کدی مینویسد که برای همکارانش قابل درک باشد

البته گفتم کدهایی که سطح بالایی داشته باشند مثل کدهای یک سیستم عمل حتی اگر این موارد را هم رعایت نکرده باشند باز هم حرفه ای هستند ولی آن حرفه ای با این حرفه ای فرق دارد

این ها نظرات من بود و من به یک همچین کدی حرفه ای میگویم. اگر اشتباه میکنم و یا چرند گفتم پیشاپیش از محضر اساتید عذر خواهی میکنم:افسرده:

باگ چیست ؟
همان طور كه مي‌دانيد، به هر نقص يا ايراد يك نرم‌افزار يا برنامه كامپيوتري باگ مي‌گويند. باگ از نظر لغوي يعني حشره كوچك و در تاريخ مهندسي نرم‌افزار گفته مي‌شود اين اصطلاح را اولين بار Grace Hoper، خانمي كه در دانشگاه هاروارد مشغول تحصيل و تحقيق در رشته كامپيوتر بود، به كار برده است. او كه در حال كار با كامپيوترهايMark II و ‌Mark III بود، يك‌بار با مشكل مواجه شد و تكنيسين‌هايي كه براي بررسي مشكل و تعمير كامپيوتر، آن را باز كرده بودند سوسكي را پيدا كردند كه وارد دستگاه شده بود و آن را از كار انداخته بود.

البته در حقيقت اين واژه را اولين بار همان تكنيسين‌هايي كه اين حشره را داخل دستگاه يافته بودند، طي يادداشتي (اولين دليل واقعي باگ / ايراد برنامه پيدا شد) به شوخي به كاربرده بودند. البته اين تكنيسين‌ها يا خانم هوپر اولين كساني نبودند كه از اين واژه براي اشاره به يك ايراد در دستگاهي استفاده مي‌كردند. آن‌ها صرفاً براي نخستين بار از اين اصطلاح در دنياي كامپيوتر استفاده كردند، ولي اعتقاد بر اين است كه اصطلاح Debugg توسط همين افراد ابداع شد.

موضوع باگ يكي از سرفصل‌هاي مهم رشته مهندسي نرم‌افزار است. از اين رو متون و كتاب‌هاي مفصلي در زمينهDebugging يا اشكال‌زدايي از نرم‌افزار و متدهاي آن تأليف شده است و همچنان ادامه دارد. برنامه‌نويسان تازه‌كار معمولاً از اين شاخه مهندسي نرم‌افزار گريزانند و اميدوارند برنامه‌هايي بنويسند كه به قدري خوب باشد كه اصلاً كارش به اشكال زدايي نكشد، ولي پس از دو سه سال كار حرفه‌اي در اين زمينه سرانجام تسليم‌ مي‌شوند و آشنايي با اصول علمي اشكال زدايي برايشان به يك ضرورت تبديل مي‌شود؛ مگر اين‌كه نخواهد به اصول اخلاقي و حرفه‌اي مهندسي نرم‌افزار متعهد باشند و از اين‌كه برنامه‌هاي ساخت آن‌ها پر از انواع باگ و ايراد باشد، باكي نداشته باشند، اما برطرف كردن باگ‌ها براي بسياري از برنامه‌نويسان غيرآماتور يكي از قسمت‌هاي چالش برانگيز و لذت بخش كار است و تقريباً مثل حل كردن معما است. !!!

Nima_NF
جمعه 14 فروردین 1388, 16:22 عصر
باگ انواع مختلفی دارد، بعضی های بسیار خطرناک هستند و بعضی ها کم خطر.

برای مثال دو مورد پر خطر آن، تقسیم بر صفر:



int a = 10;
int b = 0;

cin >> b;

int ab = 1/(a - b);
cout << ab;

در مثال فوق شما فرض کنید عدد a بعد از انجام یکسری محاسبات معادل 10 می شود و کاربر هم عدد 10 را در ورودی وارد می کند، انگاه می خواهد یک عدد اعشاری بدست بیاورد که اشتباها تقسیم بر صفر می شود و برنامه crash می کند.


و اشتباه در کار با اشاره گر ها و تخصیص حافظه :



char * str1 = new char[20];
char * str2 = new char[9]; // Bug
char * str3 = new char[40] = "123456789123456789-ABCDE";

strcpy(str1, "this is a test");
strcpy(str2, str3); // Bug

cout << str1 << endl;
cout << str2 << endl ;
cout << str3 << endl ;

delete [] str2; // Bug

در مثال فوق شما به str2 تعداد 9 خانه حافظه اختصاص داده اید در حالی که بدون توجه رشته str3 با طول 40 خانه را به آن کپی می کنید و معلوم نیست بقیه آن را در کدام قسمت از حافظه بر روی حافظه کدام برنامه یا ویندوز کپی کرده اید. این خطا بسیار خطرناک هست واگر چنین اشتباهی مثلا در Internet Explorer رخ دهد هکرها از طریق آن می توانند کامپیوتر شما را هک کنند و هر کدی را که می خواهند به آن تزریق کنند. (مثلا در ابتدای انتشار ویندوز ویستا در صورتی که windows recording را باز می کردید و وارد یکی ار تنظیمات می شدید چنین موردی پیش آمد)

cups_of_java
جمعه 14 فروردین 1388, 19:41 عصر
برای این که همه این حرف ها رو در مجموعه های جمع شده ببینی غیر از اصول زیبا و خوانا نویسی (Code Conventions) می تونی به Idiomها در هر زبان مراجعه کنی. (گوگل کن) کتاب های زیادی هم هست که درست نوشتن رو یاد می ده از کتاب های مقدماتی اشنایی با برنامه نویسی گرفته تا کتاب جالبی مثل Implementation Patterns از آقای Kent Beck که توصیه می کنم پیداش کنی و بخونیش. هم الکترونیکیش هست هم تو بازار فکر کنم پیدا شه.

pswin.pooya
جمعه 14 فروردین 1388, 21:17 عصر
توی یه کلام

برنامه نویس حرفه ای برنامه نویسی هستش که کدش قابلیت انعطاف بالا رو داشته باشه.

توضیح بیشتر:
اصولا برنامه نویس حرفه ای جوری کد میزنه که با کمترین کد ممکن بهترین نتیجه رو بگیره و اگه لازم باشه یک روال خاص برنامه رو عوض کنه برنامه ش کمترین تغییر رو متحمل میشه. یه برنامه نویس حرفه ای فقط نباید یه کدر حرفه ای باشه اون باید بتونه در عین حال بهترین دیزاین ها رو در نظر بگیره.

اصولا همه برنامه نویسها بعد از یکی دو سال کار با یک محیط یک یکسان کم کم پخته میشن و کم کم به برنامه نویسهای حرفه ای تبدیل میشن ولی این یه اصل نیستش من اساتید دانشگاهی رو میشناسم که با تجربه 10 بیست ساله ای که دارن حتی نمی تونن یه کد درست و حسابی بزنن.

MIDOSE
شنبه 15 فروردین 1388, 00:37 صبح
با تشکر از همه ی دوستان خیلی خوب بود و من قانع شدم ولی یک سوال دیگه آیا برنامه نویسی که با الگوریتم هایی که باعث افزایش کارایی برنامه می شوند آشنایی نسبتا کاملی داشته باشه(البته هیچ وقت کامل کامل نیست) را هم می تونیم یک حرفه ای بگیم البته من هنوز خیلی مبتدیم ولی برام سوال شد و این که دوستانی که خودشون C++ را برای استفاده در برنامه های تجاری به کار می برند چند درصد از الگویتم ها استفاده می برند(منظوزرم الگوریتم های بهینه است).
بازم ممنون

cups_of_java
شنبه 15 فروردین 1388, 10:07 صبح
اصولا برنامه نویس حرفه ای جوری کد میزنه که با کمترین کد ممکن بهترین نتیجه رو بگیره و اگه لازم باشه یک روال خاص برنامه رو عوض کنه برنامه ش کمترین تغییر رو متحمل میشه. یه برنامه نویس حرفه ای فقط نباید یه کدر حرفه ای باشه اون باید بتونه در عین حال بهترین دیزاین ها رو در نظر بگیره..


کمترین کد همیشه بهترین و منعطف ترین کد نیست.

cups_of_java
شنبه 15 فروردین 1388, 10:11 صبح
با تشکر از همه ی دوستان خیلی خوب بود و من قانع شدم ولی یک سوال دیگه آیا برنامه نویسی که با الگوریتم هایی که باعث افزایش کارایی برنامه می شوند آشنایی نسبتا کاملی داشته باشه(البته هیچ وقت کامل کامل نیست) را هم می تونیم یک حرفه ای بگیم البته من هنوز خیلی مبتدیم ولی برام سوال شد و این که دوستانی که خودشون C++ را برای استفاده در برنامه های تجاری به کار می برند چند درصد از الگویتم ها استفاده می برند(منظوزرم الگوریتم های بهینه است).
بازم ممنون

بحث طراحی الگوریتم های بهینه موضوع دیگه ایه! تو کار های تجاری کمتر این موضوع مطرحه! ولی مواردی هم هست که افراد باید دید درستی از الگوریتم ها داشته باشند تا بتونن کد های کارامد و بهینه برای انجام یک کار بنویسند.
در خیلی موارد ایم الگوریتم ها از قبل نوشته شدند و در قالب کتابخانه های بهینه برای استفاده موجود هستند.

Sundown
شنبه 15 فروردین 1388, 16:43 عصر
ببین یک مثال بسیار ساده میزنم تا دقیقا متوجه بشی من به چه کدی حرفه ای میگم :
فرض کن میخوای یک دیکشنری بنویسی یک راه ساده این هست ( مثلا به زبان ویژوال بیسیک )


if text1.text="Cat" then Text2.text="گربه"
if text1.text="Cow" then text2.text="گاو"
if text1.text="Car" then text2.text="اتوموبیل"
.
.
.

این یک راه هست و بعد از اجرا مثل ساعت کار میکنه. هیچ عیبی هم نداره . ممکنه 2 ملیون کلمه رو هم پوشش بده ولی این کد یک کد بچگانه هست
ایراد ها :
آیا کسی میتونه یک کلمه جدید به این بشناسونه ؟
اگر دو روز دیگه خواستی یک کلمه رو بهش اضافه کنی چی ؟
اگر چهار روز دیگه خواستی کاری کنی که این دیکشنری کلمات فرانسوی رو هم پوشش بده چی ؟
حالا انگلیسی به فارسی رو ساختی اگر خواستی فارسی به انگلیسی رو هم بسازی چی ؟
اگر خواستی امکان آپدیت به برنامه بدی چی ؟
اگر کلمات بقدری زیاد شد که سرعت پایین اومد چی ؟
و ده ها مشکل دیگه
ولی یک برنامه نویسی خوب ابتدا کلمات رو توی یک بانک ذخیره میکنه و بعد با اس کیو ال روشون کار میکنه
این مشکلات توی برنامه های بزرگ بیشتر خودش رو نشون میده با این تفاوت که توی توی یک برنامه 50 هزار خطی هیچ راهی جز تخریب پروژه و نوشتن برنامه از نو باقی نمیمونه

مثلا برنامه نویس های یک سیستم عامل طوری اون رو هوشمندانه مینویسند که اگر 5 روز دیگه توش یک باگ پیدا شد با یک آپدیت مشکل حل بشه و هیچ دستی هم به کد نمیزنن ( چون محصول باگ دار رو فروختن نمیتونن بگن آقا بیارینش یک باگ پیدا کردیم !!! )