كيف يمكنك تسمية قيم المثيل/المعلمة الخاصة بك؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

لكوني جديدًا في Objective-C (لكنني مبرمج C/++ طويل المدى) فأنا أبحث عن نصيحة/توصيات بشأن اصطلاحات التسمية للمتغيرات.

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

إذن، بالنظر إلى الكود الموجود أدناه، ما هو نمط التسمية المفضل لديك لمتغيرات المثال/الوظيفة؟وإذا كنت لا تهتم، فكيف تتعامل مع التظليل على معلمات الوظيفة؟

@interface GridItem : NSObject
{
    CGRect _rect;
    ...  
}
@end

-(void) initFromRect:(CGRect)rect
{
    _rect = rect;
    ...
}

هتافات!

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

المحلول

تستخدم معظم مشاريع الكاكاو الشريط السفلي باعتباره غيرIBOutlet بادئة متغير المثيل، ولا تستخدم أي بادئة لـ IBOutlet متغيرات سريعة.

السبب وراء عدم استخدامي للقضبان السفلية IBOutlet متغيرات المثال هي أنه عند تحميل ملف nib، إذا كان لديك طريقة ضبط لمنفذ متصل، فسيتم استدعاء هذا الضبط. لكن هذه الآلية تفعل لا استخدم ترميز القيمة الرئيسية، بحيث يكون IBOutlet اسمه مسبوقًا بشريط سفلي (على سبيل المثال _myField) سوف لا يتم ضبطه ما لم يتم تسمية أداة الضبط تمامًا مثل المنفذ (على سبيل المثال set_myField:) ، وهو غير قياسي وإجمالي.

انتبه أيضًا إلى أن استخدام خصائص مثل self.myProp يكون لا نفس الوصول إلى متغيرات المثيل.أنت ارسال رسالة عند استخدام خاصية، تمامًا كما لو كنت تستخدم تدوين الأقواس مثل [self myProp].كل ما تفعله الخصائص هو إعطاؤك صيغة موجزة لتحديد كل من getter وsetter في سطر واحد، وتسمح لك بتجميع تنفيذها؛فهي لا تؤدي في الواقع إلى قصر دائرة آلية إرسال الرسالة.إذا كنت تريد الوصول إلى متغير مثيل مباشرةً ولكن قم ببدءه بـ self تحتاج إلى علاج self كمؤشر، مثل self->myProp وهو حقًا وصول ميداني على النمط C.

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

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

إليك ما قد تبدو عليه فئة وحدة التحكم في النافذة، باستخدام اصطلاحاتي:

// EmployeeWindowController.h
#import <AppKit/NSWindowController.h>

@interface EmployeeWindowController : NSWindowController {
@private
    // model object this window is presenting
    Employee *_employee;

    // outlets connected to views in the window
    IBOutlet NSTextField *nameField;
    IBOutlet NSTextField *titleField;
}

- (id)initWithEmployee:(Employee *)employee;

@property(readwrite, retain) Employee *employee;

@end

// EmployeeWindowController.m
#import "EmployeeWindowController.h"

@implementation EmployeeWindowController

@synthesize employee = _employee;

- (id)initWithEmployee:(Employee *)employee {
    if (self = [super initWithWindowNibName:@"Employee"]) {
        _employee = [employee retain];
    }
    return self;
}

- (void)dealloc {
    [_employee release];

    [super dealloc];
}

- (void)windowDidLoad {
    // populates the window's controls, not necessary if using bindings
    [nameField setStringValue:self.employee.name];
    [titleField setStringValue:self.employee.title];
}

@end

سترى أنني أستخدم متغير المثيل الذي يشير إلى ملف Employee مباشرة في بلدي -init و -dealloc الطريقة، بينما أستخدم الخاصية بطرق أخرى.هذا بشكل عام نمط جيد مع الخصائص:فقط المس متغير المثيل الأساسي للخاصية في أدوات التهيئة، في -dealloc, ، وفي الجار والواضع للعقار.

نصائح أخرى

