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

Създавам аритметично приложение и в него има подкласове на 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