أسلوب مسافة بادئة

في البرمجة، يعد أسلوب المسافة البادئة (بالإنجليزية: indent style) هو عرف يحكم المسافات البادئة لوحدات تخزين البيانات إليكترونيا (بلوكات) الخاصة بالشفرة لنقل هيكل البرنامج. هذا المقال يتناول بصورة كبيرة سي (لغة برمجة) وكل ما ينحدر منها، ولمكن يمكن تطبيقه (إلى حد كبير) على معظم لغات البرمجيات الأخرى (خاصة تلك الموجودة بعائلة الأقواس المجعدة). ويعد أسلوب المسافة البائدة هو أحد خواص البرمجة.

ولا تعد المسافة البادئة أحد متطلبات لغات البرمجة. بل يقوم المطورون باستعمال المسافات البادئة فقط لتوصيل هيكل أو بنية برامجهم للقراء من البشر. بوجه خاص، تستخدم المسافات البادئة لإظهار العلاقة بين مقومات تدفق الضبط مثل الظروف أو الحلقات والشفرة الموجودة داخلها وخارجها. ومع ذلك تستعين بعض لغات البرمجة (مثل بايثون والأوكام) بالمسافة البادئة لتحديد الهيكل بدلا من استخدام الأقواس أو الكلمات الرئيسية.

وعادة يكون حجم المسافة البادئة مستقلا عن الأسلوب. استعانت العديد من البرامج السابقة بمفاتيح التاب tab على لوحة المفاتيح للمسافة البادئة، من أجل التبسيط والحفظ في حجم ملف مصدري. وبوجه عام يرى محرري يونكس التاب مكافئة لثماني حروف، بينما بيئات ماكنتوش ومايكروسوفت ويندوز تحددها في أربعة فقط مما يخلق نوعا من الارتباك حين تنتقل الشفرة للأمام والخلف. ويستطيع محرري البرمجة المعاصرين غالبا تحديد أحجام اعتباطية للمسافات البادئة وسوف يقومون بإدراج تركيبة ملائمة من المساحات الفارغة والتاب. وبالنسبة لروبي (لغة برمجة) يتم استخدام مسافتين فراغيتين لكل مسافة بادئة في العديد من لغات برمجة شل وبعض أشكال تنسيقات لغة رقم النص الفائق.

وتعد مشكلة استخدام المسافات الفارغة أو التاب جدلا مستمرا في مجتمع البرمجة. بعض المبرمجين مثل جيمي زاوينسكي[١] يشعرون بأن المسافات تزيد من وظائفية المنصات المتبادلة أكثر من التاب، وهناك آخرين [من؟] يعتقدون العكس، أن التاب الصلبة تزيد من وظائفية المنصات المتبادلة.

يوجد عدد من برامج الكمبيوتر التي تقوم تلقائيا بتصحيح أساليب المسافات البادئة وأيضا طول التاب. من أشهرها برنامج إندنت، وهو بنرامج مدرج بالعديد من نظام تشغيل شبيه يونكس. هذه البرامج تعمل بصورة أفضل لكل من يستخدم أسلوب المسافة البادئة بالقرب مما يعتبر "أمرا لائقا" من جانب مبرمجيها وهم هؤلاء الذين يستخدمون أساليب أخرى سيصبحون أكثر إحباطا. علاوة على ذلك، تم تحديث برنامج إندنت مرة واحدة فقط خلال السنوات الست السابقة وهو لا يعمل جيدا مع لغة سي بلس بلس أو جي إن يو وهي لغات ممتدة من لغة السي.

أسلوب كيه آند آر

