2009-05-30 6 views
2

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

Это может показаться глупым вопросом, но в каком порядке я должен использовать свои методы? Функционально, конечно, это неважно, но макет имеет огромное значение. Поэтому скажем, что у нас есть следующий код в одном классе:

-(void)testCreateProjectWithStartDate { 
    [self setUpTestCreateProjectWithStartDate]; 
    ... 
} 

-(void)setUpTestCreateProjectWithStartDate { 
    testMOC = [self setUpInMemoryStore]; 
    [self mockOutXMLStoreForInMemoryStore]; 
} 

- (NSManagedObjectContext *)setUpInMemoryStore { 
    ... 
    NSPersistentStoreCoordinator *coordMock = [self pscMock]; 
    ... 
} 

- (NSPersistentStoreCoordinator *)pscMock { 
    ... 
} 

-(void)mockOutXMLStoreForInMemoryStore { 
    ... 
} 

У меня есть методы, упорядоченные в том порядке, в котором они вызывается? Что делать, если метод вызывается из двух мест внутри класса?

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

Какой порядок методов имеет смысл?

+0

Этот язык вы спрашиваете? – 2009-05-30 23:08:06

+0

На самом деле это вопрос агностики языка, но я кодирую Objective-C. –

ответ

2

У вас есть несколько вариантов, чтобы группировать методы:

  • По функциональному назначению (то есть методы, которые нуждаются друг друга близко друг к другу)
  • По видимости (например, открытые методы, объявленные в интерфейсе прийти первым)
  • по названию (например, методы просто сортируются по их имени)

Лично я предпочитаю групповые методы по их функциональности, так что не нужно прыгать слишком далеко, если я след поток. С современными IDE, которые делают прыжок для вас, это уже не большая проблема.

В вашем конкретном примере может потребоваться уменьшить количество методов для повышения удобочитаемости. Если ваши методы очень короткие (2-3 строки) и вызывается только из одного места, вы можете встроить код и опустить некоторые методы.

+0

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

1

Я всегда заказываю свои методы, как это:

первого конструктор/деструктор, затем аксессор, затем и другие методы, упорядоченных по важности.

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

То же самое для общедоступных/защищенных/закрытых: сначала публично, поэтому все, что можно использовать из других файлов, быстро отображается при открытии файла.

+0

Мне нравится это объяснение. Но мне любопытно, как вы можете судить о том, что одна функция важнее другой. – Martin

4

Я нашел это более верным методам, чем классам, но я думаю, что это потому, что я просто не делаю этого достаточно: держите его достаточно коротким, и такие вопросы исчезают.

Итак, для методов - уже давно возникают вопросы о том, нужно ли инициализировать все переменные в верхней части или инициализировать их рядом с тем, где они используются (ответ находится рядом с тем, где они используются, fwiw) - но если вы держите свои методы достаточно короткими, это просто не имеет значения. Рядом с ними они находятся : наверху.

То же самое, по крайней мере теоретически, для классов: держите их достаточно короткими, а внутренняя организация просто не имеет значения (предельный и невозможный случай: всего один метод для каждого класса, он автоматически в любом порядке, который вы заявляете). Если у ваших классов есть так много методов, которые вам интересно, как организовать - подумайте об извлечении некоторых методов, которые принадлежат друг другу в свой класс. Меньше - лучше.

3

Похоже, что я не являюсь окончательным ответом на это, если у вас нет стандарта для вашего проекта/рабочего места. Лично, если я не следую другому стандарту, сначала поставлю конструктор (ы), а затем деструктор (ы). После этого я просто помещаю их в алфавитном порядке по имени метода. Я немного динозавр (я программировал со времени администрации Картера), поэтому я принял алфавитный подход к функциям, прежде чем я когда-либо слышал об объектно-ориентированном программировании и просто перенес его, когда начал создавать объекты.

1

У меня тоже была эта проблема. Я попытался сгруппировать методы, основанные на роли класса. Этот подход действительно не работает, потому что он оставляет много вещей без присмотра. Я недавно начал использовать следующие условные обозначения для Objective-C:

методы в порядке убывания размера аудитории за исключением initialize, init, dealloc, awakeFromNib и удобство методов (т.е. методов класса, которые возвращают авто выпустили экземпляр класса).

//initialze, init, dealloc, awakeFromNib 
//convenience methods 
//properties 
//IBActions 
//General public methods 
//Delegate methods (eg NSResponder, NSTableview etc) 
//Binding and notification call back methods 
//private methods 

Я все еще не 100% уверен, как заказать ivar с в заголовочном файле. В настоящее время я заказываю им ответственность за управление памятью:

//IBOutlets 
//other non-retained objects (eg delegates - these can most likely be labeled IBOutlet too) 
//primative data types (no mm responsibilties) 
//retained objects 
+0

Я только что нашел этот пост, который обсуждает организацию проекта xcode и включает раздел о методах в файле: http://kosmaczewski.net/200/2009/07/28/code-organization-in-xcode-projects/ –

Смежные вопросы