グローバル変数とその誤用に関する議論は、それに一定の独断的な口調を持っているようです。「グローバルは悪い」という概念に異議を唱えるためにここにいるわけではありません。なぜグローバルが悪いのかが私には理にかなっているからです。ただし、スコープの高い変数とオブジェクトをコードから効果的にリファクタリングする方法を正確に示す興味深いコードスニペットがあるかどうか疑問に思いました。この質問では、「簡単なので、ここでグローバル変数を使用する必要がある」という一般的で有用な解決策の例またはパターンを探しています。
これは架空の、おそらく考案された例です。関数に送信されたパラメーターを追跡するためにグローバル変数を使用しています。そして、チェーンのさらに下流で障害が発生した場合は、グローバル変数のパラメーターを使用して、戻って関数を再度呼び出すことができます。
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);
}
}
}