PDA

View Full Version : سوال: قواعد برنامه نویسی



god.Is.786
سه شنبه 06 بهمن 1388, 21:49 عصر
سلام

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

مثلا قواعد نامگذاری,قواعد نوشتن متودها و کلاس ها، نحوه نوشتن کامنت ها و ...
(البته من در مورد نوشتن متد یا کلاس مشکلی ندارم بیشتر روی این تاکید دارم که چه جوری بنویسی که کد نوشته شده قشنگ تر و خواناتر و ساده تر بشه)

در ضمن چه جوری میشه یه کد رو که یکی دیگه نوشته تحلیلش کرد؟ باید خط به خط کد رو بخونی و اجرا کنی؟


ممنون
موفق باشید

hakelberfin
سه شنبه 06 بهمن 1388, 22:59 عصر
سلام دوست عزیز
اول از همه باید بگم که همه ی اینا سلیقه اییه و بسته به خود فرد و شرکت داره.
مثلا تو شرکت ما برای اینکه هر کسی از کد یه نفر دیگه سر در بیاره قوانینی رو درنظر گرفتیم
مثلا اسم همه عناصری که ایجاد میکنیم درست مثل کلاسشون نامگذاری می کنیم(یه کپی پیست ساده و سریع) مثلا


SqlConnection SqlConnection = new SqlConnection();

که هم خیلی سریعتره چون کپی پیست میکنیم و هم خوانایی بالایی داره
مقایسه کنید


SqlConnection sqlC = new SqlConnection();

کسی که میخواد برنامه ی شما رو بررسی کنه نوع تعریف اول خیلی بهتره.
یا مثلا ما برای پرکردن جدولامون از تابعی بنام FillDataGridView استفاده میکنیم.
یا خودمون از کنترل هایی که نوشتیم(مخصوصا TextBox ) جهت صحت اطلاعات ورودی استفاده میکنیم.
یا در هر فرم تابعی بنام ValidateForm() مینویسیم که صحت اطلاعات ورودی رو در صورت برگرداندن True تایید میکنه .
یا مثلا برای هر موجودیتی در دیتا بیس جدولی تهیه میکنیم حتی برای جنسیت ( خالی -مرد- زن )
یا برای هر عمل INSERT و UPDATE , DELETE از SP استفاده میکنیم و در SP تکراری بودن و وابستگی و ... رو چک میکنیم
یا در تولید نرم افزار بعد از تجزیه و تحلیل اول دیتابیسمون رو طراحی میکنیم.
خوب همه ی اینا بر حسب تجربه و سلیقه و قراردادیه .

gh-reza
چهارشنبه 07 بهمن 1388, 00:16 صبح
اسم متغیرها، توابع، و کلاسها رو با معنی و چند کلمه ای انتخاب کن.
اگه اسامی خیلی طولانی شد، از اختصار ( acronyms یا anonyms) استفاده کن و بالای تایع با توضیحات مشخص کن چه حرفی مربوط به چه کلمه ای هست.
توی اسامی چند کلمه ای متغیرها حرف اول کلمه اول رو کوچیک و حرف اول بقیه کلمات رو بزرگ انتخاب کن تا از توابع و کلاسها جدا بشه.
دلیل تعریف متغیر، محل و تابع استفاده کننده از اون رو با کامنت جلو یا بالای متغیر توضیح بده.
حتی الامکان توی هر سطر یه متغیر تعریف کن.
میتونی با یه اختصار نوع متغیر رو اولش مشخص کنی مثلا i برای متغیر int، یا lng برای long و...
نام توابع رو متناسب با عملشون انتخاب کن.
توی هر تابع فقط یک عمل مستقل انجام بده.
همه کارهای توابع رو پارامتریک انجام بده و hardcoding نکن.
عمل تابع، ورودیها، خروجیها، استثناهای ممکن در تابع و نحوه برخورد با اونها، توابع و کلاسهای استفاده کننده از آنها رو توسط توضیحات در بالای هر تابع بنویس.
توابع مرتبط رو توی یه کلاس و با نام معنی دار قرار بده.
توابع رو از عمومی به تخصصی بچین توی کلاسها و کلاسهای تخصصی تر با توابع تخصصی بتونن از کلاسهای عمومی تر ارث ببرن.
توی نام کلاسها و توابع چند کلمه ای، حرف اول تمام کلمات رو با حروف بزرگ مشخص کن.
میتونی نام کلاس رو با یک حرف C (بزرگ) شروع کنی که نشان دهنده کلاس بودن نام هست.
همینطور نام واسط رو با I و نام فضای نام رو با NS و...
سعی کن هر کلاس توی فایل جداگانه قرار بگیره و توی فضای نام مناسب با توضیحات اول فایل در مورد کلاس و انتظاراتی که از داریم و کارهائی که انجام میدهد یا خواهد داد.
سعی کن کلاسهای واسطهای عمومی رو پیاده سازی کنن و واسطها رو با دقت و وسواس زیاد طراحی کن تا اگه کدت رو خواستی تغییر بدی، لااقل واسطش ثابت بمونه و قابلیت حمل بیشتری داشته باشه.
برای هر بلوک حتی اگه شامل یک دستور باشه از {} استفاده کن و در { با کامنت کوتاهی مشخص کن مربوط به کدام دستور و } هست.
از داندانه گذاری برای کدهای تو در تو استفاده کن.
سعی کن طول توابع خیلی زیاد نباشه و کارها رو توابع کمکی بده.
از کلمات public، private، و Protected به موقع استفاده کن.
فرمولها و روابطی رو که محاسبه و کد میکنی توی یه فایل ورد کامل کامنت کن (همراه با روش تولیدشان)
و...

