2009-09-04 2 views
4

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

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

public var myGlobalState:Object = new Object(); 

public function addPerson (name:String, person:Object, personCount:int, retryCount:int):void 
{ 
    myGlobalState = null; // Clear out old values 

    myGlobalState = new Object(); 
    myGlobalState.name = name; 
    myGlobalState.person = person; 
    myGlobalState.personCount = personCount; 
    myGlobalState.retryCount = retryCount; 

    person.userId = personCount + 1; 
    person.name = name; 

    savePerson(person); 
} 

public function savePerson (person:Object):void 
{ 
    // Some code that attempts to save the person object properties to a database... 
    // The process returns a status code for SUCCESS of FAILURE. 

    // CODE TO SAVE TO DATABASE .... 

    // Return status code... 

    if (status == "fail") 
    { 
     // Retry at least once by calling the addPerson function again 

     if (myGlobalState.retryCount < 3) 
     { 
      addPerson (myGlobalState.name, person, myGlobalState.personCount, myGlobalState.retryCount); 
     } 
    } 
} 

ответ

10

У меня нет фрагмента, но у меня есть пример реального мира. Линейные калибровочные константы (поле масс-спектрометрии) в приложении были глобальными, и был сложный код хранить и восстанавливать глобальные калибровочные константы для различных спектров. Использование двух значений было распределено по всей программе , и было сложно изменить или проверить , что преобразование между некалиброванной и откалиброванной массой значений с использованием двух констант было правильным во всех случаях.

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

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

1

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

This question также поможет.

P.S. В вашем конкретном сценарии глобальная переменная вообще не нужна - вы можете легко передать ее как параметр в метод addPerson.

+0

В вашем конкретном сценарии глобальная переменная вообще не нужна - вы можете легко передать ее в качестве параметра для метода addPerson.
То, что я немного смущен. Будет ли это необязательным параметром? Так должно было бы быть что-то вроде public function addPerson (name: String, person: Object, personCount: int, retryCount: int, callBackParams: Object = null): void где callBackParams ведет себя так же, как myGlobalState в моем примере? –

+0

Это один из способов сделать это –

4

Быстрое решение было бы путем добавления всех глобальных переменных внутри одного огромного объекта, возможно, с несколькими дочерними объектами для разделения групп данных. Со всеми этими переменными в одном объекте вам понадобится только одна глобальная переменная для хранения этого объекта. Затем весь ваш код будет ссылаться на переменные в этом объекте, а не на глобальные переменные.

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

Как только все глобальные данные исчезнут, вы можете подумать о реорганизации своего кода, пытаясь оптимизировать этот общий объект, например. разделяя его на несколько меньших объектов. Но, перемещая все внутри одного объекта, вы все упростите управление.

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