هل تستخدم الأقواس المتعرجة لتحديد النطاق الإضافي؟[مغلق]

StackOverflow https://stackoverflow.com/questions/249009

  •  05-07-2019
  •  | 
  •  

سؤال

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

لم أكن أعلم أنه يمكن القيام بذلك مثل هذا حتى رأيت هذا السؤال SO.

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

ما هي الاستخدامات الأخرى الموجودة إلى جانب تلك المذكورة؟

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

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

هل كانت مفيدة؟

المحلول

وأن أفعل إذا أنا باستخدام الموارد التي أريد لتحرير في وقت معين على سبيل المثال:

void myfunction()
{
  {
  // Open serial port
     SerialPort port("COM1", 9600);
     port.doTransfer(data);
  } // Serial port gets closed here.

  for(int i = 0; i < data.size(); i++)
     doProcessData(data[i]);
  etc...
}

نصائح أخرى

لن أستخدم الأقواس المتعرجة لهذا الغرض لعدة أسباب.

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

  2. إن تقديم الأقواس لتحديد النطاق لإعادة استخدام أسماء المتغيرات لن يؤدي إلا إلى الارتباك والمشاكل في التعليمات البرمجية.

سنتان فقط، ولكني رأيت الكثير من هذه الأنواع من الأشياء في مواد أخرى تتعلق بأفضل الممارسات.

والاستخدام الأكثر شيوعا "غير قياسي" من الاستطلاعية التي تستخدم بانتظام هو للاستفادة من مزامنة راقب.

void MyClass::Somefun()
{
    //do some stuff
    {
        // example imlementation that has a mutex passed into a lock object:
        scopedMutex lockObject(m_mutex); 

        // protected code here

    } // mutex is unlocked here
    // more code here
}

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

على C ++ : ل

وأحيانا تحتاج إلى تقديم مستوى هدفين خارج نطاق إعادة استخدام أسماء المتغيرات عندما فمن المنطقي أن تفعل ذلك:

switch (x) {
    case 0:
        int i = 0;
        foo(i);
        break;
    case 1:
        int i = 1;
        bar(i);
        break;
}

ورمز أعلاه لا ترجمة. تحتاج إلى إجراء ما يلي:

switch (x) {
    case 0:
        {
            int i = 0;
            foo(i);
        }
        break;
    case 1:
        {
            int i = 1;
            bar(i);
        }
        break;
}

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

#if defined( UNIX )
    if( some unix-specific condition )
#endif
    {
        // This code should always run on Windows but 
        // only if the above condition holds on unix
    }

ورمز بني ويندوز لا يرى إذا، إلا أن الأقواس. وهذا هو أكثر وضوحا من:

#if defined( UNIX )
    if( some unix-specific condition ) {
#endif
        // This code should always run on Windows but 
        // only if the above condition holds on unix
#if defined( UNIX )
    }
#endif

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

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

لمبرمجي جافا (وربما C #، وأنا لا أعرف) هذا سيكون مفهوما غريبا لأن الأجسام القائم على كومة وGC يقتل RAII. IMHO، والقدرة على وضع الكائنات على كومة هو أعظم ميزة واحدة من C ++ على جافا ويجعل مكتوبة جيدا C ++ كود أنظف بكثير من كود جافا مكتوبة بشكل جيد.

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

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

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

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

// yuk!
some code
{
scoped code
}
more code

// also yuk!
some code
/* do xyz */ {
    scoped code
    }
some more code

// this I like
some code
DoXyz: {
    scoped code
    }
some more code

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

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

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

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

/// c++ code
/// references to boost::test
BOOST_TEST_CASE( curly_brace )
{
  // init
  MyClass instance_to_test( "initial", TestCase::STUFF ); {
    instance_to_test.permutate(42u);
    instance_to_test.rotate_left_face();
    instance_to_test.top_gun();
  }
  { // test check
    const uint8_t kEXP_FAP_BOOST = 240u;
    BOOST_CHECK_EQUAL( instance_to_test.get_fap_boost(), kEXP_FAP_BOOST);
  }
}

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

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top