Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как вы называете свои значения экземпляра/параметра?
Будучи новичком в Objective-C (но долгосрочный программист C/++) я ищу советы/рекомендации по соглашениям об именах для переменных.
Мое личное предпочтение было бы использовать префикс для переменных экземпляра как для Ясности внутри функций, так и для предотвращения затенения параметров функции. Однако я поклонник свойств, которые исключают префиксы (если вы также не добавляете префиксы именам свойств, что не слишком хорошо работает и выглядит глупо). Точно так же я мог бы использовать соглашение "self.variable", но только если я сделаю EVERYTHING свойством.
Итак, учитывая приведенный ниже код, каков ваш предпочтительный стиль именования для переменных экземпляра / функции? И если вы не беспокоитесь, как вы справляетесь с затенением на парах функций?
@interface GridItem : NSObject
{
CGRect _rect;
...
}
@end
-(void) initFromRect:(CGRect)rect
{
_rect = rect;
...
}
Ваше здоровье!
Большинство проектов Cocoa используют underbar в качестве префикса переменной экземпляра не IBOutlet и не используют префикс для переменных экземпляра IBOutlet .
Причина, по которой я не использую underbars для переменных экземпляра IBOutlet , заключается в том, что при загрузке файла nib, если у вас есть метод setter для подключенной розетки, будет вызван setter. Однако этот механизм не использует кодирование ключ-значение, поэтому IBOutlet, чье имя имеет префикс нижней панели (например , _myField ), не будет установлен, если setter не будет назван точно так же, как розетка ( например , set_myField:), что является нестандартным и грубым.
Кроме того, имейте в виду, что использование свойств типа self.myProp -это не то же самое, что доступ к переменным экземпляра. Вы отправляете сообщение , когда используете свойство, точно так же, как если бы вы использовали скобочную нотацию, например [self myProp] . Все свойства дают вам краткий синтаксис для указания как getter, так и setter в одной строке, и позволяют синтезировать их реализацию; они фактически не замыкают механизм отправки сообщений. Если вы хотите получить доступ к переменной экземпляра напрямую, но префиксировать ее с помощью self , вам нужно рассматривать self как указатель, как self->myProp , который на самом деле является доступом к полю в стиле C.
Наконец, никогда не используйте венгерскую нотацию при написании кода Cocoa и уклоняйтесь от других префиксов, таких как "f" и "m_" — это будет означать, что код был написан кем-то, кто не знает "get it", и вызовет подозрение у других разработчиков Cocoa.
В общем, следуйте рекомендациям руководства по кодированию для документа Cocoa в Apple Developer Connection, и другие разработчики смогут подобрать и понять ваш код, и ваш код будет хорошо работать со всеми функциями 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 и в getter и setter для свойства.
Я следую совету Криса Хансона в отношении префикса подчеркивания ivar, хотя признаю, что я также использую подчеркивание для IBOutlets. Однако недавно я начал перемещать свои объявления IBOutlet в строку @property , согласно предложению @mmalc's . Преимущество заключается в том, что все мои ивары теперь имеют символ подчеркивания и стандартные сеттеры KVC называются (т. е. setNameField: ). Кроме того, имена розеток не имеют подчеркивания в Построителе интерфейсов.
@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
Вы можете использовать префикс underbar на вашем ivars и все еще использовать не-underbar имя для ваших свойств. Для синтезированных аксессоров просто сделайте это:
@synthesize foo = _foo;
Это говорит компилятору синтезировать свойство "Foo", используя the_foo Ивар.
Если вы пишете свои собственные методы доступа,то вы просто используете underbar ivar в своей реализации и сохраняете имя метода, не являющегося underbar.
Лично я следую соглашениям об именовании Cocoa, используя camel-casing для функций и переменных и заглавные camel-casing для имен объектов (без ведущего NS, конечно).
Я нахожу, что префиксация типов делает код более непрозрачным для тех, кто его не писал (так как все неизменно используют разные префиксы), и в современном IDE не так уж трудно определить тип чего-то.
С введением свойств я не вижу необходимости в префиксе "_" к переменным экземпляра класса. Вы можете установить простое правило (описанное в вашем заголовочном файле), что любые переменные, которые будут доступны вне класса, должны быть доступны через свойство или с помощью пользовательских методов в классе, чтобы повлиять на значения. Это мне кажется гораздо чище, чем иметь имена с "_", наклеенными на них спереди. Он также правильно инкапсулирует значения, чтобы вы могли контролировать, как они изменяются.
Эндрю: на самом деле есть много разработчиков Cocoa, которые вообще не используют префиксы переменных экземпляра. Это также чрезвычайно распространено в мире Smalltalk (на самом деле, я бы сказал, что в Smalltalk почти неслыханно использовать префиксы для переменных экземпляра).
Префиксы переменных экземпляра всегда поражали меня как C++ - изм, который был перенесен в Java, а затем в C#., поскольку объективный мир C был в значительной степени параллелен миру C++, где, поскольку миры Java и C# являются его преемниками, это объясняет разницу "cultural", которую вы можете увидеть на этом между различными наборами разработчиков.
Я не люблю использовать подчеркивания в качестве префиксов для любых идентификаторов, потому что C и C++ оба оставляют определенные префиксы подчеркивания для использования реализацией.
Я думаю, что использование "self.variable" уродливо.
В общем случае, я использую не украшенные идентификаторы (то есть никаких префиксов или суффиксов) для переменных, например. Если ваш класс настолько сложен, что вы не можете запомнить переменные экземпляра, вы в беде. Поэтому для вашего примера я бы использовал "rect" в качестве имени переменной экземпляра и "newRect" или "aRect" в качестве имени параметра.
Хотя я люблю использовать префикс подчеркивания для ivars, я ненавижу писать @synthesize строк из-за всего дублирования (это не очень DRY ). Я создал макрос, чтобы помочь сделать это и уменьшить дублирование кода. Таким образом, вместо:
@synthesize employee = _employee;
Я пишу это:
ddsynthesize(employee);
Это простой макрос, использующий вставку маркеров для добавления подчеркивания в правую сторону:
#define ddsynthesize(_X_) @synthesize _X_ = _##_X_
Единственным недостатком является то, что он будет путать инструмент рефакторинга Xcode, и он не будет переименован, если вы переименуете свойство с помощью рефакторинга.
Мой стиль гибридный и действительно пережиток от PowerPlant дней:
THe наиболее полезными префиксами, которые я использую, являются "in" и "out" для параметров функции / метода. Это поможет вам сразу узнать, для чего предназначены параметры, и действительно поможет предотвратить конфликты между параметрами метода и переменными экземпляра (сколько раз вы видели конфликт параметра "table" с переменной экземпляра с тем же именем). E.g.:
- (void)doSomethingWith:(id)inSomeObject error:(NSError **)outError;
Затем я использую голое имя например переменные и имена свойств:
Затем я использую "the" в качестве префикса для локальных переменных: theTable, theURL и т. д. Опять же, это помогает различать локальные переменные и переменные экземпляра.
Затем, следуя стилю PowerPlant, я использую несколько других префиксов: k для констант, E для enums, g для глобалов и s для статики.
Я использую этот стиль уже около 12 лет.