سمي أسلوب كيه آند آر بهذا الاسم لأنه كان يستخدم في كتاب كيرنيجهان ودينيس ريتشي "لغة البرمجة سي"، وهو يستخدم أيضا في السي [بحاجة لمصدر]. وهو أقل شيوعا بالنسبة للغات السي ++ (لغة برمجة) وسي شارب ولغات أخرى. وهو يحتفظ بأول قوس مفتوح على نفس السطر الموجود به بيان التحكم ليضع مسافة بادئة قبل هذه البيانات الموجودة بين الأقواس ويضع قوس الإغلاق على نفس مستوى المسافة البادئة كثل بيان التحكم (في سطر خاص به). ومع ذلك يتم وضع الوظائف بين الأقواس بشكل مختلف عن البيانات، القوس الوظيفي المفتوح يوضع عند السطر الذي يلي التصريح، على نفس مستوى المسافة البادئة كالتصريح. وذلك نظرا لأنه في لغة السي الأصلية تحتاج أنماط النقاش لأن يتم التصريح عنها في السطر اللاحق، بينما حين لا يكون هناك أي نقاشات ضرورية، لن يظهر القوس المفتوح على نفس السطر مع التصريح الوظيفي. القوس المفتوح لتصريحات الوظائف تعد استثناءا للقاعدة الأساسية.

<source lang=c> int main(int argc, char *argv[]) {

 ...
   while (x == y) {
       something();
       somethingelse();
       if (some_error)
           do_correct();
       else
           continue_as_usual();
   }
   finalthing();
 ...

} </source>

النسخة :1TBS

مؤيدي هذا الأسلوب يشيرون إليه أحيانا باسم "أسلوب القوس الحقيقي الواحد" (وتكتب اختصارا 1TBS أو OTBS) بسبب المجموعة السباقة للسي (بالرغم من أن مؤيدي الأساليب الأخرى كانوا يشتهرون باستخدام لغات قوية مثلها). الشفرة المصدرية يونكس نواة (نظم تشغيل) تكتب بهذا الأسلوب.

في هذا الأسلوب تمون المقومات التي تسمح بإدخال سطور شفرات جديدة في أسطر منفصلة، أما تلك التي تمنع الإدخال تكون في سطر واحد منفرد. هذا المبدأ يتعزز بوضع أقواس على كل كلمة if, else, while وما شابه – حتى أدوات الشرط ذات السطر الواحد- بحيث يكون إدخال سطر جديد من الشفرة في أي مكان "آمنا"

من مميزات هذا الأسلوب هي أن بداية كل قوس لا تتطلب سطرا إضافيا بنفسها، أما قوس النهاية فينتهي بالبيان الذي ينتمي إليه من الناحية المفاهيمية. أما من عيوب هذا الأسلوب هي أن قوس النهاية للبلوك يتخذ سطرا كاملا بنفسه والذي يمكن حله بصورة جزئية في بلوكات if/ else وبلوكات do/while:

<source lang=c> //...

   if (x < 0) {
       printf("Negative");
       negative(x);
   } else {
       printf("Non-negative");
       nonnegative(x);
   }

</source>

وبالرغم من أن هذا الأسلوب يمكن أن يجعل من الصعب مسح أي شفرة مصدرية تلفازيا لقوس الافتتاح لأي بلوك، وليس من المعتاد دائما أن يكون قوس الافتتاح هو القوس الشيق ولكن بيان التحكم الذي عرف هذا البلوك هو كذلك. من السهل العثور على بداية البلوك بتحديد موقع أول سطر أعلى قوس الإغلاق الذي يتم تحديده بمسافة بادئة بنفس المستوى.

وبينما يتم كتابة برنامج جافا (لغة برمجة) غالبا بأسلوب أولمان أو بأساليب أخرى، فإن هناك هيكل محدد من شفرة جافا (لغة برمجة) يستعين بنسخة ثانوية من أسلوب كيه آند آر حيث يكون قوس الافتتاح على نفس سطر الدرجة أو تصريح الطريقة، وذلك غالبا لأن إرشادات أسلوب صن ميكروسيستمز الأصلية [٢][٣][٤] استعانت بأسلوب كيه آند إيه ونتيجة لذلك فإن معظم شفرات المصادر المعياريى لجافا إيه بي آي تكتب بهذا الأسلوب. كما أنه أسلوب شائع في المسافات البادئة لكل من أكشن سكربت وجافا سكريبت بالاشتراك مع أسلوب أولمان.

كما يجب أن نذكر أن لغة البرمجي سي لا تحدد بشكل واضح هذا الأسلوب بالرغم من أننا نتابعها بصورة مستمرة عبر الكتاب. ومن الجدير بالذكر من هذا الكتاب :

