вид как свойство альтернативного объекта модели

Я создаю арифметическое приложение, и в нем есть подклассы NSObject для чисел и цифр. Оба из них имеют соответствующие объекты представления, которые принимают источник данных (число или цифру) и делегат, контроллер представления.

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

Например, класс Number имеет свойство NSMutableArray, которое содержит его цифры.

Если я хочу найти размер для соответствующего NumberView, я могу написать такой код в контроллере:

-(void) updateNumberViewFrameSize:(ACNumberView*) sender
{
    NSUInteger i;
    float width = 0, height = 0;
    for (ACDigit* digit in [sender.dataSource returnNumberViewDataSource].digitArray)
    {
        width += digit.digitView.size.width;
        height += digit.digitView.size.width;
    }
    sender.frame = CGRectMake(sender.frame.origin.x, sender.frame.origin.y, width, height);
}

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

Если это плохая практика, каковы потенциальные ловушки и есть ли лучший способ достичь этого типа?


person chartman    schedule 13.05.2013    source источник


Ответы (1)


Первый: Вы правы. Это не хороший дизайн.

Во-вторых: вы вычисляете размер числового представления внутри модели. Но числовое представление должно само знать свой размер. Он знает номер через свой источник данных и может получить цифры. Так что у него есть вся информация для расчета его размера.

Чтобы показать проблему, просто представьте (даже эта ситуация не так распространена на iOS), что вы отображаете одно и то же число в двух местах (= с разными представлениями чисел). Это нарушит вашу модель. Почему?

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

person Amin Negm-Awad    schedule 13.05.2013
comment
Хороший пример того, почему это неправильно. Может ли представление получить доступ к своим подпредставлениям? - person chartman; 13.05.2013
comment
Вы правы, гораздо лучше просто рассчитать размер представления для числа на основе того, что оно должно в нем хранить, а не получать данные из представлений. - person chartman; 15.05.2013