لماذا لا تعلن عدة متغيرات من نفس النوع على نفس الخط ؟

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

سؤال

لماذا هي سيئة الممارسة إلى تعريف المتغيرات على السطر ؟

على سبيل المثال

private String var1, var2, var3

بدلا من:

private String var1;
private String var2;
private String var3;
هل كانت مفيدة؟

المحلول

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

و كل ذلك من أجل لا كسب و لا تقول لي أنك تجد سطرين من حفظ الفضاء هو المكسب الحقيقي.

انه شيء مماثل لما يحدث عندما يكون لديك

if ((foo = some_function()) == 0) {
    //do something
}

بالطبع هذا المثال هو أسوأ بكثير من يدكم.

نصائح أخرى

في رأيي أن الهدف الرئيسي من وجود كل متغير في سطر منفصل في تسهيل مهمة من أدوات التحكم في الإصدار.

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

في C++ :

int * i, j;

أنا هو من نوع int * ، ي هو من نوع int.الفرق هو أيضا غاب بسهولة.

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

في C/C++, لديك أيضا المشكلة التي * تستخدم للإشارة إلى نوع مؤشر ينطبق فقط على مباشرة بعد المعرف.لذا بدلا خطأ شائع من الخبرة المطورين كتابة

int* var1, var2, var3;

و أتوقع كل ثلاثة متغيرات من نوع 'int مؤشر' ، في حين أن المترجم أن يقرأ هذا النحو

int* var1;
int var2;
int var3;

مما يجعل فقط var1 مؤشر.

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

لأن في بعض اللغات ، var2 و var3 في المثال لا تكون السلاسل ، فإنها تكون المتغيرات (مصنف).

السبب هو أن الممارسة السيئة ؟ أنا لا أعتقد أنه هو ، طالما التعليمات البرمجية الخاصة بك لا تزال قابلة للقراءة.

//not much use
int i, j, k;

//better
int counter, 
    childCounter, 
    percentComplete;

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

تطفو fMin, fMax;

ومع ذلك أنا الابتعاد عندما المتغيرات لا علاقة لها مثلا

الباحث iBalance, iColor;

أهميتها.

فقط لأن اثنين من المتغيرات من نوع String لا يعني أنها ترتبط ارتباطا وثيقا مع بعضها البعض.

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

هنا هو بلدي أسباب:

  • القراءة, أسهل على الفور إذا كنت تعرف أن هناك واحد فقط في كل سطر
  • التحكم في الإصدار ، أقل داخل الخط التغييرات أكثر من سطر واحد الإضافات أو التغييرات أو الحذف ، الأسهل لدمج من فرع واحد إلى آخر

ماذا عن الحالة مثل:

public static final int NORTH = 0,
                        EAST = 1,
                        SOUTH = 2,
                        WEST = 3;

هو أن تعتبر ممارسة سيئة ؟ أنا أعتبر أن حسنا كما عدادات بعض النقاط التي سبق:

  • هم بالتأكيد يكون نفس النوع (في كتابتها بشكل ثابت جافا-العالم)
  • التعليقات يمكن أن تضاف لكل
  • إذا كان لديك لتغيير نوع واحد ، ربما لديك للقيام بذلك عن كل شيء ، وكل أربعة يمكن القيام به في تغيير واحد

حتى في (ولو رائحة كريهة رمز) على سبيل المثال ، هناك أسباب لا يفعل ذلك ؟

أتفق مع edg, و أيضا لأنه هو أكثر قابلية للقراءة وسهولة الصيانة أن يكون كل متغير في سطر منفصل.يمكنك على الفور معرفة نوع ونطاق معدلات الأخرى و عند تغيير معدل فإنه لا ينطبق إلا على المتغير الذي تريد - أن يتجنب الأخطاء.

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

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

string a,b;
if (Foo())
{
  a = "Something";
  b = "Something else";
}
else
{
  a = "Some other thing";
  b = "Out of examples";
}

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

int s, t ؛ // نسيج الإحداثيات

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

أثناء محاولتهم هذا السؤال https://www.interviewbit.com/problems/remove-element-from-array/

الأسلوب 1 يعطي الذاكرة تجاوز حد للحصول على هذه التعليمة البرمجية:

النوع 1:

int i,j;

النوع 2:

int i;
int j;

النوع 1:يعطي الذاكرة تجاوز حد

int removeElement  (int* A, int n1, int B) 
{
    int k=0, i;
    for(i=0;i<n1;i++)
        if(A[i]!=B)
        {
            A[k]=A[i];
            k++;
        }    
    return k;
}

في حين أن النوع 2 يعمل بشكل جيد تماما

int removeElement  (int* A, int n1, int B) 
{
    int k=0;
    int i;
    for(i=0;i<n1;i++)
        if(A[i]!=B)
        {
            A[k]=A[i];
            k++;
        }    
    return k;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top