موقع القوس أقل أهمية، بالرغم من أن الأشخاص لديهم معتقدات عاطفية. لقد اخترنا واحدا من عدة أساليب شائعة متنوعة. اختر أسلوبا يناسبك ثم استخدمه باستمرار.

أسلوب أولمان

تم تسمية أسلوب أولمان باسم إريك أولمان. وهو في الكثير من الأحوال يشار إليه باسم أسلوب المعهد القومي الأمريكي للتنميط "[٥] لأنها تستخدم في المستندات التي تصف معيار السي لإيه إن سي آي (الذي تم اتباعها لاحقا كمعيار عالمي للأيزو سي (لغة برمجة).[٦] كما تعرف ايضا أحيانا باسم "أسلوب بي إس جي" منذ كتب أولمان العديد من الاستخدامات توزيعة برمجيات بيركلي (بالرغم من أنه لا يجب خلطه مع أسلوب "بي إس دي كيه إن إف" المختلف تماما، انظر بالأسفل). مؤيدو هذا الأسلوب غالبا ما يستشهدون باستخدامه بإيه إن سي آي وفي معايير أخرى كمبرر لاتباعه.

هذا الأسلوب يضع القوس المرتبط ببيان الضبط على السطر التالي، مع وضع مسافة بادئة على نفس المستوى من بيان التحكم. البيانات بين هذه الأقواس يتم وضعها على مسافة بادئة في المستوى التالي.

<source lang=c> while (x == y) {

   something();
   somethingelse();

}

finalthing(); </source>

هذا الأسلوب شبيه بالمسافات البادئة القياسية المستخدمة بواسطة باسكال (لغة برمجة) وترانسآكت- إس كيو إل حيث تتعادل الأقواس مع مفاتيح البداية begin والنهاية end.

من مميزات هذا الأسلوب هي أن شفرة المسافة البادئة تنفصل بوضوح عن البيان الذي يتضمنها بواسطة اسطر هي بالكامل عبارة عن وايتسبيس بما يحسن القدرة على القراءة ويتوازى قوس الإغلاق في نفس العمود مع قوس الافتتاح مما يجعل من السهل العثور على أقواس متطابقة. بالإضافة إلى ذلك يحدد أسلوب صنع البلوكات البلوك الفعلي للشفرة من بيان التحكم المرتبط به نفسه. بحيث يظهر تعليقا على بيان التحكم ويمحو بيان التحكم بالكامل أما إعادة تصنيع أو إزالة البلوك من الشفرة لا يقدم الأخطاء التراكيبية بالصورة الواضحة بسبب الأقواس المفقودة أو المختلطة.

على سبيل المثال، المثال التالي لا يزال صحيحا من الناحية التركيبية:

<source lang=c> //while (x == y) {

   something();
   somethingelse();

} </source> وكذلك هو الحال بالنسبة للمثال التالي: <source lang=c> //for (int i=0; i < x; i++) //while (x == y) if (x == y) {

   something();
   somethingelse();

} </source>

هذا الأسلوب يمكن أن يؤدي إلى مشاكل عند استخدام لغات برمجة الجافا سكريبت والبايثون. تتمتع الجافا سكريبت بإمكانية إدخال فاصلة منقوطة اوتوماتيكيا في وقت التشغيل مما يمكن أن يؤدي إلى أن تسيطر حشرة حاسوبية شريرة على هذا الأسلوب.[بحاجة لمصدر]

من العيوب الأخرى لهذا الأسلوب هي أن كل قوس من أقواس الاحتواء يشغل سطرا كاملا بنفسه بدون إضافة أي شفرة فعلية. وقد كان ذلك أمرا هاما ذات مرة حين كان يتم تحرير البرامج على وحدات فرعية تكشف عن 24 سطرا فقط، ولكنها تكون أقل وضوحا مع القرارات الأكبر للعروض الحديثة. ونظرا لأن محفز هذا الأسلوب هو أن يتم تعزيز إمكانية قراءة الشفرة بفصل البلوكات عن بيانات تحكمها بصورة مرئية فإن الشاشة وملكيتها تعد اهتماما ثانويا.

