Как перенести СУХОЙ (не повторяйтесь) на Objective-C

Я перехожу с Ruby на Objective-C и продолжаю:

NSObject *foo;

@property (nonatomic,retain) NSObject *foo;

в файле .h, а затем в файле .m:

@synthesize foo;

наверху и

[foo release]

в dealloc.

Чтобы добавить foo! Выполняют ли опытные программисты Objective-C все четыре шага вручную каждый раз, когда они хотят добавить новую переменную экземпляра в класс? Я не могу сделать это СУХОЕ?


person Andrew Arrow    schedule 31.07.2009    source источник
comment
Благодаря ARC и автоматическим свойствам теперь вы можете избавиться и от них! А остальное не совсем не СУХОЕ, это просто уродливо, как и многое в Objective-C.   -  person Dan Rosenstark    schedule 21.12.2011


Ответы (6)


Это обычная проблема и для C ++ (удвоение объявлений, хотя, по общему признанию, это немного другое). Короткий ответ: так устроен язык. На самом деле это не идет вразрез с DRY, поскольку каждое утверждение уникально и имеет свою цель. Однако по сегодняшним меркам это, по общему признанию, очень многословно.

person Matthew Vines    schedule 31.07.2009
comment
Просто радуйтесь, что вы не пишете геттеры и сеттеры ... Думайте об этом как о более СУХОМ, чем альтернативы! - person Ben Gotow; 01.08.2009
comment
Как и во всех языках, в Objective-c некоторые вещи доставляют удовольствие, а другие - рутинную работу. - person Matthew Vines; 01.08.2009
comment
@ben на самом деле, если вы хорошо кодируете, у вас нет сеттеров, геттеров или свойств, но большинство людей не очень хорошо программируют (я должен сказать, что у вас нет сеттеров и у вас относительно мало геттеров) - person Bill K; 01.08.2009
comment
@Ben, это не так уж сложно, если вы используете C #: public string Foo { get; set; } ... - person Wim Hollebrandse; 12.01.2010

Эта страница http://pragprog.com/magazines/2010-07/not-quite-new-in-ios- утверждает, что вы можете отказаться от объявления переменной, сократив количество повторов до двух :)

#import <UIKit/UIKit.h>
@interface MoveMeViewController : UIViewController {
}

@property(nonatomic, retain) IBOutlet UIImageView *imageView;
@end
person sam    schedule 27.09.2010

Поскольку вы упомянули, что вы новичок в Objective-C, я хочу убедиться, что вы знаете, что вам не нужно создавать свойства для каждой переменной экземпляра в ваших классах, а на самом деле вам, вероятно, не следует этого делать.

Свойства представляют интерфейс, который ваш класс предоставляет другим классам. Этот интерфейс не обязательно соответствует внутренней реализации класса. В тех случаях, когда они одинаковы, синтаксис объявленных свойств позволяет (относительно) просто выразить это.

Если ваши классы раскрывают большую часть своего внутреннего состояния через свойства, вы можете поближе взглянуть на их дизайн и можете ли вы получить более простой дизайн, перемещая обязанности.

person Mark Bessey    schedule 01.08.2009

Objective-C - это очень тонкий слой поверх C. На низком уровне большая часть "Objective" компилируется до указателей кода, которые вводятся в процесс компиляции C.

Они действительно добавили подсчет ссылок (самая простая система сборки мусора), но из-за ее природы все это делается вручную, отсюда и вызовы «Release».

Версии, отличные от iPhone, добавили настоящую систему сбора мусора, но они не уменьшаются, потому что освобождение не такое детерминированное.

Объекты должны быть небольшими и сфокусированными, а синтаксис свойств не должен быть слишком агрессивным.

person Bill K    schedule 31.07.2009

Да, но я надеюсь, что каждый день кто-нибудь будет придумывать сценарий или что-нибудь для XCode, чтобы автоматизировать это. (Я также предпочитаю

self.foo = nil 

в моих сделках)

person IlDan    schedule 31.07.2009
comment
Apple не рекомендует использовать сеттеры и геттеры в init и dealloc по уважительной причине. Во-первых, объект не полностью определен во время инициализации / освобождения (особенно если он подклассифицирован), и поэтому вызов других методов (включая сеттеры / геттеры) может вызвать некорректное поведение. Рассмотрим случай переопределения установщика или другого объекта, наблюдающего за свойством. - person Peter N Lewis; 01.08.2009
comment
Не могли бы вы указать мне на эту документацию? Трудно поддерживать синхронизацию с обновлениями документов. - person IlDan; 02.08.2009

Вы сможете обойтись без объявления как переменной экземпляра, так и свойства, как только 32-разрядные компьютеры будут забыты, поскольку 64-разрядная среда выполнения может синтезировать переменные экземпляра. Но вы не можете быть полностью СУХИМ на языке, где вещи должны быть объявлены в файле заголовка и реализованы в другом. Язык требует дублирования. Единственный выход - создать метаязык.

Вы можете использовать сценарии, чтобы избежать дублирования ввода одного и того же шаблона переменной снова и снова, но он все равно будет присутствовать в коде.

Кстати, я не думаю, что оператор @synthesize дублирует информацию. Ничто другое в вашем коде не указывает, какие средства доступа используются для получения доступа к собственности.

person Chuck    schedule 31.07.2009