Насколько это плохо теоретически, если каждый класс будет включать в себя любой другой класс? - PullRequest
0 голосов
/ 28 августа 2009

Представьте себе приложение для iPhone с 30 классами. Каждый класс должен взаимодействовать друг с другом, поэтому каждый класс включает в себя 29 других классов + базовый каркас.

Я хочу понять, что именно происходит, когда включаю класс. Это дублирует размер в памяти для этого класса в приложении? Это вредно для памяти и производительности на iPhone? Может быть, кто-то знает это подробно и может объяснить.

Пожалуйста, пропустите, что это не будет хорошей архитектурой. Это гипотетический вопрос о том, что «включить» влияет на память и производительность.

Ответы [ 4 ]

3 голосов
/ 28 августа 2009

Единственный случай, когда вы можете столкнуться с падением производительности - это во время компиляции. Используя #import "MyClass.h" вместо @class MyClass в заголовке для класса, он будет перекомпилирован при изменении интерфейса с MyClass. Это немного прибавит к вашему общему времени компиляции, которое может сложиться в большом проекте.

РЕДАКТИРОВАТЬ (29.08.2009): я изменил #include на #import в ответе выше, так как он используется в ObjC для предотвращения повторного включения заголовков.

1 голос
/ 28 августа 2009

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

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

Например,

изменение имени одного файла (или класса) означает, что теперь вам нужно пойти и исправить 29 других неверных ссылок на этот путь.

Насколько я знаю, простое включение файла (по крайней мере, на тех языках, с которыми я знаком) не повлияет на вашу производительность.

0 голосов
/ 29 августа 2009

В общем, попытка снизить зависимость - это больше не нужно менять тонну кода при изменении одного класса.

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

Что еще нужно помнить, это то, что есть разница между заголовком и файлом класса. Если вы включаете определение класса из заголовка, который, в свою очередь, включает заголовок, в котором вы находитесь, у вас есть циклическая ссылка, и вам придется объявить одну из ссылок на класс как перенаправленный класс с помощью директивы @class. Фактически стандартом является теоретическое использование «@class» в заголовочном файле и «@import» в реализации, но обычно вы не сталкиваетесь с классами, имеющими ссылки друг на друга, поэтому #import в заголовке работает так же хорошо, и немного меньше печатать.

0 голосов
/ 28 августа 2009

Обычно включение и определение области, ориентация объекта и т. Д. - это всего лишь утилита для программиста. Иллюзия порядка, если хотите. На уровне машинного кода вы можете получить доступ к любой переменной вашего процесса везде. То, что вы должны включать заголовки, которые используются где-то еще в вашей программе, - это только способ, которым создатели языка используют, чтобы ограничить то, о чем вы в настоящее время должны думать, выбрасывать дубликаты и т. Д., И что компилятор может помочь вам проверить, «Описание» программы работает правильно.

Вы увеличиваете свой исполняемый файл, только если добавляете в него что-нибудь. Вы делаете его медленнее, как намекал Evernoob, если вы создаете много экземпляров и т. Д. Просто для того, чтобы сделать типы и определения, «известные» другим классам, не должно вызывать проблем с производительностью во время выполнения, но обычно это увеличивает время компиляции. *

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