يستخدم هذا الأسلوب افتراضيا في مايكروسوفت فيجوال ستوديو 2005 وما تبعها من إصدارات. ومنذ هذا الحين اتبعت مايكروسوفت هذا الأسلوب في جميع مستنداتها (شبكة مطوري مايكروسوفت) ومنهجيات البرمجة الداخلية في لغاتها المعتمدة على السي وهي C++ وC شارب.

أسلوب بي إس دي كيه إن إف

يعرف أيضا باسم أسلوب كيرنل نورمال فورم، وهو يعد حاليا الشكل الخاص بمعظم الشفرات المستخدمة في نظام تشغيلتوزيعة برمجيات بيركلي سوفت وير ديستريبيوشن. وعلى الرغم من أنه مخصص بشكل أساسي بشفرة كيرنل، فهو يستخدم بصورة واسعة الانتشار أيضا في شفرة يوزرلاند. وهو في الأساس إصدار موثق بشكل شامل لأسلوب كيه آند آر كما تستخدم في الشفرة المصدرية يونكس بل لابس الإصدار السادس والسابع.

يتم الاحتفاظ بالمجدولة الصلبة (ts in vi) في ثماني أعمدة بينما المجدولة الناعمة غالبا ما يتم تحديدها كأداة مساعدة مثل (sw in vi) وتوضع في الرابع.

تستخدم المجدولات الصلبة لوضع مسفة بادئة لبلوكات الشفرات بينما تستخدم المجدولة الناعمة للمسافة البادئة الإضافية لكافة السطر الاستمرارية التي يجب أن يتم قسمتها على عدة اسطر.

علاوة على ذلك، لا تستخدم الاستدعاءات الوظيفية المساحة الفارغة قبل القوسان، بالرغم من أن لغة سي المتأصلة في البيانات مثل if, while, do, switch, return تستعين بها (في حالة ما استخدمت return بين القواس). الوظائف التي تدل على عدم وجود متغيرات محلية في البلوك عالي المستوى يجب أن يترك أيضا سطرا فارغا بعد أقواس البلوك الافتتاحية.

فيما يلي عينات قليلة:

<source lang=c> while (x == y) {

       something();
       somethingelse();

} finalthing(); </source> <source lang=c> if (data != NULL && res > 0) {

       if (JS_DefineProperty(cx, o, "data",
           STRING_TO_JSVAL(JS_NewStringCopyN(cx, data, res)),
           NULL, NULL, JSPROP_ENUMERATE) != 0) {
               QUEUE_EXCEPTION("Internal error!");
               goto err;
       }
       PQfreemem(data);

} else {

       if (JS_DefineProperty(cx, o, "data", OBJECT_TO_JSVAL(NULL),
           NULL, NULL, JSPROP_ENUMERATE) != 0) {
               QUEUE_EXCEPTION("Internal error!");
               goto err;
       }

} </source> <source lang=c> static JSBool pgresult_constructor(JSContext *cx, JSObject *obj, uintN argc,

   jsval *argv, jsval *rval)

{

       QUEUE_EXCEPTION("PGresult class not user-instanciable");
       return (JS_FALSE);

} </source>

أسلوب وايت سميث

يعرف أسلوب وايت سميث أيضا بأسلوب ويشارت إلى درجة قليلة وهو اقل شيوعا اليوم من الثلاثة أساليب الأخرى. وقد كان يستخدم ذلك بصورة أساسية في توثيق المصنف سي التجاري الأول، مترجم وايت سميث. كما كان شائعا أيضا في الأيام الأولى للويندوز حيث كان يستخدم في ثلاث كتب برمجة ويندوز مؤثرة دليل المبرمج للويندوز لديورانت وبرمجة الويندوز لياو وكارلسون وبيتزولد وتقنيات برمجة تشغيل ويندوز 3 بيتر نورتن وياو. وتستمر الأساسيات السيمبية للدعوة على ذلك على أنها أسلوب وضع أقواس موصى به نظام تشغيل سيمبيان أو إس لتطبيقات الهاتف المحمول التي تعمل بسي بلس بلس.