أتبع نصيحة كريس هانسون فيما يتعلق ببادئة الشرطة السفلية ivar، على الرغم من أنني أعترف بأنني أستخدم الشرطة السفلية في IBOutlets أيضًا.ومع ذلك، فقد بدأت مؤخرًا في تحريك IBOutlet التصريحات إلى @property الخط، حسب اقتراح @mmalc.الفائدة هي أن جميع ivars الخاصة بي تحتوي الآن على شرطة سفلية ويتم استدعاء أدوات ضبط KVC القياسية (على سبيل المثال. setNameField:).كما أن أسماء المنافذ لا تحتوي على شرطات سفلية في Interface Builder.

@interface EmployeeWindowController : NSWindowController {
@private
    // model object this window is presenting
    Employee *_employee;

    // outlets connected to views in the window
    NSTextField *_nameField;
    NSTextField *_titleField;
}

- (id)initWithEmployee:(Employee *)employee;

@property(readwrite, retain) Employee *employee;
@property(nonatomic, retain) IBOutlet NSTextField *nameField;
@property(nonatomic, retain) IBOutlet NSTextField *titleField;

@end

يمكنك استخدام بادئة الشريط السفلي في ivars الخاص بك مع الاستمرار في استخدام الاسم الذي لا يحتوي على الشريط السفلي لخصائصك.بالنسبة للملحقات المركبة، فقط قم بما يلي:

@synthesize foo = _foo;

هذا يخبر المترجم بتجميع خاصية foo باستخدام the_foo ivar.

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

أنا شخصياً أتبع اصطلاحات تسمية Cocoa، باستخدام غلاف الجمل للوظائف والمتغيرات، وغطاء الجمل الكبير لأسماء الكائنات (بدون حرف NS الرئيسي بالطبع).

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

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

لا أحب استخدام الشرطة السفلية كبادئات لأي معرفات، لأن C وC++ كلاهما يحتفظان ببادئات الشرطة السفلية معينة لاستخدامها من خلال التنفيذ.

أعتقد أن استخدام "self.variable" أمر قبيح.

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

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

لقد أذهلتني البادئات الموجودة في متغيرات المثيلات دائمًا باعتبارها C++-ism التي تم إحضارها إلى Java ثم إلى C#.نظرًا لأن عالم Objective-C كان موازيًا إلى حد كبير لعالم C++، حيث أن عوالم Java وC# هي خلفاء له، فإن هذا من شأنه أن يفسر الاختلاف "الثقافي" الذي قد تراه في هذا بين المجموعات المختلفة من المطورين.

أسلوبي مختلط وهو في الحقيقة بقايا من أيام PowerPlant:

البادئات الأكثر فائدة التي أستخدمها هي "in" و"out" لمعلمات الوظيفة/الطريقة.يساعدك هذا في معرفة الغرض من المعلمات في لمحة سريعة ويساعد حقًا في منع التعارضات بين معلمات الطريقة ومتغيرات المثيل (كم عدد المرات التي رأيت فيها المعلمة "جدول" تتعارض مع متغير مثيل يحمل نفس الاسم).على سبيل المثال:

- (void)doSomethingWith:(id)inSomeObject error:(NSError **)outError;

ثم أستخدم الاسم العاري لمتغيرات المثال وأسماء الخصائص:

ثم أستخدم "the" كبادئة للمتغيرات المحلية:الجدول، URL، وما إلى ذلك.مرة أخرى، يساعد هذا في التمييز بين المتغيرات المحلية ومتغيرات المثيل.

ثم باتباع تصميم PowerPlant، أستخدم عددًا من البادئات الأخرى:k للثوابت، وE للتعدادات، وg للقيم العالمية، وs للإحصائيات.

لقد كنت أستخدم هذا الأسلوب منذ حوالي 12 عامًا.

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

@synthesize employee = _employee;

أنا أكتب هذا:

ddsynthesize(employee);

إنه ماكرو بسيط يستخدم لصق الرمز المميز لإضافة شرطة سفلية إلى الجانب الأيمن:

#define ddsynthesize(_X_) @synthesize _X_ = _##_X_

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

إلى جانب ما قيل هنا، تأكد من قراءة وثائق Cocoa حول التسمية المتوافقة مع Key Value Observing.إن اتباع هذا النمط بدقة سيساعدك بشكل كبير على المدى الطويل.

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