دليل أنماط Google في C ++. الجزء 10

الجزء 1. مقدمة
...
الجزء 9. التعليقات
الجزء 10. التنسيق
...


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

التنسيق


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

طول الخط


من المستحسن تحديد طول أسطر التعليمات البرمجية بـ 80 حرفًا.
هذه القاعدة مثيرة للجدل بعض الشيء ، ولكن الجزء الأكبر من الشفرة الحالية يلتزم بهذا المبدأ ، ونحن ندعمه أيضًا.

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

ضد

الجانب الآخر يدعي أن الخطوط الطويلة يمكن أن تحسن من قراءة التعليمات البرمجية. 80 حرفًا هي بقايا من المركزية 1960s. قد تظهر الشاشات الحديثة خطوطًا أطول. الحد الأقصى

للحكم

هو 80 حرفًا.

يمكن أن تتجاوز السلسلة حد 80 حرفًا إذا:

  • . , URL-, 80 .
  • /, 80 . , .
  • include.
  • using

-ASCII


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

Hex صالح أيضًا ، خاصةً إذا كان يُحسن من إمكانية القراءة. على سبيل المثال ، "\ xEF \ xBB \ xBF" أو u8 "\ uFEFF"- مسافة لا يمكن فصلها بطول صفري في Unicode ، ولا يجب عرضها في نص UTF-8 الصحيح.

استخدم البادئة u8 بحيث يتم ترميز الحرف مثل \ uXXXX بترميز UTF-8. لا تستخدمه مع الأسطر التي تحتوي على أحرف غير ASCII مشفرة بالفعل في UTF-8 - يمكنك الحصول على نص أخرق إذا لم يتعرف المترجم على شفرة المصدر على أنها UTF-8.

تجنب استخدام أحرف C ++ 11 char16_t و char32_t منذ ذلك الحين أنها مطلوبة لخطوط غير UTF-8. لنفس الأسباب ، لا تستخدم wchar_t (إلا عند العمل مع Windows API باستخدام wchar_t ).

المسافات بين علامات التبويب


استخدم فقط المسافات البادئة. 2 مسافات لمسافات بادئة واحدة.
نستخدم مسافات المسافة البادئة. لا تستخدم علامات التبويب في التعليمات البرمجية - قم بتكوين المحرر لإدراج مسافات عند الضغط على Tab.

إعلانات وتعاريف الوظائف


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

مثال على تصميم الوظيفة الصحيح:

ReturnType ClassName::FunctionName(Type par_name1, Type par_name2) {
  DoSomething();
  ...
}

إذا كان سطر واحد لا يكفي:

ReturnType ClassName::ReallyLongFunctionName(Type par_name1, Type par_name2,
                                             Type par_name3) {
  DoSomething();
  ...
}

أو ، إذا كانت المعلمة الأولى غير مناسبة أيضًا:

ReturnType LongClassName::ReallyReallyReallyLongFunctionName(
    Type par_name1,  //  4 
    Type par_name2,
    Type par_name3) {
  DoSomething();  //  2 
  ...
}

بعض الملاحظات:

  • اختر أسماء جيدة للخيارات.
  • يمكنك حذف اسم المعلمة إذا لم يتم استخدامها في تعريف الوظيفة.
  • , , . .
  • .
  • .
  • .
  • . .
  • , , .
  • .
  • .
  • — 2 .
  • عند نقل المعلمات إلى خط آخر ، مسافة بادئة 4 مسافات.

يمكنك حذف اسم المعلمات غير المستخدمة إذا كان ذلك واضحًا من السياق:

class Foo {
 public:
  Foo(const Foo&) = delete;
  Foo& operator=(const Foo&) = delete;
};

ينبغي التعليق على المعلمات غير المستخدمة ذات السياق غير الواضح في تعريف الوظيفة:

class Shape {
 public:
  virtual void Rotate(double radians) = 0;
};

class Circle : public Shape {
 public:
  void Rotate(double radians) override;
};

void Circle::Rotate(double /*radians*/) {}

//   -  -     ,
//    .
void Circle::Rotate(double) {}

حاول استخدام السمات ووحدات الماكرو في بداية تعريف إعلان أو وظيفة ،
حتى نوع القيمة المرجعة:
ABSL_MUST_USE_RESULT bool IsOk();

لامداس


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

لالتقاط المتغيرات حسب المرجع ، لا تضع مسافة بين علامة العطف (&) واسم المتغير.