هذا الأسلوب يضع الأقواس المرتبطة ببيان التحكم على سطر النص مع مسافة بادئة. ويتم وضع المسافة البادئة للبيانات داخل القواس على نفس مستوى الأقواس.

<source lang=c> while (x == y)

   {
   something();
   somethingelse();
   }

finalthing(); </source>

مميزات هذا الأسلوب شبيهة بتلك الخاصة بأسلوب أولمان في أن البلوكات تنفصل بوضوح عن بيانات التحكم. ومع ذلك ففي أسلوب وايتسميث، لا يزال البلوك مرتبطا بصورة مرئية ببيان التحكم بدلا من أن يبدو كبلوك شفرة ليس له علاقة تحيط به مساحات بيضاء. ميزة أخرى هي أن محاذاة القواس مع البلوك يؤكد على حقيقة أن البلوك بالكامل هو بيان مركب فردي مفاهيميا (وبرمجيا). علاوة على ذلك، فإن وضع مسافات بادئة للأقواس يؤكد على أنها تابعة لبيان التحكم. من عيوب هذا الأسلوب هي أن الأقواس لا تظهر جيدا. ومع ذلك يعد ذلك أمرا معتمد على الرأي كثيرا لأن الأقواس تشغل سطرا كاملا بنفسها حتى إذا كانت مسافتها البادئة في نفس مستوى البلوك.

عيب آخر يمكن أن يكون أنه إذا تم توظيف عناصر نحوية ملائمة مثل "else if"، فإن القوس النهائي لا يتوازى مرة أخرى مع العبارة الذي ينتمي إليها من الناحية المفاهيمية، بالرغم من أن الآخرين يشيرون إلى أن قوس الإغلاق ينتمي لقوس الافتتاح وليس لعبارة التحكم.

كمثال:

<source lang=c> if (data != NULL && res > 0)

   {
   if (!JS_DefineProperty(cx, o, "data", STRING_TO_JSVAL(JS_NewStringCopyN(cx, data, res)),
                          NULL, NULL, JSPROP_ENUMERATE))
       {
       QUEUE_EXCEPTION("Internal error!");
       goto err;
       }
   PQfreemem(data);
   }

else if (!JS_DefineProperty(cx, o, "data", OBJECT_TO_JSVAL(NULL),

       NULL, NULL, JSPROP_ENUMERATE))
   {
   QUEUE_EXCEPTION("Internal error!");
   goto err;
   }

</source>

ومع ذلك، إذا اتبع المرء قاعدة وضع الأسلوب التي تنص بأن يتم توفير الأقواس في كل مستوى من "النطاق"، فإن الشفرة العليا يمكن كتابتها لاستبدال "else if" بكلمة if منفصلة في نطاق به جزئية "else" منفصلة تماما بالعبارة.

<source lang=c> if (data != NULL && res > 0)

   {
   if (!JS_DefineProperty(cx, o, "data", STRING_TO_JSVAL(JS_NewStringCopyN(cx, data, res)),
                          NULL, NULL, JSPROP_ENUMERATE))
       {
       QUEUE_EXCEPTION("Internal error!");
       goto err;
       }
   PQfreemem(data);
   }

else

   {
   if (!JS_DefineProperty(cx, o, "data", OBJECT_TO_JSVAL(NULL),
       NULL, NULL, JSPROP_ENUMERATE))
       {
       QUEUE_EXCEPTION("Internal error!");
       goto err;
       }
   }

</source>

عقب الإستراتيجية المذكورة فيما سبق، يمكن أن يجادل المرء بأن الشفرة يمكن قراءتها بصورة أكبر، ومع ذلك تثار بعض المشكلات في القدرة على القراءة حيث يتم إضافة المزيد من الشروط، والتي تظهر في هذه الشفرة الزائفة (على الرغم من أنه عادة في هذه الحالة يكفي فقط عبارة متحولة)