god.Is.786
چهارشنبه 07 بهمن 1388, 01:48 صبح
ممنون دوستان از پاسخ سریعتون


توی هر تابع فقط یک عمل مستقل انجام بده.
منظورتون اینه که مثلا من 3 تا جدول دارم برای insert کزدن واسه هر کدوم یه تابع جدا بنویسم؟



همه کارهای توابع رو پارامتریک انجام بده و hardcoding نکن.
اینو نفهمیدم....
میشه بیشتر توضیح بدین؟

اَرژنگ
چهارشنبه 07 بهمن 1388, 09:00 صبح
سلام

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

مثلا قواعد نامگذاری,قواعد نوشتن متودها و کلاس ها، نحوه نوشتن کامنت ها و ...
(البته من در مورد نوشتن متد یا کلاس مشکلی ندارم بیشتر روی این تاکید دارم که چه جوری بنویسی که کد نوشته شده قشنگ تر و خواناتر و ساده تر بشه)

در ضمن چه جوری میشه یه کد رو که یکی دیگه نوشته تحلیلش کرد؟ باید خط به خط کد رو بخونی و اجرا کنی؟


ممنون
موفق باشید

برایه یادگیری قواعد برنامه‌نویسی به کتابها و یا سایتهایه معتبر رجوع کنید.

استفاده از کپی و پیست جایی در برنامه‌نویسی ندارد.

روشهایه درست نامگذاری را از مراجع معتبر یاد بگیرید مثال: http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx
اینکه یک سازمان و یا گروه چی را مهم ارزیابی میکنند ممکن است که هیچ اهمیتی در جاهایه دیگر نداشته باشد. بنا بر حرفهایه هیچ کسی بدانه دلیل و مرجع از پیروی از روشهایی که بنا بر کیف شخصی بازگو میشند پرهیز کنید (از جمله اینجانب).
بعد از یک هفته پژوهش من مطمعن هستم خود شما میتوانید از مراجع معتبر برایه یادگیری ما مفاهیمی را مثال بزنید.
این طرز فکر که برنامه‌نویسی به سلیقه شخصی است کاملاً اشتباه است، مانند اینکه بگیم مهندسی ساختمان بر سلیقه شخصی قرار دارد و هر کی از هر روشی که دلش بخاد میتونه استفاده کند.
کتاب Code Complete 2 را توصیه میکنم.
موفق باشید.

Mr.Moghadam
پنج شنبه 08 بهمن 1388, 00:43 صبح
سلام

چند وقت پیش تو نت (نمیدونم کدوم سایت ) یه pdf گیر اوردم که حالب بود و در ضمینه سوال شما بود که از لینک زیر میتونین دانلود کنین...

gh-reza
پنج شنبه 08 بهمن 1388, 19:18 عصر
ممنون دوستان از پاسخ سریعتون


منظورتون اینه که مثلا من 3 تا جدول دارم برای insert کزدن واسه هر کدوم یه تابع جدا بنویسم؟



اینو نفهمیدم....
میشه بیشتر توضیح بدین؟

نه میتونی از پارامترهای مناسب استفاده کنی (اگه میشه)، یا اگه کدهات طولانی و متفاوته و همسان نیست تا از پارامتر استفاده کنی جداگانه بنویس، ولی اگه طول کد کمه و موضوع مرتبطه و باعث گنگ شدن برنامه نمیشه از یک تابه استفاده کن. در کل نمیشه یه نسخه برای همه توابع و برنامه ها صادر کرد و برنامه نویس نسبت به مسئله میتونه بهترین تصمیم رو بگیره. البته این کار هم مثل هر کار دیگه ای به تجبربه، تمرین و مطالعه و سلیقه نیاز داره. منظور من بیشتر به این بود که اگه برای مراحل مختلفی از حل یه مسئله از الگوریتمهای متفاوتی استفاده میکنید، بجای نوشتن کل کد توی یه تابع، کارها رو بشکنید به توابع مناسب و اونها رو فراخوانی کنید. با این کار هم خواندن کد، هم اصلاح، و هم اشکال یابیش راحت تر میشه.

در مورد سوال دوم یه مثال میزنم.
یک کد بد


// A bad hard coded class
class Test
{
public void WriteToFile()
{
// file name hard coded and we cant use this function in
// different situations.
using(StreamWriter sw = File.CreateText("c:\\test.txt"))
{
// a string "test" hard coded and is not reliable
sw.WriteLine("test");
}
}
public string ReadFromFile()
{
// file name hard coded and we cant use this function in
// different situations.
using(StreamReader sr = File.OpenText("c:\\test.txt"))
{
FileContext = sr.ReadToEnd();
}
}
public static void Main(string args[])
{
WriteToFile();
string test = ReadFromFile();
MessageBox.Show(test ,"Info",MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}

یک کد خوب


// A Good class
class Test
{
public void WriteToFile(strign szFileName,string szInfo)
{
// file name hard coded and we cant use this function in
// different situations.
using(StreamWriter sw = File.CreateText(szFileName))
{
// a string "test" hard coded and is not reliable
sw.WriteLine(szInfo));
}
}
public string ReadFromFile(string szFileName)
{
// file name hard coded and we cant use this function in
// different situations.
using(StreamReader sr = File.OpenText(szFileName))
{
FileContext = sr.ReadToEnd();
}
}
public static void Main(string args[])
{
WriteToFile("c:\\test.txt","test");
string test = ReadFromFile("c:\\test.txt");
MessageBox.Show(test ,"Info",MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}

user68
پنج شنبه 22 بهمن 1388, 13:35 عصر
با سلام
میشه برای من توضیح بدید این کد دقیقا چی کار میکنه؟



if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '.' && e.KeyChar != '8')
e.KeyChar = '\0';


با تشکر