すべてがグローバルな変数スコープの前にプログラマは何をしましたか?


40

だから、メインメソッド、変数を定義するいくつかのデータ型があり、型を返さないサブプロシージャ(本質的に無効なメソッド)を持つ能力がある、一見古風な言語(PowerOnと呼ばれる)に対処する必要があります議論も受け入れません。 ここでの問題は、すべてがグローバルであることです。 私はこれらのタイプの言語を読みましたが、ほとんどの本は「わかりました、私たちは馬と馬車を使用するために使用しますが、今、ここに車がありますので、それで作業する方法を学びましょう!」私たちはあの日を決して思い出しません。私は認めなければならない、心は範囲と範囲外で考えることに苦労しています。

よくここにいます。私は、いくつかのオープンなメソッドでグローバル変数のみを管理する最善の方法を見つけようとしています。forうん、ループのイテレータでさえグローバルに定義する必要があり、コードのさまざまな部分でリサイクルしていることに気づきました。

私の質問:このタイプの経験がある人のために、プログラマーはグローバルな競技場で大量の変数をどのように処理しましたか? 私はそれが精神的なジャグリングのトリックになったと感じていますが、既知のアプローチがあるかどうか知りたいと思います。


71
彼らはたくさん祈りました。
ロバートハーベイ

15
bob_dog_fur_colour同じ名前にヒットする可能性を減らすために、スコープに近似する非常識な変数名などを想像できます。
ラッティ

12
彼らは、範囲がより狭いプログラムを作成し、多くのバグを抱えています。
チャールズE.グラント

12
@Lattyware、実際には昔に戻って、変数名をどのように記述できるかについて非常に制限されていました。一部の言語では1文字または2文字の変数名しか使用できませんでしたが、他の言語では8文字までしか使用できませんでした。コンパイラーは限られた量のメモリーに絞ることができました。
チャールズE.グラント

17
彼らは、より良いプログラミング言語...考案
WIM

回答:


44

あなたはそれをまっすぐに保つために、ある種の精神的な簿記のトリック(命名規則など)が必要になるでしょう。また、文書、文書、文書。すべての変数はグローバルなので、可能であれば、すべての変数がリストされた単一のドキュメントを用意します。

常に一時的に使用する少数の変数を用意し、それらは一時的なものであることを忘れないでください。同じものを絶えず再利用することで、それらが有効かどうかを追跡する習慣がつきます。

また、ドキュメントを参照して、変数名の長さ、および実際に一意の文字数を確認する必要があります。PowerOnについては何も知らないが、グローバルスコープしか持たないほど古風なものであれば、識別子の一意性の長さが制限されている可能性があります。

以前に長い識別子で物事を見てきましたが、その識別子は最初の8文字でのみ一意でした。したがって、RonnyRayGunとRonnyRayBlasterを使用できますが、これらは実際には同じ変数です。このような場合、誤って衝突する可能性が低くなるように、変数名を「固有の」制限以下に保つことをお勧めします。


4
+1:アセンブリを作成するとき、私は通常、レジスタに名前を付けると名前がグローバルであるという点でいくつかの同じ問題に直面しますここでは関係ありません)。一時的な値専用のレジスタをいくつか用意することで、作成する変数の数を抑えることができ、すべてを頭に入れやすくなります。各関数が使用する変数(最も重要なのはそれが変更する変数)を文書化すると、全体像を正しく把握するのに役立ちます。
レオ

53

データ辞書。

中央リポジトリ(通常はリードプログラマーのオフィス)には、各グローバル変数ごとに1ページを含む、ルーズリーフバインダーがありました。このページは、名前、その定義、目的、およびどのルーチンがそれを設定または使用したかを示しました。

微細なRAMを備えた初期の組み込みシステムには、同様の問題と解決策がありました。リードプログラマーは、マスターRAMマップを個々のバイトまで維持し、どのRAMがどのモジュールでどの目的で使用されたかを示しました。専用のRAM割り当てを必要とするプログラマーは、リードプログラマーに行きました。プログラマーは、問題について議論した後、適切なノートブックエントリを作成し、男にRAMを渡しました。(リードプログラマーでRAMバイトをクリアせずにRAMバイトを取得したプログラマーの立場になりたくありませんでした。これを信頼してください。)

この問題は、初期バージョンのBASICでプログラマが大規模なシステムを構築する必要があるときにも発生しました。Info(ニュージャージー州のHenco、Inc.の製品-今はすっかり消えてしまった!)と呼ばれる非常に原始的な「データベース」マネージャーを使用しているときに個人的に現れました。これらの言語は両方とも、変数名の語彙が非常に限られていた。


私は非常によく似た状況にあります。それは、機能のようなプログラミングに沿って、言語がデータベースと直接インターフェースする「データベース」マネージャーのようなものです。これは非常に役立ちます
チャドハリソン

