لماذا قمت بفحص المخصصة (النفس) في أساليب الكائن؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

وأنا أبحث في بعض التعليمات البرمجية (دلفي 7) مع التالية الاختيار في الجزء العلوي من كل استدعاء الأسلوب لكائن معين:

if not Assigned(self) then
  raise Exception.CreateRes(@sAbstractError);

  { Real code for this method}

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

هل هذا نوع من معيار بأنني لم يسبق له مثيل من قبل؟ الكائن في مسألة مستمد من TPersistent.

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

المحلول

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

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

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

والقيام يبدو لي بانتظام كما رائحة التعليمات البرمجية.

نصائح أخرى

وخطأ واضح تشكو مؤشر لا شيء أفضل من انتهاك الوصول التي لا يقول كيف حدث ذلك.

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

ويمكنك قراءة المقال التالي حول هذا الموضوع: عندما الذاتي في النيل ... أنت تعرف كنت في ورطة .

ويرتبط احتمال آخر للأحداث، يمكنك قراءة المزيد هنا، مع الكثير من الأمثلة لمثل هذه التجارب، وتقديم الإيضاحات المقابلة: <لأ href = "http://www.deltics.co.nz/blog/؟p= 102 "يختلط =" نوفولو noreferrer "> الأحداث المتعدد - الجزء 2 .

وهذه مناسبة من شأنها أن تؤدي بالتأكيد إلى حادث (أي استثناء OS مثل "القراءة من عنوان 0x00000000"). رمي استثناء اللغة هو ببساطة زائدة (واساءة استخدام EAbstractError هنا لا يجعله أفضل).

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

وتجدر الإشارة إلى

واستثناء واحد: في دلفي، يمكن استدعاء الأسلوب Free على مؤشر صفرا، والتي بالطبع يتطلب هذا النوع من التحقق

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

ومع ذلك، وهذا ما أخذ البرمجة الدفاعية إلى أقصى الحدود. أنا أبدا (OK، أبدا تقريبا - إلا عندما أكون الصيد wabbits ... errr ... سحق البق). فعل ذلك

ويبدو أن القصد الأصلي لهذه الطريقة هو أنه أصبح وسيلة مجردة.

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