Порядок методов в любом классе - PullRequest
2 голосов
/ 31 мая 2009

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

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

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

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

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

- (NSPersistentStoreCoordinator *)pscMock {
    ...
}

-(void)mockOutXMLStoreForInMemoryStore {
    ...
}

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

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

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

Ответы [ 5 ]

4 голосов
/ 31 мая 2009

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

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

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

3 голосов
/ 31 мая 2009

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

2 голосов
/ 31 мая 2009

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

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

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

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

1 голос
/ 30 июля 2009

У меня тоже была эта проблема. Я попытался сгруппировать методы, основанные на роли класса. Такой подход на самом деле не работает, потому что он оставляет много вещей без внимания. Недавно я начал использовать следующие соглашения для 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 s в заголовочном файле. Пока я их заказываю по управлению памятью:

//IBOutlets
//other non-retained objects (eg delegates - these can most likely be labeled IBOutlet too)
//primative data types (no mm responsibilties)
//retained objects
1 голос
/ 31 мая 2009

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

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

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

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

...