أسلوب إزاحة
أسلوب الإزاحة في البرمجة هو عرف يحكم إزاحة وحدات تخزين البيانات الخاصة بالشيفرة المصدرية لنقل هيكل البرنامج. هذا المقال يتناول بصورة كبيرة لغة البرمجة سي وكل ما ينحدر منها، ويمكن تطبيق ذلك (إلى حد كبير) على معظم لغات البرمجة الأخرى (خاصة تلك الموجودة بعائلة الأقواس المجعدة). ويعد أسلوب الإزاحة أحد خواص البرمجة.
ولا تعد الإزاحة أحد متطلبات لغات البرمجة. بل يقوم المطورون باستعمال الإزاحات فقط لتوصيل هيكل أو بنية برامجهم للقراء من البشر. بوجه خاص، تستخدم الإزاحات لإظهار العلاقة بين مقومات تدفق الضبط مثل الظروف أو الحلقات والشيفرة الموجودة داخلها وخارجها. ومع ذلك تستعين بعض لغات البرمجة (مثل بايثون والأوكام) بالإزاحة لتحديد الهيكل بدلا من استخدام الأقواس أو الكلمات الرئيسية.
وعادة يكون حجم الإزاحة مستقلا عن الأسلوب. استعانت العديد من البرامج السابقة بمفتاح على لوحة المفاتيح للمسافة البادئة، من أجل التبسيط والحفظ في حجم ملف مصدري. وبوجه عام يرى محررو يونكس التاب مكافئة لثماني ضغطات على زر المسافة، بينما أنظمة ماكنتوش ومايكروسوفت ويندوز تحددها في أربعة فقط مما يخلق نوعا من الارتباك حين تنتقل الشيفرة للأمام والخلف. وغالبا ما يستطيع محررو البرمجة المعاصرون تحديد أحجام اعتباطية للمسافات البادئة ويقومون بإدراج تركيبة ملائمة من المساحات الفارغة والتاب. وبالنسبة لروبي يتم استخدام مسافتين فراغيتين لكل مسافة بادئة وفي العديد من لغات برمجة شل وبعض أشكال تنسيقات لغة رقم النص الفائق أو ما تعرف باسم أتش تي أم أل (HTML).
وتعد مشكلة استخدام المسافات الفارغة أو التاب جدلا مستمرا في مجتمع البرمجة. بعض المبرمجين مثل جيمي زاوينسكي يشعرون بأن المسافات تزيد من وظائفية المنصات المتبادلة أكثر من التاب، وهناك آخرين يعتقدون العكس، أن التاب الصلبة تزيد من وظائفية المنصات المتبادلة.
يوجد عدد من برامج الحاسوب التي تقوم تلقائيا بتصحيح أساليب الإزاحة وطول التاب. من أشهرها برنامج إندنت، وهو برنامج مدرج في العديد من أنظمة التشغيل الشبيهة بيونكس. هذه البرامج تعمل بصورة أفضل لكل من يستخدم أسلوب الإزاحة بالقرب مما يعتبر "أمرا لائقا" من جانب مبرمجيها وهم هؤلاء الذين يستخدمون أساليب أخرى سيصبحون أكثر إحباطا. علاوة على ذلك، تم تحديث برنامج إندنت مرة واحدة فقط خلال السنوات الست السابقة وهو لا يعمل جيدا مع لغة سي++ أو في بيئات جنو وهي لغات ممتدة من لغة السي.
سمي أسلوب كيه آند آر بهذا الاسم لأنه كان يستخدم في كتاب كيرنيجهان ودينيس ريتشي "لغة البرمجة سي"، وهو يستخدم أيضا في السي . وهو أقل شيوعا بالنسبة للغات السي++ وسي شارب ولغات أخرى. وهو يحتفظ بأول قوس مفتوح على نفس السطر الموجود به بيان التحكم ليضع مسافة بادئة قبل هذه البيانات الموجودة بين الأقواس ويضع قوس الإغلاق على نفس مستوى الإزاحة مثل بيان التحكم (في سطر خاص به). ومع ذلك يتم وضع الوظائف بين الأقواس بشكل مختلف عن البيانات، القوس الوظيفي المفتوح يوضع عند السطر الذي يلي التصريح، على نفس مستوى الإزاحة كالتصريح. وذلك نظراً لأنه في لغة السي الأصلية تحتاج أنماط النقاش لأن يتم التصريح عنها في السطر اللاحق، بينما حين لا يكون هناك أي نقاشات ضرورية، لن يظهر القوس المفتوح على نفس السطر مع التصريح الوظيفي. القوس المفتوح لتصريحات الوظائف يعد استثناءً للقاعدة الأساسية.
مؤيدو هذا الأسلوب يشيرون إليه أحيانا باسم "أسلوب القوس الحقيقي الواحد" (وتكتب اختصارا 1TBS أو OTBS) بسبب المجموعة السباقة للسي (بالرغم من أن مؤيدي الأساليب الأخرى كانوا يشتهرون باستخدام لغات قوية مثلها). الشيفرة المصدرية ليونكس ونواة نظم التشغيل تكتب بهذا الأسلوب.
في هذا الأسلوب تكون المقومات التي تسمح بإدخال سطور شيفرات جديدة في أسطر منفصلة، أما تلك التي تمنع الإدخال تكون في سطر واحد منفرد. هذا المبدأ يتعزز بوضع أقواس على كل كلمات الرئيسية التي تمثل ما يعرف بتدفق السيطرة مثل if, else, while وما شابه – حتى أدوات الشرط ذات السطر الواحد- بحيث يكون إدخال سطر جديد من الشيفرة في أي مكان "آمنا"
من مميزات هذا الأسلوب هي أن بداية كل قوس لا تتطلب سطرا إضافيا بنفسها، أما قوس النهاية فينتهي بالبيان الذي ينتمي إليه من الناحية المفاهيمية. أما من عيوب هذا الأسلوب هي أن قوس النهاية للبلوك يتخذ سطرا كاملا بنفسه والذي يمكن حله بصورة جزئية في بلوكات if/ else وبلوكات do/while:
وبالرغم من أن هذا الأسلوب يمكن أن يجعل من الصعب مسح أي شيفرة مصدرية تلفازيا لقوس الافتتاح لأي بلوك، وليس من المعتاد دائما أن يكون قوس الافتتاح هو القوس الشيق ولكن بيان التحكم الذي عرف هذا البلوك هو كذلك. من السهل العثور على بداية البلوك بتحديد موقع أول سطر أعلى قوس الإغلاق الذي يتم تحديده بمسافة بادئة بنفس المستوى.
وبينما يتم كتابة برنامج جافا غالبا بأسلوب أولمان أو بأساليب أخرى، فإن هناك هيكل محدد من شيفرة جافا يستعين بنسخة ثانوية من أسلوب كيه آند آر حيث يكون قوس الافتتاح على نفس سطر الدرجة أو تصريح الطريقة، وذلك غالبا لأن إرشادات أسلوب صن ميكروسيستمز الأصلية استعانت بأسلوب كيه آند إيه ونتيجة لذلك فإن معظم شيفرات المصادر المعيارية لجافا إيه بي آي تكتب بهذا الأسلوب. كما أنه أسلوب شائع في الإزاحات لكل من أكشن سكربت وجافا سكريبت بالاشتراك مع أسلوب أولمان.
كما يجب أن نذكر أن لغة البرمجة سي لا تحدد بشكل واضح هذا الأسلوب بالرغم من أننا نتابعها بصورة مستمرة عبر الكتاب. ومن الجدير بالذكر من هذا الكتاب :
موقع القوس أقل أهمية، بالرغم من أن الأشخاص لديهم معتقدات عاطفية. لقد اخترنا واحدا من عدة أساليب شائعة متنوعة. اختر أسلوبا يناسبك ثم استخدمه باستمرار.
تم تسمية أسلوب أولمان باسم إريك أولمان. وهو في الكثير من الأحوال يشار إليه باسم أسلوب المعهد القومي الأمريكي للتنميط " لأنها تستخدم في المستندات التي تصف معيار السي لإيه إن سي آي (الذي تم اتباعها لاحقا كمعيار عالمي للأيزو سي (لغة برمجة). كما تعرف أيضا باسم "أسلوب بي إس جي" منذ كتب أولمان العديد من الاستخدامات توزيعة برمجيات بيركلي (بالرغم من أنه لا يجب خلطه مع أسلوب "بي إس دي كيه إن إف" المختلف تماما، انظر بالأسفل). مؤيدو هذا الأسلوب غالبا ما يستشهدون باستخدامه بإيه إن سي آي وفي معايير أخرى كمبرر لاتباعه.
هذا الأسلوب يضع القوس المرتبط ببيان الضبط على السطر التالي، مع وضع مسافة بادئة على نفس المستوى من بيان التحكم. البيانات بين هذه الأقواس يتم وضعها على مسافة بادئة في المستوى التالي.
هذا الأسلوب شبيه بالإزاحات القياسية المستخدمة بواسطة لغة باسكال وترانسآكت- إس كيو إل حيث تتعادل الأقواس مع مفاتيح البداية begin والنهاية end.
من مميزات هذا الأسلوب هي أن شيفرة الإزاحة تنفصل بوضوح عن البيان الذي يتضمنها بواسطة اسطر هي بالكامل عبارة عن فراغات مما يحسن القدرة على القراءة ويتوازى قوس الإغلاق في نفس العمود مع قوس الافتتاح مما يجعل من السهل العثور على أقواس متطابقة. بالإضافة إلى ذلك يحدد أسلوب صنع البلوكات البلوك الفعلي للشيفرة من بيان التحكم المرتبط به نفسه. بحيث يظهر تعليقا على بيان التحكم ويمحو بيان التحكم بالكامل أما إعادة تصنيع أو إزالة البلوك من الشيفرة لا يقدم الأخطاء التراكيبية بالصورة الواضحة بسبب الأقواس المفقودة أو المختلطة.
على سبيل المثال، المثال التالي لا يزال صحيحا من الناحية التركيبية:
وكذلك هو الحال بالنسبة للمثال التالي:
هذا الأسلوب يمكن أن يؤدي إلى مشاكل عند استخدام لغات برمجة مثل جافا سكريبت والبايثون. تتمتع الجافا سكريبت بإمكانية إدخال فاصلة منقوطة اوتوماتيكيا في وقت التشغيل مما يمكن أن يؤدي إلى أن تسيطر حشرة حاسوبية شريرة (خطأ برمجي) على هذا الأسلوب.
من العيوب الأخرى لهذا الأسلوب هي أن كل قوس من أقواس الاحتواء يشغل سطرا كاملا بنفسه بدون إضافة أي شيفرة فعلية. وقد كان ذلك أمرا هاما ذات مرة حين كان يتم تحرير البرامج على وحدات فرعية تكشف عن 24 سطرا فقط، ولكنها تكون أقل وضوحا مع القرارات الأكبر للعروض الحديثة. ونظرا لأن محفز هذا الأسلوب هو أن يتم تعزيز إمكانية قراءة الشيفرة بفصل البلوكات عن بيانات تحكمها بصورة مرئية فإن الشاشة وملكيتها تعد اهتماما ثانويا.
يستخدم هذا الأسلوب افتراضيا في مايكروسوفت فيجوال ستوديو 2005 وما تبعها من إصدارات. ومنذ ذلك الحين اتبعت مايكروسوفت هذا الأسلوب في جميع مستنداتها (شبكة مطوري مايكروسوفت) ومنهجيات البرمجة الداخلية في لغاتها المعتمدة على السي وهي فيجوال سي++ وسي شارب.
يعرف أيضا باسم أسلوب كيرنل نورمال فورم، وهو يعد حاليا الشكل الخاص بمعظم الشيفرات المستخدمة في نظام تشغيل توزيعة برمجيات بيركلي سوفت وير ديستريبيوشن. وعلى الرغم من أنه مخصص بشكل أساسي بشيفرة كيرنل، فهو يستخدم بصورة واسعة الانتشار أيضا في شيفرة يوزرلاند. وهو في الأساس إصدار موثق بشكل شامل لأسلوب كيه آند آر كما تستخدم في الشيفرة المصدرية ليونكس بل لابس الإصدار السادس والسابع.
يتم الاحتفاظ بالمجدولة الصلبة (ts in vi) في ثماني أعمدة بينما المجدولة الناعمة غالبا ما يتم تحديدها كأداة مساعدة مثل (sw in vi) وتوضع في الرابع.
تستخدم المجدولات الصلبة لوضع مسفة بادئة لبلوكات الشيفرات بينما تستخدم المجدولة الناعمة للمسافة البادئة الإضافية لكافة الأسطر الاستمرارية التي يجب أن يتم تقسيمها على عدة اسطر.
علاوة على ذلك، لا تستخدم الاستدعاءات الوظيفية المساحة الفارغة قبل القوسين، بالرغم من أن لغة سي المتأصلة في البيانات مثل if, while, do, switch, return تستعين بها (في حالة ما استخدمت return بين الأقواس). الوظائف التي تدل على عدم وجود متغيرات محلية في البلوك عالي المستوى يجب أن يترك أيضا سطرا فارغا بعد أقواس البلوك الافتتاحية.
فيما يلي عينات قليلة:
يعرف أسلوب وايت سميث أيضا بأسلوب ويشارت إلى درجة قليلة وهو اقل شيوعا اليوم من الثلاثة أساليب الأخرى. وقد كان يستخدم ذلك بصورة أساسية في توثيق المصنف سي التجاري الأول، مترجم وايت سميث. كما كان شائعا أيضا في الأيام الأولى للويندوز حيث كان يستخدم في ثلاث كتب برمجة ويندوز مؤثرة دليل المبرمج للويندوز لديورانت وبرمجة الويندوز لياو وكارلسون وبيتزولد وتقنيات برمجة تشغيل ويندوز 3 بيتر نورتن وياو. وتستمر الأساسيات السيمبية للدعوة على ذلك على أنها أسلوب وضع أقواس موصى به نظام تشغيل سيمبيان أو إس لتطبيقات الهاتف المحمول التي تعمل بسي++.
هذا الأسلوب يضع الأقواس المرتبطة ببيان التحكم على سطر النص مع مسافة بادئة. ويتم وضع الإزاحة للبيانات داخل القواس على نفس مستوى الأقواس.
مميزات هذا الأسلوب شبيهة بتلك الخاصة بأسلوب أولمان في أن البلوكات تنفصل بوضوح عن بيانات التحكم. ومع ذلك ففي أسلوب وايتسميث، لا يزال البلوك مرتبطا بصورة مرئية ببيان التحكم بدلا من أن يبدو كبلوك شيفرة ليس له علاقة تحيط به مساحات بيضاء. ميزة أخرى هي أن محاذاة الأقواس مع البلوك يؤكد على حقيقة أن البلوك بالكامل هو بيان مركب فردي مفاهيميا (وبرمجيا). علاوة على ذلك، فإن وضع مسافات بادئة للأقواس يؤكد على أنها تابعة لبيان التحكم.
من عيوب هذا الأسلوب هي أن الأقواس لا تظهر جيدا. ومع ذلك يعد ذلك أمرا معتمد على الرأي كثيرا لأن الأقواس تشغل سطرا كاملا بنفسها حتى إذا كانت مسافتها البادئة في نفس مستوى البلوك.
عيب آخر يمكن أن يكون أنه إذا تم توظيف عناصر نحوية ملائمة مثل "else if"، فإن القوس النهائي لا يتوازى مرة أخرى مع العبارة التي ينتمي إليها من الناحية المفاهيمية، بالرغم من أن الآخرين يشيرون إلى أن قوس الإغلاق ينتمي لقوس الافتتاح وليس لعبارة التحكم.
كمثال:
ومع ذلك، إذا اتبع المرء قاعدة وضع الأسلوب التي تنص بأن يتم توفير الأقواس في كل مستوى من "النطاق"، فإن الشيفرة العليا يمكن كتابتها لاستبدال "else if" بكلمة if منفصلة في نطاق به جزئية "else" منفصلة تماما بالعبارة.
عقب الإستراتيجية المذكورة فيما سبق، يمكن أن يجادل المرء بأن الشيفرة يمكن قراءتها بصورة أكبر، ومع ذلك تثار بعض المشكلات في القدرة على القراءة حيث يتم إضافة المزيد من الشروط، والتي تظهر في هذه الشيفرة الزائفة (على الرغم من أنه عادة في هذه الحالة يكفي فقط عبارة متحولة)
ربما في وقت من الأوقات كان هناك حافز لوضعه بأكبر قدر ممكن في كل سطر من الشيفرة حتى يتم تخفيض عدد الصفحات التي يمكن طباعتها. ولم تعد تلك مشكلة مؤرقة وتزيد من قابلية القراءة بطريقة قواعد صياغة وايت سميث.
مثل أساليب أولمان ووايت سميث، فإن أسلوب جنو يستعين أيضا بالأقواس في أسطر مستقلة، ويتم وضع مسافة بادئة مساحتها حركتين إلا عند فتح تعريف لوظيفة حيث لا يتم وضع مسافة بادئة عندها..  في كل الحالات يتم وضع مسافة بادئة عند الشيفرة المحتواة بمسافة حركتين من الأقواس.
هذا النموذج الذي قام بنشره ريتشارد ستولمن ربما يتأثر بخلفيته في كتابة شيفرة ليسب. في ليسب يكون مكافئ البلوك وحدة بيانات من الفئة الأولى مما يمنحها مستوى الإزاحة الخاص به ليساعد على تأكيد أنه في لغة السي يكون البلوك تركيبيا. وعلى الرغم من عدم ارتباط ذلك بصورة مباشرة بالإزاحة، فإن أسلوب إيماكس للتشفير يتضمن أيضا مسافة قبل القائمة ذات الأقواس من البراهين إلى الدالة الوظيفية.
هذا الأسلوب يجمع بين مميزات أولمان ووايت سميث ومن ثم يمحو عيوب وايت سميث الممكنة للأقواس التي لا تظهر من البلوك.
محرر النصوص وإيماسز زأمر الإزاحة لأنظمة جنو سيقوم بتنسيق الشيفرة تبعا لهذا الأسلوب افتراضيا. وهو يفوض من جانب معايير تشفير جنو ويستخدم بكافة برامج مشروع جنو، ولكنه نادرا ما يستخدم خارج نطاق جنو. من العيوب الأخرى هي أن قوس الإغلاق لم يعد متوازيا مع العبارة الذي ينتمي إليها مفاهيميا.
إن كل من لا يستخدم جنو إيماسز، أو المحررات القابلة للتخصيص والتوسع فيها بالمثل ربما يجدون أن ضبط الإزاحة تلقائيا بمحررهم أمر لا يساعد في هذا الأسلوب. ومع ذلك فإن العديد من المحررين الذين يتعاملون افتراضيا مع أسلوب كيه إن إف يتأقلمون جيدا مع أسلوب جنو حين يضبط عرض التاب إلى مسافتين، وبالمثل يتأقلم جنو إيماسز جيدا مع أسلوب كيه إن إف بضبط عرض التاب إلى ثماني مسافات. في كلا الحالتين، تقوم إعادة الصياغة الأوتوماتيكية بعمل المسافات الأصلية، ولكن خط الإزاحات التلقائي يعمل بشكل صحيح.
تتكيف نسخة كتاب "المفاهيم الحاسوبية بمبادئ لغة سي++" لكاي إس هورست مان مع أسلوب أولمان بوضع العبارة الأولى من البلوك على نفس خط قوس الافتتاح.
هذا الأسلوب يجمع بين مميزات أسلوب أولمان في الحفاظ على المحاذاة العمودية للأقواس للحفاظ على قابلية القراءة وسهولة التعرف على البلوكات مع توفير خط من أسلوب كيه آند آر. ومع ذلك فإن نسخة 2003 تستعين حاليا بأسلوب أولمان كليا.
هو الأسلوب الذي يستخدم بصورة شائعة في لغة برمجة بيكو بواسطة مصمميها والذي يختلف عن الأساليب المذكورة مسبقا. نقص عبارات الرجوع وحقيقة أن الفاصلة المنقوطة تستخدم في البيكو كفواصل بين العبارات، بدلا من النهايات، يؤدي إلى تركيب الجملة التالية:
مميزات وعيوب هذا الأسلوب تتشابه مع تلك الخاصة بحفظ حالة الشاشة مع أسلوب كيه آند ىر. ميزة أخرى إضافية هي أن أقواس البدء والختام ثابتة في البرنامج (كلاهما يتشارك في المساحة مع سطر الشيفرة)، متناقضا مع أسلوب كيه آند آر حيث يشترك قوس واحد مع سطر الشيفرة وسطر آخر يمتلك سطرا بأكمله لنفسه.
أسلوب بانر يجعل المسح المرئي التصويري أسهل للبعض، ونظرا لأن "العناوين" الخاصة بأي بلوكات هي الشيء الوحيد الممتد لهذا المستوى (لأن النظرية تقول أن ضبط الإغلاق للبلوك السابق يتدخل مع عنوان البلوك التالي في أساليب كيه آند آر وأولمان). في هذا الأسلوب، والذي يعتبر بالنسبة لأسلوب وايت سميث بالضبط كأسلوب كيه آند آر بالنسبة لأولمان، يتم وضع مسافة بادئة لضابط الإغلاق على أنه آخر عنصر بالقائمة (ومن ثم يفقد ثباته).
أو، بهيئة لغة ترميز:
يمكن أن يتمادى المبرمج حتى يقوم بإدخال أقواس الإغلاق في السطر الأخير من البلوك. هذا الأسلوب يجعل الإزاحة هي الطريقة الوحيدة لتمييز بلوكات الشيفرات ولكنه يتميز بأنه لا يحتوي على أي أسطر غير ذي مغزى. يمكن أن نسمي ذلك ببساطة أسلوب ليسب (لأن هذا الأسلوب شائع للغاية في شيفرة ليسب) أو أسلوب بايثون (لغة بايثون لا تحتوي على أقواس ولكن النموذج يبدو شبيها للغاية ).
هذا الأسلوب يجعل من السهل استخلاص الحافة اليسارية من الشيفرة الخاصة بعبارات التحكم (حيث تكون أساليب مثل 1TBS عبارات مثل "else" يصعب رؤيتها لأنها تلي قوس نهاية في نفس السطر). ومع ذلك تجعل الشيفرة مضغوطة أكثر مما في أساليب أخرى مثل أولمان وذلك بوضع اقواس مفتوحة في نهاية الأسطر (فيما يتناقض مع أسطرها الخاصة).
في بعض المواقف، هناك خطورة من فقدان مسار حدود البلوكات. وغالبا ما نرى ذلك في أقسام كبيرة من الشيفرة التي تحتوي على العديد من البيانات المركبة التي تتدخل في العديد من المستويات الخاصة بالإزاحات – وفي الوقت الذي يصل فيه المبرمج لأسفل مجموعة كبيرة من العبارات المتداخلة، يمكن أن يفقد تتبع المسار الذي تصل عليه عبارات الضبط.
أما المبرمجين الذين يعتمدون على عدد الأقواس المفتوحة يجدون صعوبة في أساليب المسافات البائدة مثل كيه آند آر، حيث لا يكون قوس البداية منفصلا عن عبارة ضبطه. أما المبرمجين الذين يعتمدون على الإزاحات سيكسبون الكثير من تلك الأساليب المضغوطة عموديا مثل كيه آند آر لأن البلوكات أقصر.
ولتجنب فقدان مسار عبارات الضبط مثل for، يمكن لشخص استخدام مسافات بادئة كبيرة مثل تاب صلب عريض من ثماني وحدات جنبا على جنب مع تقسيم الوظائف الكبرى إلى وظائف اصغر وأكثر قابلية للقراءة. نظام لينوكس يعمل بهذه الطريقة وأيضا استخدام أسلوب كيه آند آر.
طريقة أخرى تكون باستخدام تعليقات الإنلاين المضافة بعد قوس الإغلاق
ومع ذلك فإن الحفاظ على شيفرة مزدوجة في عدة أماكن هي العيب الأساسي لهذه الطريقة.
من الحلول الأخرى التي يتم تطبيقها في محرر الطي، والتي تتيح للمطور إخفاء أو إظهار بلوكات الشيفرات عبر مستوى مسافاتها البادئة أو هيكل عباراتها المركبة. كما يركز الكثير من المحررين أيضا على الأقواس المتطابقة حين تكون علامة الإقحام بجانب واحد منها.
ويمنع أسلوب كيه آند آر خطأ شائع آخر نواجهه عند استخدام محرر أسطر يونكس المعياري ed. يتم وضع العبارة بصورة خاطئة بين عبارات الضبط وقوس الافتتاح للبلوك الحلقي بحيث يتحول هيكل الحلقة إلى رحلة فردية.
يتجنب أسلوب كيه آند آر هذه المشكلة بالحفاظ على عبارة الضبط وقوس الافتتاح في نفس السطر.