<source lang=c> else

   {
   if (stuff is true)
       {
       Do stuff
       }
   else
       {
       if (other stuff is true)
           {
           Do other stuff
           }
       else
           {
           if (its still not true)
               {
               Do even more other stuff
               }
           }
       }
   }

</source>

ربما في وقت من الأوقات كان هناك حافزا لوضعه بأكبر قدر ممكن في كل سطر من الشفرة حتى يتم تخفيض عدد الصفحات التي يمكن طباعتها. ولم تعد تلك مشكلة مؤرقة وتزيد من قابلية القراءة بطريقة قواعد صياغة وايت سميث.

أسلوب جي إن يو

مثل أساليب أولمان ووايت سميث، فإن أسلوب جنويستعين أيضا بالأقواس في أسطر مستقلة، ويتم وضع مسافة بادئة مساحتها حركتين إلا عند فتح تعريف لوظيفة حيث لا يتم وضع مسافة بادئة عندها..[٧] في كل الحالات يتم وضع مسافة بادئة عند الشفرة المحتواة بمسافة حركتين من الأقواس.

هذا النموذج الذي قام بنشره ريتشارد ستولمن ربما يتأثر بخلفيته في كتابة شفرة ليسب.[٧] في ليسب يكون مكافئ البلوك وحدة بيانات من الفئة الأولى مما يمنحها مستوى المسافة البادئة الخاص به ليساعد على تأكيد أنه في لغة السي يكون البلوك تركيبيا. وعلى الرغم من عدم ارتباط ذلك بصورة مباشرة بالمسافة البادئة، فإن أسلوب إيماكس للتشفير يتضمن أيضا مسافة قبل القائمة ذات الأقواس من البراهين إلى الدالة الوظيفية.

<source lang=c> static char * concat (char *s1, char *s2) {

 while (x == y)
   {
     something ();
     somethingelse ();
   }
 finalthing ();

} </source>[٧][٧]

هذا الأسلوب يجمع بين مميزات أولمان ووايت سميث ومن ثم يمحو عيوب وايت سميث الممكنة للأقواس التي لا تظهر من البلوك.

محرر النصوص وإيماسز زأمر المسافة البادئة لأنظمة جي إن يو سيقوم بتنسيق الشفرة تبعا لهذا الأسلوب افتراضيا. وهو يفوض من جانب معايير تشفير جي إن يو ويستخدم بكافة عوائل برنامج جي إن يو بروجكت، ولكنه نادرا ما يستخدم خارج نطاق جي إن يو. من العيوب الأخرى هي أن قوس الإغلاق لم يعد متوازيا مع العبارة الذي ينتمي إليها مفاهيميا.

إن كل من لا يستخدم جي إن يو إيماسز، أو المحررات القابلة للتخصيص والتوسع فيها بالمثل ربما يجدون أن ضبط المسافة البادئة تلقائيا بمحررهم أمر لا يساعد في هذا الأسلوب. ومع ذلك فإن العديد من المحررين الذين يتعاملون افتراضيا مع أسلوب كيه إن إف يتأقلمون جيدا مع أسلوب جي إن يو حين يضبط عرض التاب إلى مسافتين، وبالمثل يتأقلم جي إن يو إيماسز جيدا مع أسلوب كيه إن إف بضبط عرض التاب إلى ثماني مسافات. في كلا الحالتين، تقوم إعادة الصياغة الأوتوماتيكية بعمل المسافات الأصلية، ولكن خط المسافات البادئة التلقائي يعمل بشكل صحيح.

أسلوب هورتمان

تتكيف نسخة كتاب " المفاهيم الحاسوبية بمبادئ لغة سي بلس بلس" لكاي إس هورست مان مع أسلوب أولمان بوضع العبارة الأولى من البلوك على نفس خط قوس الافتتاح.

<source lang=c> while (x == y) { something();

   somethingelse();
   //...
   if (x < 0)
   {   printf("Negative");
       negative(x);
   }
   else
   {   printf("Non-negative");
       nonnegative(x);
   }

} finalthing(); </source>