int x = 0;
auto x_plus_n = [&x](int n) -> int { return x + n; }

يمكن استخدام lambdas القصيرة مباشرة كحجة للدالة.

std::set<int> blacklist = {7, 8, 9};
std::vector<int> digits = {3, 9, 1, 8, 4, 7, 1};
digits.erase(std::remove_if(digits.begin(), digits.end(), [&blacklist](int i) {
               return blacklist.find(i) != blacklist.end();
             }),
             digits.end());

أرقام النقطة العائمة


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

float f = 1.f;
long double ld = -.5L;
double d = 1248e6;

float f = 1.0f;
float f2 = 1;   //  
long double ld = -0.5L;
double d = 1248.0e6;

استدعاء دالة


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

تنسيق استدعاء الوظيفة:

bool result = DoSomething(argument1, argument2, argument3);

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

bool result = DoSomething(averyveryveryverylongargument1,
                          argument2, argument3);


يُسمح بوضع الحجج على عدة أسطر مع مسافة بادئة من 4 مسافات:
if (...) {
  ...
  ...
  if (...) {
    bool result = DoSomething(
        argument1, argument2,  //  4 
        argument3, argument4);
    ...
  }

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

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

int my_heuristic = scores[x] * y + bases[x];
bool result = DoSomething(my_heuristic, x, y, z);

أو ضع الحجة المعقدة على سطر منفصل وأضف تعليقًا توضيحيًا:

bool result = DoSomething(scores[x] * y + bases[x],  //  
                          x, y, z);

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

تشكل الحجج أحيانًا بنية. في هذه الحالة ، قم بتنسيق الحجج وفقًا للبنية المطلوبة:

//     3x3
my_widget.Transform(x1, x2, x3,
                    y1, y2, y3,
                    z1, z2, z3);


تنسيق قائمة التهيئة


قم بتنسيق قائمة التهيئة بنفس طريقة استدعاء دالة.

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

//      .
return {foo, bar};
functioncall({foo, bar});
std::pair<int, int> p{foo, bar};

//     .
SomeFunction(
    {"assume a zero-length name before {"},
    some_other_function_parameter);
SomeType variable{
    some, other, values,
    {"assume a zero-length name before {"},
    SomeOtherType{
        "Very long string requiring the surrounding breaks.",
        some, other values},
    SomeOtherType{"Slightly shorter string",
                  some, other, values}};
SomeType variable{
    "This is too long to fit all in one line"};
MyType m = {  // Here, you could also break before {.
    superlongvariablename1,
    superlongvariablename2,
    {short, interior, list},
    {interiorwrappinglist,
     interiorwrappinglist2}};

الظروف


حاول عدم إدخال مسافات داخل الأقواس. ضع إذا و آخر على خطوط مختلفة.

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

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

if (condition) {  //    
  ...  //  2 
} else if (...) {  // 'else'      
  ...
} else {
  ...
}

إذا كنت تستخدم تنسيق مساحة:

if ( condition ) {  //   
  ...  //  2 
} else {  // 'else'      
  ...
}

لاحظ أنه في أي حال يجب أن يكون هناك مسافة بين إذا وقوس. أنت بحاجة أيضًا إلى مسافة بين قوس الإغلاق والحامل المجعد (إذا كان هناك واحد).

if(condition) {   //  -    'if'
if (condition){   //  -    {
if(condition){    //  

if (condition) {  //   -     'if'   {

يمكن كتابة الشروط القصيرة على سطر واحد إذا كان هذا يحسن من إمكانية القراءة. استخدم هذا الخيار فقط إذا كان الخط قصيرًا ولا يحتوي الشرط على قسم آخر .

if (x == kFoo) return new Foo();
if (x == kBar) return new Bar();

لا تستخدم النسخة المختصرة إذا كان هناك قسم آخر :

//  -    ,   'else'
if (x) DoThis();
else DoThat();

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

if (condition)
  DoSomething();  //  2 

if (condition) {
  DoSomething();  //  2 
}

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

//  -    'if',  'else' - 
if (condition) {
  foo;
} else
  bar;

//  -    'else',  'if' - 
if (condition)
  foo;
else {
  bar;
}


//  -     'if'   'else'
if (condition) {
  foo;
} else {
  bar;
}

حلقات ومفاتيح


يمكن أن يستخدم بناء التبديل بين قوسين للكتل. وصف التحولات غير العادية بين الخيارات. الأقواس اختيارية لحلقات التعبير المفرد. يجب أن تستخدم الحلقة الفارغة إما جسمًا فارغًا بين قوسين أو تستمر . يمكن أن تكون

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

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

switch (var) {
  case 0: {  //  2 
    ...      //  4 
    break;
  }
  case 1: {
    ...
    break;
  }
  default: {
    assert(false);
  }
}

يجب تمييز الانتقال من تسمية إلى أخرى باستخدام الماكرو ABSL_FALLTHROUGH_INTENDED ؛ (محدد في absl / base / macros.h ).
ضع ABSL_FALLTHROUGH_INTENDED ، عند نقطة الانتقال. استثناء لهذه القاعدة هو التسميات المتتالية بدون رمز ، في هذه الحالة لا يلزم وضع علامة على أي شيء.

switch (x) {
  case 41:  //  
  case 43:
    if (dont_be_picky) {
      //    ( )    
      ABSL_FALLTHROUGH_INTENDED;
    } else {
      CloseButNoCigar();
      break;
    }
  case 42:
    DoSomethingSpecial();
    ABSL_FALLTHROUGH_INTENDED;
  default:
    DoSomethingGeneric();
    break;
}

الأقواس اختيارية لحلقات عملية واحدة.

for (int i = 0; i < kSomeNumber; ++i)
  printf("I love you\n");

for (int i = 0; i < kSomeNumber; ++i) {
  printf("I take it back\n");
}

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

while (condition) {
  //    false
}
for (int i = 0; i < kSomeNumber; ++i) {}  // .      -   
while (condition) continue;  //  - continue     

while (condition);  //  -     do/while

المؤشرات والروابط


حول "." و "->" لا تضع مسافات. يجب أن يكون عامل إلغاء الإشارة أو الالتقاط بدون مسافات.

فيما يلي أمثلة على التنسيق الصحيح للتعبيرات باستخدام المؤشرات والروابط:

x = *p;
p = &x;
x = r.y;
x = r->y;

ملحوظة:

  • "." و "->" بدون مسافات.
  • و * أو و المشغلين ليست مفصولة بمسافات.

عند الإعلان عن متغير أو وسيطة ، يمكنك وضع "*" على كل من النوع والاسم:

// ,   *, &
char *c;
const std::string &str;

// ,   *, &
char* c;
const std::string& str;

حاول استخدام نمط واحد في ملف التعليمات البرمجية ؛ عند تعديل ملف موجود ، استخدم التنسيق المستخدم.

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

//  - 
int x, y;

int x, *y;  //  -      &  *
char * c;  //  -     *
const std::string & str;  //  -     &

التعبيرات المنطقية


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

على سبيل المثال ، هنا عند وضع عامل التشغيل AND في نهاية السطر:

if (this_one_thing > this_other_thing &&
    a_third_thing == a_fourth_thing &&
    yet_another && last_one) {
  ...
}

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

قيم الإرجاع


لا ترفق عبارات الإرجاع البسيطة بين قوسين.

استخدم الأقواس في العودة expr ؛ فقط إذا استخدمتها في تعبير عن النموذج x = expr؛ .

return result;                  //   -  
//  - .    
return (some_long_condition &&
        another_condition);

return (value);                // . ,      var = (value);
return(result);                // . return -   !

تهيئة المتغيرات والمصفوفات


ماذا تستخدم: = ، () أو
{} هو اختيارك.

يمكنك الاختيار من بين الخيارات = ،
() و {} . الأمثلة البرمجية التالية صحيحة:

int x = 3;
int x(3);
int x{3};
std::string name = "Some Name";
std::string name("Some Name");
std::string name{"Some Name"};

كن حذرًا عند استخدام قائمة التهيئة {...} للنوع الذي يحتوي على مُنشئ مع std :: initizer_list .

سيفضل المترجم استخدام مُنشئ std :: Initizer_list عندما تكون هناك قائمة بأقواس . لاحظ أن الأقواس الفارغة {} هي حالة خاصة وسيتم استدعاء المُنشئ الافتراضي (إن وجد). لاستخدام مُنشئ بشكل صريح بدون std :: initizer_list ، استخدم الأقواس بدلاً من الأقواس المتعرجة.

std::vector<int> v(100, 1);  //    
std::vector<int> v{100, 1};  //   2- : 100  1


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

int pi(3.14);  // : pi == 3
int pi{3.14};  //  : "" 

توجيهات المعالج


علامة # (علامة على توجيه المعالج) يجب أن تكون في بداية السطر.

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

//  -    
  if (lopsided_score) {
#if DISASTER_PENDING      //  -    
    DropEverything();
# if NOTIFY               //   # - ,   
    NotifyClient();
# endif
#endif
    BackToNormal();
  }

//  -   
  if (lopsided_score) {
    #if DISASTER_PENDING  // ! "#if"     
    DropEverything();
    #endif                // !     "#endif"
    BackToNormal();
  }

تنسيق الصف


ترتيب المقاطع في الترتيب التالي: الجمهور ، محمية و خاصة . المسافة البادئة هي مسافة واحدة.

يتم وصف التنسيق الأساسي للفصل أدناه (باستثناء التعليقات ، انظر التعليق على وصف الفصل):

class MyClass : public OtherClass {
 public:      //  1 
  MyClass();  //  2-  
  explicit MyClass(int var);
  ~MyClass() {}

  void SomeFunction();
  void SomeFunctionThatDoesNothing() {
  }

  void set_some_var(int var) { some_var_ = var; }
  int some_var() const { return some_var_; }

 private:
  bool SomeInternalFunction();

  int some_var_;
  int some_other_var_;
};

ملاحظات:

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

قوائم تهيئة المنشئ


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

فيما يلي التنسيقات الصحيحة لقوائم التهيئة:

//    
MyClass::MyClass(int var) : some_var_(var) {
  DoSomething();
}

//          ,
//           
MyClass::MyClass(int var)
    : some_var_(var), some_other_var_(var + 1) {
  DoSomething();
}

//     ,     
//     
MyClass::MyClass(int var)
    : some_var_(var),             //  4 
      some_other_var_(var + 1) {  //   
  DoSomething();
}

//     ,       
MyClass::MyClass(int var)
    : some_var_(var) {}

تنسيق مساحات الأسماء


يتم وضع مسافة بادئة لمحتوى مساحة الاسم.

لا تضيف مساحة الاسم مساحة. على سبيل المثال:

namespace {

void foo() {  // .   
  ...
}

}  // namespace

لا تضع مسافة بادئة في مساحة الاسم:

namespace {

  // .   ,   
  void foo() {
    ...
  }

}  // namespace

عند الإعلان عن مساحات الأسماء المتداخلة ، ضع كل إعلان في سطر منفصل.

namespace foo {
namespace bar {

انهيار أفقي


استخدم الأعطال الأفقية حسب الاقتضاء. لا تضيف مسافات إلى نهاية السطر.

المبادئ العامة


void f(bool b) {  //       
  ...
int i = 0;  //       
//            .
//    ,      
int x[] = { 0 };
int x[] = {0};

//        
class Foo : public Bar {
 public:
  //  inline-  
  //     (  )
  Foo(int b) : Bar(), baz_(b) {}  //    
  void Reset() { baz_ = 0; }  //      
  ...

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

الدورات والظروف


if (b) {          //        
} else {          //   else
}
while (test) {}   //       
switch (i) {
for (int i = 0; i < 5; ++i) {
//         .   .
//   ,  
switch ( i ) {
if ( test ) {
for ( int i = 0; i < 5; ++i ) {
//         
//          ,   
for ( ; i < 5 ; ++i) {
  ...

//           
for (auto x : counts) {
  ...
}
switch (i) {
  case 1:         //    case  
    ...
  case 2: break;  //    ,   (   )  

العاملين


//     
x = 0;

//      ,
//   /   .
//          
v = w * x + y / z;
v = w*x + y/z;
v = w * (x + z);

//       
x = -5;
++x;
if (x && !y)
  ...

الأنماط والجبائر


//       (<  >),
//  <,  >(  
std::vector<std::string> x;
y = static_cast<char*>(x);

//        .       
std::vector<char *> x;

انهيار عمودي


التقليل من الانقسام الرأسي.

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

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

بعض الملاحظات المفيدة حول الأسطر الفارغة:

  • لن يؤدي السطر الفارغ في بداية الوظيفة أو نهايتها إلى تحسين إمكانية القراءة.
  • يمكن أن تؤدي الخطوط الفارغة في blockchain إذا كان آخر إلى تحسين إمكانية القراءة.
  • عادةً ما يساعد السطر الفارغ أمام سطر التعليق في سهولة قراءة الشفرة - يتضمن التعليق الجديد عادةً إتمام فكرة قديمة وبداية فكرة جديدة. ومن الواضح أن الخط الفارغ يلمح إلى ذلك.

All Articles