مرجع
آخر الزيارات

أسلوب إزاحة

3٬239 كلمة•0 مشاهدة•🗒️ منذ 21 ساعة
باختصار: أسلوب الإزاحة في البرمجة هو عرف يحكم إزاحة وحدات تخزين البيانات الخاصة بالشيفرة المصدرية لنقل هيكل البرنامج. في هذه المقالة 48 قسماً: «{»، «}» و«أسلوب بي إس دي كيه إن إف» وغيرها.
المحتويات
  1. {
  2. }
  3. أسلوب بي إس دي كيه إن إف
  4. {
  5. }
  6. أسلوب أولمان
  7. {
  8. {
  9. {
  10. somethingelse;
  11. {
  12. # In Python
  13. somethingelse;
  14. } else {
  15. أسلوب بانر
  16. }
  17. finalthing;
  18. }
  19. }
  20. أسلوب ليسب
  21. }
  22. alternative for short lines
  23. finalthing;
  24. static char *
  25. {
  26. }
  27. finalthing;
  28. أسلوب وايت سميث
  29. أسلوب بيكو
  30. finalthing;
  31. أسلوب جنو
  32. النسخة:1TBS
  33. أسلوب هورتمان
  34. }
  35. y + x }
  36. فقدان مسار البلوكات
  37. bar(foo);
  38. أسلوب القدرة على قراءة التحكم المضغوط
  39. static JSBool
  40. {
  41. ;; In Lisp
  42. {
  43. // In C
  44. {
  45. }
  46. أسلوب كيه آند آر
  47. finalthing;
  48. foo(bar);

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

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

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

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

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

{

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

}

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

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

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

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

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

  • فيما يلي عينات قليلة:
  • while (x == y) {
  • something;
  • somethingelse;
  • }

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

{

  • if (stuff is true)
  • {
  • Do stuff
  • }
  • else

}

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

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

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

أسلوب أولمان

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

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

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

{

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

{

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

{

  • if (other stuff is true)
  • {
  • Do other stuff
  • }
  • else

somethingelse;

  • if (some_error)
  • do_correct;
  • else
  • continue_as_usual;
  • }

{

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

# In Python

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

somethingelse;

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

} else {

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

أسلوب بانر

  • function1 {
  • dostuff
  • do more stuff
  • }
  • function2 {
  • etc

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

}

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

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

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

finalthing;

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

  • مثلًا، المثال التالي لا يزال صحيحا من الناحية التركيبية:
  • //while (x == y)
  • {
  • something;
  • somethingelse;

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

}

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

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

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

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

}

if (data != NULL && res > 0)

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

أسلوب ليسب

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

}

  • أو، بهيئة لغة ترميز:
  • lots of stuff...
  • more stuff

alternative for short lines

etc.

... etc

finalthing;

  • 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);

static char *

concat (char *s1, char *s2)

{

وفي هذا السياق، 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

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

finalthing;

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

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

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

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

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

أسلوب بيكو

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

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

finalthing;

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

if (data != NULL && res > 0)

كمثال:

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

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

أسلوب جنو

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

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

النسخة:1TBS

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

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

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

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

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

{ something;

من جانب آخر، تتكيف نسخة كتاب «المفاهيم الحاسوبية بمبادئ لغة سي++» لكاي إس هورست مان مع أسلوب أولمان بوضع العبارة الأولى من البلوك على نفس خط قوس الافتتاح.

while (x == y)

}

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

y + x }

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

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

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

for (int i = 0; i < total; i++) {

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

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

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

bar(foo);

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

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

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

في هذا الإطار، whoops(bar); /* repeated total times, with i from 0 to (total-1) */

for (int i = 0; i < total; i++)

} //if (x < 0)

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

  • // In JS
  • if (x == y) {
  • doSomethingA;
  • doSomethingB;
  • }
  • else {
  • doSomethingC;
  • doSomethingD;
  • }
  • اعتبارات أخرى

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

static JSBool

ومن جهة أخرى، pgresult_constructor(JSContext *cx, JSObject *obj, uintN argc,

jsval *argv, jsval *rval)

{

في هذا الإطار، only_once; /* Programmer intended this to be done total times */

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

وفي هذا السياق، } //for (i) <-- This comment is no longer valid, and is very misleading!

مراجع

;; In Lisp

  • (dotimes (i 10)
  • (if (evenp i)
  • (do-something i)
  • (do-something-else i)))

{

  • ...
  • while (x == y) {
  • something;

// In C

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

{

  • {
  • QUEUE_EXCEPTION("Internal error!");
  • goto err;
  • }
  • PQfreemem(data);
  • }
  • else

وفي هذا الصدد، if (!JS_DefineProperty(cx, o, "data", STRING_TO_JSVAL(JS_NewStringCopyN(cx, data, res)), NULL, NULL, JSPROP_ENUMERATE))

}

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

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

int main(int argc, char *argv[])

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

finalthing;

...

}

foo(bar);

if (x < 0) {

} //for (i)

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.