هذا الأسلوب يجمع بين مميزات أسلوب أولمان في الحفاظ على المحاذاة العمودية للقواس للحفاظ على قابلية القراءة وسهولة التعرف على البلوكات مع توفير خط من أسلوب كيه آند آر. ومع ذلك فإن نسخة 2003 تستعين حاليا بأسلوب أولمان كليا. [١]

أسلوب بيكو

هو الأسلوب الذي يستخدم بصورة شائعة في لغة برمجة بيكو بواسطة مصمميها والذي يختلف عن الأساليب المذكورة مسبقا. نقص عبارات الرجوع وحقيقة أن الفاصلة المنقوطة تستخدم في البيكو كفواصل بين العبارات، بدلا من النهايات، يؤدي إلى تركيب الجملة التالية:

stuff(n):
{ x: 3 * n;
  y: doStuff(x);
  y + x }

مميزات وعيوب هذا الأسلوب تتشابه مع تلك الخاصة بحفظ حالة الشاشة مع أسلوب كيه آند ىر. ميزة أخرى إضافية هي أن أقواس البدء والختام ثابتة في البرنامج (كلاهما يتشارك في المساحة مع سطر الشفرة)، متناقضا مع أسلوب كيه آند آر حيث يشترك قوس واحد مع سطر الشفرة وسطر آخر يمتلك سطرا بأكمله لنفسه.

أسلوب بانر

أسلوب بانر يجل المسح الرمئي التصويري أسهل للبعض، ونظرا لأن "العناوين" الخاصة بأي بلوكات هي الشيء الوحيد الممتد لهذا المستوى (لأن النظرية تقول أن ضبط الإغلاق للبلوك السابق يتدخل مع عنوان البلوك التالي في أساليب كيه آند آر وأولمان). في هذا الأسلوب، والذي يعتبر بالنسبة لأسلوب وايت سميث بالضبط كأسلوب كيه آند آر بالنسبة لأولمان، يتم وضع مسافة بادئة لضابط الإغلاق على أنه آخر عنصر بالقائمة (ومن ثم يفقد ثباته).

<source lang=c> function1 () {

 dostuff
 do more stuff
 }

function2 () {

 etc
 }

</source>

أو، بهيئة لغة ترميز:

<source lang=html4strict>

lots of stuff...
     more stuff
alternative for short lines etc.
... etc

</source>

أسلوب ليسب

يمكن أن يتمادى المبرمج حتى يقوم بإدخال أقواس الإغلاق في السطر الأخير من البلوك. هذا الأسلوب يجعل المسافة البادئة هي الطريقة الوحيدة لتمييز بلوكات الشفرات ولكنه يتميز بأنه لا يحتوي على أي أسطر غير ذي مغزى. يمكن أن نسمي ذلك ببساطة أسلوب ليسب (لأن هذا الأسلوب شائع للغاية في شفرة ليسب) أو أسلوب بايثون (لغة بايثون لا تحتوي على أقواس ولكن النموذج يبدو شبيها للغاية [بحاجة لمصدر]).

<source lang=c>

// In C
for (i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        doSomething (i); }
    else {
        doSomethingElse (i); } }

</source> <source lang=python>

# In Python
for i in range(10):
    if i % 2 == 0:
        doSomething(i)
    else:
        doSomethingElse(i)

</source> <source lang=lisp>

;; In Lisp
(dotimes (i 10)
  (if (evenp i)
      (do-something i)
      (do-something-else i)))

</source>

أسلوب القدرة على قراءة التحكم المضغوط

هذا الأسلوب يجعل من السهل استخلاص الحافة اليسارية من الشفرة الخاصة بعبارات التحكم (حيث تكون أساليب مثل 1TBS عبارات مثل "else" يصعب رؤيتها لأنها تلي قوس نهاية في نفس السطر). ومع ذلك تجعل الشفرة مضغوطة أكثر مما في أساليب أخرى مثل أولمان وذلك بوضع اقواس مفتوحة في نهاية الأسطر (فيما يتناقض مع أسطرها الخاصة).

<source lang=javascript > // In JS if (x == y) {

   doSomethingA();
   doSomethingB();

} else {

   doSomethingC();
   doSomethingD();

} </source>

اعتبارات أخرى

فقدان مسار البلوكات

