2009-07-22 4 views
0

У меня есть данные, загружаемые с сервера, но нет никакой гарантии, что у меня будет все это, когда пользовательский интерфейс начнет отображать его пользователю. В каждом кадре есть функция тика. Когда новые данные получены, флаг устанавливается, поэтому я знаю, что пришло время загрузить его в мою структуру данных. Какой из следующих способов - более разумный способ решить, когда фактически запустить функцию?Решение о том, запускать ли функцию, какой путь лучше?

AddNewStuffToList() 
{ 
    // Clear the list and reload it with new data 
} 

Foo_Tick() 
{ 
    if (updated) 
     AddNewStuffToList(); 

    // Rest of tick function 
} 

Versus:

AddNewStuffToList() 
{ 
    if (updated) 
    { 
     // Clear the list and reload it with new data 
    } 
} 

Foo_Tick() 
{ 
    AddNewStuffToList(); 

    // Rest of tick function 
} 

я пропустил много нерелевантные деталей для примера.

ответ

1

ИМХО первые один. Эта версия разделяет:

  • , когда для обновления данных (Foo_Tick)

ИЗ

  • как загрузка данных (AddNewStuffToList()).

2-й вариант, просто смешивающий все вместе.

0

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

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

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

0

В первой версии будет проверяться простая проверка переменных «обновлено», и только если true будет вызываться AddNewStuffToList.

Со второй версией вы вызываете AddNewStuffToList, а затем проверяете «обновлять» каждый раз.

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

Однако есть ситуации, когда проверка внутри функции будет лучше. , например.

doSomething(Pointer *p){ 
    p->doSomethingElse(); 
} 

FooTick(){ 
    Pointer *p = new Pointer(); 
    // do stuff ... 
    // lets do something 

    if (p){ 
    doSomething(p); 
    } 
} 

Это clumbsy потому, что каждый раз, когда вы звоните DoSomething вы должны действительно проверить вы не переходящие в плохом указателе. Что, если это будет забыто? мы можем получить нарушение доступа. В этом случае лучше, так как вы только записываете чек в одном месте и нет лишних накладных расходов, потому что мы всегда хотим, чтобы мы не проходили по плохой указатель.

doSomething(Pointer *p){ 
    if (p){ 
    p->doSomethingElse(); 
    } 
} 

Так что в целом это зависит от ситуации.Нет правильных и неправильных ответов, здесь просто плюсы и минусы.

Смежные вопросы