Порядок использования методов внутри любого класса

StackOverflow https://stackoverflow.com/questions/930823

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

- (NSPersistentStoreCoordinator *)pscMock {
    ...
}

-(void)mockOutXMLStoreForInMemoryStore {
    ...
}

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Я всегда заказываю свои методы следующим образом :

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

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

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

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

//IBOutlets
//other non-retained objects (eg delegates - these can most likely be labeled IBOutlet too)
//primative data types (no mm responsibilties)
//retained objects
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top