توصیه‌های برنامه‌نویسی در زبان C: استفاده‌ی همیشگی از بلاک برای محتوای ساختارهای کنترلی

توصیه می‌شه که همیشه از بلاک برای محتوای ساختارهای کنترلی استفاده کنید؛ یعنی همیشه از یک‌جفت آکولاد برای if، else، for، while، و do استفاده کنید؛ حتی اگر فقط یک خط داخل بلاک قرار بگیره و حتی اگر هیچ خطی داخل بلاک، وجود نداشته باشه! خلاصه ایده‌ی اساسی اینه که تلاش کنیم تا هیچ‌وقت، آکولادها رو جا نندازیم. هیچ شکی نیست که این مسائل، خیلی سلیقه‌ایه؛ اما این توصیه، یه دلیل خیلی مهم داره: زمانی که بخوایم محتوای ساختار کنترلی رو تغییر بدیم و خطوطی رو کم یا زیاد کنیم، دیگه این امکان وجود نداره که آکولادها رو جا بندازیم و ناخواسته، روال برنامه رو تغییر بدیم؛ اتفاقی که برای اغلب ما، اصلاً ناآشنا نیست!

همین پاراگراف اول برای متن این مقاله کافیه و اگه نکته رو گرفته‌اید، می‌تونید باقی این مقاله رو نگاه نکنید؛ چون خیلی مثال‌ها و ساختارهای تکراری داخلش هست! اما به‌هرحال در ادامه‌ی مقاله، از هر ساختاری که به ذهن می‌رسه، یه مثال آورده‌ایم تا اصلاحاتی رو که پیشنهاد می‌شه، خیلی واضح‌تر ببینیم.

توصیه می‌شه که به جای ساختار

if(expression)
	/* statement */

از این ساختار استفاده کنیم:

if(expression)
{
	/* statement */
}

حتی اگر ترجیح شما بر اینه که if خودتون رو داخل یه خط بنویسید، مثل کد زیر:

if (expression) /* statement */

پیشنهاد می‌شه که همون یه خط رو هم با استفاده از بلاک و به شکل زیر بنویسید:

if (expression) { /* statement */ }

همین نکته درباره‌ی if و else هم می‌تونه رعایت بشه و به‌جای نوشتن کدی مثل

if(expression)
	/* statement 1 */
else
	/* statement 2 */

یا

if(expression) /* statement 1 */
else /* statement 2 */

می‌شه که کد مرتب‌تر

if(expression)
{
	/* statement 1 */
}
else
{
	/* statement 2 */
}

یا

if(expression) { /* statement 1 */ }
else { /* statement 2 */ }

رو نوشت.

برای حلقه‌های for هم دقیقاً همین کار رو توصیه می‌کنیم. به‌جای نوشتن کدی مثل

for(uint32_t i = 0; i < count; i++)
	/* statement */

یا

for(uint32_t i = 0; i < count; i++) /* statement */

پیشنهاد می‌شه که ساختار کنترلی رو به‌شکل

for(uint32_t i = 0; i < count; i++)
{
	/* statement */
}

یا

for(uint32_t i = 0; i < count; i++) { /* statement */ }

بنویسیم.

مشابه همین مثال‌ها رو برای حلقه‌ی while هم نشون می‌دیم. پس توصیه می‌کنیم که به‌جای نوشتن حلقه‌های while به‌شکل

while(expression)
	/* statement */

یا

while(expression) /* statement */

از بلاک استفاده کنیم و حلقه رو به‌شکل

while(expression)
{
	/* statement */
}

یا

while(expression) { /* statement */ }

بنویسیم.

در نهایت، برای حلقه‌ی do هم دقیقاً می‌شه به‌همین‌صورت عمل کرد و به‌جای نوشتن کدی شبیه

do
	/* statement */
while(expression);

یا

do /* statement */ while(expression);

یه کد تروتمیزی مثل

do
{
	/* statement */
} while(expression);

یا

do { /* statement */ } while(expression);

رو نوشت.

جمع‌بندی

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