Лучшая практика для конденсации кода?

Если у вас есть код (objective-c) в методе, который вы хотите сконденсировать на один вызов (для краткости или читаемости), что является предпочтительной практикой.

  • не делайте этого, сохраняйте все связанные коды в методе.
  • Добавить новый метод для объекта, о котором идет речь, т.е. - (NSString *) formatedTime;
  • Функции C-Style, определенные вне объекта, о котором идет речь.
  • Другое, что-то я пропустил.

Ответ 1

Мое основное правило, когда переписывающий код всегда обеспечивает то, что я пишу, максимально читаем. Имея это в виду, я обычно:

  • Сохраняйте весь код в методе только в том случае, если он относительно короткий (подходит на экране или два) и все логически связаны
  • Добавить новый метод, если имя нового метода сделает его более читаемым, уменьшит дублирование кода или сделает поток более понятным для читателя.
  • Избегайте функций C-стиля, если не имеете дело с чем-то очень низким уровнем или в контексте других функций стиля C; в основном сохраняйте стиль кода, который вы переписываете.
  • Прежде всего попробуйте убедиться, что метод, который был переписан, все еще имеет смысл, делает то, что он должен был делать (т.е. не было введено ошибок), и его можно быстро прочитать и понять другим разработчиком

Ответ 2

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

@interface MyClass()
- (CGRect)makeRect;
- (NSString*)formatStringFromInput:(NSString*)input;
@end

@implementation MyClass

//Implementation here

@end

Ответ 3

Это похоже на подсказку johnw188, но идет немного дальше:

В расширении класса вы можете не только иметь частные методы, но и частные свойства.

@interface MyClass()
@property(retain) MyOtherClass *aNotherObject; //declared in .h. Should be @private
- (CGRect)makeRect;
- (NSString*)formatStringFromInput:(NSString*)input;
@end

@implementation MyClass
@synthesize aNotherObject;

//Implementation here

-(void)dealloc
{
    self.aNotherObject = nil;
    [super dealloc];
}

@end

Выгода совершенно очевидна: вы получаете свойство @property/@synhesize, но получаете доступ только к нему с помощью объекта класса. частные свойства доступны только на self.