Порядок использования методов внутри любого класса
-
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%, как сделать заказ 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