سؤال

هو واحد من هاتين الطريقتين لإنشاء وكائن أفضل أو تهيئة

MyClass oClass = [[MyClass alloc] init];
oClass.length = 5;
oClass.text = @"Hello";

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

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"];

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

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

المحلول

لا تكن هيرت. :-)

بالمناسبة، أنا أفترض أنك تعني:

(تعديل: إزالة المصابيح غير الضرورية)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];

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

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

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

نصائح أخرى

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

ومع ذلك، لا أعتقد أن هناك حقيقة مطلقة لهذا السؤال.

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

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

ولكن لا توجد طريقة INIT بطبيعتها "أفضل". عادة ما تحتوي الفصول الدروسيات المعينين أو اثنين من المهندسين المعينين وكل الآخرين فقط استدعاء أولئك الذين لديهم القيم الافتراضية - لا يتركون بالضرورة خصائص المثيل المستشدة. يجب أن يشير الوثائق اللازمة للفئة إلى ما يفعله المهيئون والعميل المعين للفئة. علي سبيل المثال، [[NSDate alloc] init] يستخدم تهيئة NSDate المعينة، initWithTimeIntervalSinceReferenceDate:, لإنشاء كائن تاريخ يمثل التاريخ والوقت الحاليين.

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

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