1
私は... BASICや変数が2文字より長い名前を持つことができなかった学習、そしてかなりのプログラムでそれらを追跡した場合には、バックを思い出させる
ケビン・ルービン

@KevinRubin、私に思い出させないでください。ビル・クリントンが言って使用されるようにああ...、昔痛みを感じる
ジョン・R. Strohm

8

ブロックスコープを備えたプログラミング言語の台頭は、より高速で大型のマシンの出現と一致しましたが、それは偶然ではありません。初期のコンピューターのRAMは、MB、kB、またはバイト単位で測定されていました。プログラムが大きくなったときに混乱するほど多くの変数を持つことさえできませんでした。プログラミング言語の進歩は通常、アリーナがさらに大きくなったときに古いプログラミング習慣が拡大しないことを人々が認識したときに行われました。ブロックスコープは、プログラマが自分の限られたメモリに対して防御するメカニズムとして考案されました。

コンピューティングはまた、コンピュータコンピューティングが非常に高価な場合にははるかに希少でエキゾチックな活動でした。最初は、特に数学的に傾いて独創的な個人だけがプログラマーになった可能性があります(ただし、そのような比較はテストするのは非現実的であり、確かに政治的に扇動的です)。初期の頃、ソフトウェアは通常、コンピューターに同梱されて無料で出荷されていました。機関ユーザーが独自のプログラムを作成しようとする考えさえ、最初は不明でした。


どれくらい前に話をしていますか。個人的には、80年代前半から、60Kを超えるラベルを含む「データプール」(つまり、グローバル変数リスト)を備えたいくつかのミニコンピューターを見てきました。
エヴァンプライス

-1:初期の頃は、コンピューターにアクセスするために毎月のレンタル料を支払っただけでなく、プログラムで使用したCPUサイクルとメモリの支払いもしていました。ソフトウェアは無料とはほど遠いもので、ソフトウェアの実行はさらに少なくなりました。
mattnz

1
@mattnz:しばらく前に、ソフトウェアはしばしばバンドルされていましたが、これは無料のものとは多少異なります。通常、コンピューターを必要とする企業は、コンピューターを購入またはレンタルし、マシンの実行に料金を支払うことはありませんが、多くの場合、個々のユーザーに課金されます。私は、人々が自分のソフトウェアを書くことを期待されていなかったというOPの主張にも困惑しています。なぜなら、それは確かに私の経験ではなかったからです。コンピューターを買う余裕があれば、開発スタッフを買う余裕があり、実際には多くの缶詰ソフトウェアはありませんでした。
デビッドソーンリー

単一スコープのプログラミングの問題は、コンピューターが数メガバイトのメモリーを使用するずっと前に、かなり早く認識されました。ALGOL、レキシカルスコープを持つ最初の言語は、1958年に登場
ケビン・クライン

4

それは何年も前のことです(思い出の泡:))。

あなたが参照する言語はわかりませんが、一般的に私たちは持っていたものに適応しました。それほど大きな問題ではありませんでした。mIORead1ファイル1からデータを読み取るハンドラーがある場合や、さまざまなものがある場合など、サブまたは関数への参照を含む(短い形式では当時のバイト数が貴重だった)変数名によく注意を払う必要がありましたi、j、kなどのカウンター変数。これらは、独自のシステムによって、それが何のためにあるか、再利用できるかどうかなどを知っていました。それはよりハードコアでした(当時はヘルメットも手袋もありませんでした):-)


3

これは、PLCプログラミングとかなり似ていますが、最近のPLCでは、プログラムに対してローカルな「タグ」(別名変数)を使用できるようになりました。それでも、多くの人はすべてのグローバルタグを使用してプログラムします。

あなたがそうするつもりなら、構造化された命名規則を使用する必要があることがわかりました。たとえば、次のとおりMotor1_DriveContactor_Runです。使用している言語が構造(ユーザー定義型とも呼ばれる)をサポートしている場合は、それらを使用して、次のような構造化データ階層を作成することもできますMotor[1].DriveContactor.Run

これにより、すべてが整理され、通常、インテリセンスは適切に機能します。


2

実際、すべてがグローバルなAuthorwareと呼ばれる言語でプログラミングすることを学びました。幸いなことに、配列があり、特定のポイントの後、リストと呼ばれるものがありました。これは汎用オブジェクトに似ていました。

Authorwareプログラムには実際に物理構造があり(Authorwareはフローチャートのメタファーに基づいていました)、そのスクリプト言語は古いスタイルのPascalに基づいていました。行ったのは、物理構造を配列内のインデックスに関連付けることでした。多くの場合、配列インデックスには、使用している物理的部分のローカルオブジェクトとして扱うリストが含まれます。

