كيف يمكنني تفسير ذلك إذا (س ع ص == فارغة) الشيكات ليست "وقائية"

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

  •  22-07-2019
  •  | 
  •  

سؤال

ولدي عدد قليل من المطورين الذين وضعوا باستمرار إذا شيكات فارغة

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

Run(Order order)
{
  if (order == null) return;
}

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

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

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

وأي مواد جيدة أو اقتراحات لمساعدتي في الحصول على هذه النقطة عبر؟

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

المحلول

إذا صفك لا يمكن أن تقبل الحجج null، ثم ان افضل شيء نفعله هو هذا:

if (arg == null)
    throw new ArgumentNullException();

وهذا هو الأفضل بشكل كبير على الحصول على NullPointerException أعمق الأعماق المكدس. في أسوأ الحالات، عليك أن مخبأ في مكان ما null ولن يؤدي في الواقع استثناء حتى وقت لاحق من ذلك بكثير، ومعرفة مقدار المتعة سيكون لديك تصحيح المشكلة <م> ثم .

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

.

نصائح أخرى

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

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

وحتى لو لم الدالة بإرجاع وعادل يلقي NullReferenceException، انها eaiser لحل الخلل عندما تعلم ان حجة كانت فارغة. إذا وظيفة يلقي NullReferenceException، لديك أي فكرة عما null أو الذين كان خطأ.

وأود أن أضيف أن ArgumentNullException يأخذ معلمة لسبب ما.

ومن الأفضل أن تكتب

if(myArg == null) throw new ArgumentNullException("myArg");

ومن بطرح ArgumentNullException دون paramName.

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

إذا كنت تكتب العديد من الوظائف، وهذا يمكن أن يكون هناك الكثير من النفقات العامة، لا سيما وأن ليس هناك التحسس للسلاسل. كتبت التعليمات البرمجية المتكررة لتوليد هذه الشيكات:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Check for null arguments</Title>
            <Shortcut>tna</Shortcut>
            <Description>Code snippet for throw new ArgumentNullException</Description>
            <Author>SLaks</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
                <SnippetType>SurroundsWith</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>Parameter</ID>
                    <ToolTip>Paremeter to check for null</ToolTip>
                    <Default>value</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[if ($Parameter$ == null) throw new ArgumentNullException("$Parameter$");
        $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
سوف

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

HTTP : //blogs.msdn.com/bclteam/archive/2008/11/11/introduction-to-code-contracts-melitta-andersen.aspx

وأنا لم يشاهد من خلال ذلك، ولكن eiffel.com ديه 2 العروض ( الشرائح + الصوت) على موضوع <م> تصميم بالعقود . وهؤلاء الرجال اخترع مفهوم، لذلك إذا كان أي شخص يمكن أن يفسر ذلك انها لهم :-)

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

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

Debug.Assert( item != null, "Null items are not supported );

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

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

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

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

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

وباختصار: يرصد أي رمز قوي بافتراض متانة حول البيئة من حولهم

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