سؤال

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

وعلى سبيل المثال، طريقة CaselessIs الثاني يدعو أولا:

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (s.CaselessIs(comparison))
        {
            return true;
        }
    }

    return false;
}

وسيكون من الأنسب أن لا تفعل ذلك؟ ان الجانب السلبي يكون أنه ينتهك جاف.

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (string.Compare(s, comparison, true) == 0)
        {
            return true;
        }
    }

    return false;
}
هل كانت مفيدة؟

المحلول

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

extended.ExtensionMethod(foo);

إلى:

StaticType.ExtensionMethod(extended, foo);

وأنا لا أرى أي مشكلة تسلسل طريقتين ثابتة معا، لذلك transitively، وأنا لا أرى مشكلة في تسلسل طريقتين التمديد.

نصائح أخرى

وأنا شخصيا لا أرى مشكلة في ذلك، السيناريو الثاني أعتقد يشعر أكثر خطأ ....

وحق تماما. لماذا يجب أن أكون مخطئا؟

وكما كنت تحديد طريقة التمديد الذي تستهدفه implictily الإطار 3.0 (في الواقع ملحقات مترجم من لغات جديدة) ولذلك لا يوجد شيء خاطئ حول استخدام مجرد تمديد آخر للقيام بهذا العمل.

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

وليس لدي أي مشكلة في ذلك، وأنا - رغم ذلك، إذا ما يجعلك تشعر أفضل، هل يمكن بالتأكيد استخدام الإصدار ثابت بدلا من ذلك:

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
   foreach(string comparison in compareTo)
   {
      if (Extensions.CaselessIs(s, comparison))
      {
         return true;
      }
   }

   return false;
}

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

لا أرى أي شيء خطأ في ذلك. دعونا نقول لكم إنشاء someClass.ToMySpecialString (). لماذا لا ينبغي أن تكون قادرة على الإثقال عليه إذا someClass.ToString () لديه بالفعل الزائدة متعددة؟

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