في بعض المواقف، هناك خطورة من فقدان مسار حدود البلوكات. وغالبا ما نرى ذلك في أقسام كبيرة من الشفرة التي تحتوي على العديد من البيانات المركبة التي تتدخل في العديد من المستويات الخاصة بالمسافات البادئة – وفي الوقت الذي يصل فيه المبرمج لأسفل مجموعة كبيرة من العبارات المتداخلة، يمكن أن يفقد تتبع المسار الذي تصل غليه عبارات الضبط.

أما المبرمجين الذين يعتمدون على عدد الأقواس المفتوحة يجدون صعوبة في أساليب المسافات البائدة مثل كيه آند آر، حيث لا يكون قوس البداية منفصلا عن عبارة ضبطه. أما المبرمجين الذين يعتمدون على المسافات البادئة سيكسبون الكثير من تلك الأساليب المضغوطة عموديا مثل كيه آند آر لأن البلوكات أقصر.

ولتجنب فقدان مسار عبارات الضبط مثل for، يمكن لشخص استخدام مسافات بادئة كبيرة مثل تاب صلب عريض من ثماني وحدات جنبا على جنب مع تقسيم الوظائف الكبرى إلى وظائف اصغر وأكثر قابلية للقراءة. نظام لينوكس يعمل بهذه الطريقة وأيضا استخدام أسلوب كيه آند آر.

طريقة أخرى تكون باستخدام تعليقات الإنلاين المضافة بعد قوس الإغلاق

<source lang=c> for (int i = 0; i < total; i++) {

   foo(bar);

} //for (i) </source> <source lang=c> if (x < 0) {

  bar(foo);

} //if (x < 0) </source>

ومع ذلك فإن الحفاظ على شفرة مزدوجة في عدة أماكن هي العيب الأساسي لهذه الطريقة.

من الحلول الأخرى التي يتم تطبيقها في محرر الطي، والتي تتيح للمطور إخفاء أو إظهار بلوكات الشفرات عبر مستوى مسافاتها البادئة أو هيكل عباراتها المركبة. كما يركز الكثير من المحررين أيضا على الأقواس المتطابقة حين تكون علامة الإقحام بجانب واحدا منها.

ويمنع أسلوب كيه آند ى خطأ شائع آخر نواجهه عند استخدام محرر أسطر يونكس المعياري ed. يتم وضع العبارة بصورة خاطئة بين عبارات الضبط وقوس الافتتاح للبلوك الحلقي بحيث يتحول هيكل الحلقة إلى رحلة فردية.

<source lang=c> for (int i = 0; i < total; i++)

   whoops(bar);   /* repeated total times, with i from 0 to (total-1) */ 

{

   only_once();   /* Programmer intended this to be done total times */

} //for (i) <-- This comment is no longer valid, and is very misleading! </source>

يتجنب أسلوب كيه آند آر هذه المشكلة بالحفاظ على عبارة الضبط وقوس الافتتاح في نفس السطر.

المراجع

  1. ^ "Tabs versus Spaces: An Eternal Holy War. by Jamie Zawinski 2000
  2. ^ Reddy، Achut (2000-03-30). Java Coding Style Guide. Sun Microsystems. Retrieved 2008-05-30.
  3. ^ Java Code Conventions. Sun Microsystems
    (1997-09-12). Retrieved 2008-05-30.
  4. ^ Code Conventions for the Java Programming Language. Sun Microsystems
    (1997-03-20). Retrieved 2008-05-30.
  5. ^ Artistic Style. Retrieved 2008-05-21.
  6. ^ Rationale for International Standard Programming Languages C (Revision 2). Retrieved 2010-11-06.
  7. ^ أ ب ت ث Formatting Your Source Code (From the GNU Coding Standards). خطأ استشهاد: وسم <ref> غير صالح؛ الاسم "gnu.org" معرف أكثر من مرة بمحتويات مختلفة.

وصلات خارجية

de:Einrückungsstil Indent style]] es:Indentación fr:Style d'indentation ja:字下げスタイル pt:Indentação ru:Отступ (программирование) ta:உள்தள் பாணி