في رأيك ما هو أكثر قابلية للقراءة :؟ (المشغل) أو استخدام IF

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

سؤال

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

public void doSomeWork(string value)
{
   int SomeValue = int.Parse(value ?? "0"); //it can throw an exception(i know)
}

لقد فعلت ذلك، لكن مدرب بلدي طلب مني إعادة تعدادها إلى:

public void doSomeWork(string value)
{
    if(string.IsNullOrEmpty(value))
        value = "0";
    int SomeValue = int.Parse(value);
}

في رأيك ما هو الخيار الأفضل؟

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

المحلول

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

شيء مثل:

public int doSomeWork(string value) {
  int someValue = 0;

  if (!string.IsNullOrEmpty(value)) {
    Int.TryParse(value, out someValue);
  }
}

الذي يحل المشكلة حيث تساوي القيمة "الأربعين".

نصائح أخرى

لماذا لا تستخدم فقط TryParse()?

public int doSomeWork(string stringValue)
{
    int value;
    int.TryParse(stringValue, out value);

    return value;
}

الرمز أعلاه سوف يعود 0 إذا كانت القيمة هي أي شيء سوى الرقم الفعلي.

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

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

int someValue = int.Parse(value ?? "0");

بالتأكيد أفضل مشغل Coalsce Null (؟؟) عبر سلسلة من البيانات. خاصة عندما تحتاج إلى التعامل مع أكثر من قيمة واحدة، فإن نهج المشغل هو أكثر قابلية للقراءة. هذه المسرحيات في ميزات الأحدث الأخرى من C #، مثل تعبيرات Lambda، بناء جملة السكر Linq، إلخ. كلما كان رمز أقل من التعليمات البرمجية الموجودة في الكود النوايا الفعلي، يجب أن تكون الوضوح النية / ستكون.

لماذا تحليل السلسلة "0" فقط للحصول على قيمة عدد صحيح 0؟ بالتأكيد أفضل هذا:

public int doSomeWork(string value) {
   int someValue;
   if (String.IsNullOrEmpty(value)) {
      someValue = 0;
   } else {
      someValue = Int32.Parse(value);
   }
}

سوف refactoring بلدي تبدو مثل هذا

public int doSomeWork(string value)
{
   int result = 0; //default?

   if(string.IsNullOrEmpty(value))
   {
      result = 0;
   }
   else
   {
      result = int.Parse(value); //you could also consider using TryParse(...) if your string could possibly also be different from a number.
   }

   //do some calculations upon "result"


   return result;
}

أنا أقرأ حاليا Martin Fowlers Book on Refactoring (أراد أن يقرأه بالفعل لفترة أطول الآن) وهذا ما يفضله عادة ووجدت أنه أيضا "نمط" أيضا "نمط" في الكتاب.

الخياران لا يعادلان. جزء من خطأ في المقتطف الثاني (يجب أن تقرأ if(string.IsNullOrEmpty(value)), ، سوف تتعامل مع حالتين، سلاسل فارغة وفارغة، في حين ?? المشغل يتعامل فقط مع nulls.

جزء من هذا هو الطريق أكثر قابلية للقراءة. أنا جانب مع رئيسك.

حل آخر هو

int somvalue = string.isnulloreped (القيمة)؟ 0: int.parse (القيمة)؛

أول مقتطف الخاص بك سوف تحقق فقط إذا value == null, ، ولكن الثواني الشيكات المقتطف إذا value == string.Empty || value == null. وبعد لا أعرف ما هي متطلبات طريقتك ولكن أولئك الذين سيقومان المقتفيان سيفعلون أشياء مختلفة.

في الواقع يمكنك إعادة المرسل إلى

قيمة var = 0؛
int.tryparse (yourstring، قيمة خارجية)؛

في كلتا الحالتين لديك دائما عدد صحيح صحيح (إذا كان هذا هو الهدف)

يمكنك أن تفعل ذلك في طريقك؟ بارد!

إذا كان الأمر كذلك أكثر قابلية للقراءة، إلا إذا كان الجميع أكثر من C # مني أكثر مني.

في هذه الحالة، يكون في وقت سابق أكثر قابلية للقراءة مثالا تافها. ** ومع ذلك في حالتك ليست معادلة، كما؟ ليس هو نفسه as string.isnullorempty **

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

public int doSomeWork(string value)
{
  return int.Parse(value ?? "0");
}



public int doSomeWork(string value)
{
   if(value == null)
      value = "0";
    int SomeValue = int.Parse(value);
    return SomeValue;
}

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

الفرق الدلالي بين الاثنين هو ذلك ?? هو تعبير، في حين if هو بيان. يقول تعبير "إجراء حساب وإرجاع النتيجة"، بالضبط الدلالات التي تبحث عنها. المزيد من العمل يجب القيام به للسماح if بيان للتعبير عن نفس الدلالات؛ وراء ذلك، if تغادر الغرفة لمزيد من المنطق من الحساب، الغرفة التي لا تحتاج إليها.

يجب عليك استخدام ?? المشغل لأنه يعبر بالضبط النية المطلوبة.

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