Authorwareはeラーニング用に設計されたため、私たちが持っていたアイコンの1つはページでした。ページはフレームワークに添付されます。そのため、ページ1では、インデックス1(Authorwareには1のインデックスが付けられています)の配列を調べ、そのページのデータを引き出します。このデータは、擬似オブジェクトとして機能するListに格納されます。ページには、名前でオブジェクトの「プロパティ」を引き出すロジックがあります。オブジェクトのようなものは持っていないが、配列は持っているのであれば、単純に、どのデータがどこに行くのかという慣習があります。

データベースからデータを取得して依存関係の注入を実行するときとまったく違いはありませんが、すべてが本当にグローバルであり、すべてを小さなボックスに入れて、自分だけを見るという選択をしているだけです今すぐに再懸念。

あなたがしようとしていることとあなたの言語がサポートしているものに応じて、これは少なくとも物事をより管理しやすいチャンクに分解するのに役立つかもしれません。


また、@ amy-blankenshipというMacromedia Authorwareとも協力しました。最後に作業したときのバージョン、おそらく3を覚えていません。Flash/ Showckwaveに置き換えられましたか、それともまだ存在しますか?
Tulainsコルドバ

それらは異なるものでした。Macromediaは、Web用にパッケージ化されている場合、Directorを含むShockwaveのすべてを呼び出すことで、バージョン5(両方)で多くの混乱を引き起こしました。Authorwareは買収後にAdobeによって廃止されましたが、Flashはまだ継続中です。
エイミーブランケンシップ

1

私が大学にいたとき、私たちは「グローバル変数の問題」-多くのグローバル変数によって引き起こされるバグとコード保守の問題のコレクションについて長々と教えられました。

一部の変数は他の変数よりも危険です。

安全:制御フローに影響を与えない変数(LastNameなど)

Dangerous:プログラムの制御フローに影響を与える変数(DeliveryStatusなど)

最も危険な最初:

  • 複合ステータス(モードおよびサブモード)
  • 複合値(合計、小計)
  • 単一のステータス(モード)
  • 単一値(カウント)

「グローバル変数の問題」を回避するには、以下を行う必要があります

  • 各変数と関数を文書化します。
  • ソース変数の同じセクションで、関連する変数を(それらを使用するコードで)近づけてください。
  • 「危険な」変数を非表示にして、他のプログラマーが自分の存在を知らないようにします。特にコードの他のセクションでは、直接使用しないでください。
  • 危険な変数を読み書きする関数を提供します(他のプログラマが必要としないように)。

コード構造化するには、言語で構造が使用できない場合、コメントと命名規則を使用します。

/* --------------------------- Program mode ------------------------ */

var Mode_Standard = 1;      // Normal operation (SubMode unused)
var Mode_Backup   = 2;      // Backup mode      (SubMode is backup device)

var BackupMode_Disk = 1;    // SubMode: Backup to disk
var BackupMode_Tape = 2;    // SubMode: Backup to tape

var MainMode = Mode_Standard;
var SubMode = 0;

function Mode_SetBackup(backupMode)
{
    MainMode = Mode_Backup;
    SubMode = backupMode;
}

function Mode_SetStandardMode()
{
    MainMode = Mode_Standard;
    SubMode  = 0;
}

function Mode_GetBackupMode()
{
    if (MainMode != Mode_Backup)
        return 0;

    return SubMode;
}

/* --------------------------- Stock Control ------------------------ */

var Stock_Total =  123;      // Total stock       (including RingFenced)
var Stock_RingFenced = 22;   // Ring-fenced stock (always less than total)

// Adds further ring-fenced stock 
function Stock_AddRingFenced(quantity)
{
    Stock_Total      += quantity;
    Stock_RingFenced += quantity;
}

/* ------------------------- Customers ----------------------- */

var Customer_FirstName = "Tony";
var Customer_LastName  = "Stark";

0

彼らがどうしたか分からない。

しかし、現代のOOP言語には、命名の衝突に関して非常によく似た問題があったと思います。

ソリューションは名前空間を採用しています。これは抽象的な概念ですが、いくつかの実装(Javaパッケージ、.NET名前空間、Pythonモジュール)で広く採用されています。

使用している言語の命名の長さに関する制限が狭すぎない場合は、適切な変数の命名に名前空間を適用できます。

したがって、変数名は変数スコープも表します。

このような命名パターンを定義しよう:order_detail_product_codeorder_detail_product_unit_price。または、一時的なカウンターまたはスワップの場合:tmp_itmp_swap


0

言語では、すべての変数はグローバルでした(私はいくつか使用しました)。たとえば、変数をグローバルとして実際に使用したい場合は、「m_」または「_」プレフィックスを使用します。もちろん、これはまだこの規律を持っている開発者に依存しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.