سؤال

لدي تطبيق أكتبه يستخدم @properties فقط.لم يتم الإعلان عن ivar واحد على الإطلاق في أي من ملفات صفي.كما أفهم، لم تعد هناك حاجة إلى ivars مع تقديم @property.هل أقوم بالبرمجة وفقًا لأفضل الممارسات؟هل سينتهي هذا الأمر بقسمي في مؤخرتي كما يقول المثل على المدى الطويل؟لقد قرأت آراء متباينة حول ما هو "الصواب" و"الخطأ"...

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

المحلول

أنا عمومًا لا أعلن عن إيفار أيضًا. سأستخدم في كثير من الأحيان @synthesize foo = foo_; على الرغم من منع الوصول المباشر عندما أقصد الطريقة أو العكس. وأنا دائمًا أسمح للمترجم بتركيب ivar تلقائيًا مع ملف _ البادئة (التي تمنع الوصول المباشر غير المقصود، وفقًا لـ أصابت عبارة).

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

أجد أيضًا أن الضجيج حول "استخدام الوصول المباشر فقط في init/dealloc، واستخدام setter/getter في كل مكان آخر" مبالغ فيه إلى حد كبير، وبالتالي، فقط استخدم setter/getter في كل مكان.الحقيقة هي أنه إذا كان لديك مراقبون أثناء التهيئة/إلغاء التخصيص، فهذا يعني أنك قد تم غمرك بالفعل؛حالة الكائن، حسب التعريف، غير محددة أثناء البناء/التدمير، وبالتالي، لا يمكن للمراقب أن يفكر بشكل صحيح حول الحالة.


كما يشير كاليب، هناك سبب آخر لاستخدام الوصول المباشر إلى ivar في init/dealloc وهو تجنب الفئات الفرعية التي تطبق منطق setter/getter المخصص الذي قد يتعطل بسبب الحالة غير المحددة للكائن أثناء init/dealloc.

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

أي.إذا تمت كتابة المستوطنين والحروف الخاصة بك على هذا النحو foo.bar = bad; لا يمكن تنفيذها في أي الوقت على foo, ، ثم يتم اختراق الكود الخاص بك.

نصائح أخرى

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

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

باستخدام ivars بالتأكيد غير خاطئ، ومع ذلك، فإن أفضل الممارسات الآن تدفع لاستخدام Roperty بدلا من ذلك.

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

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