私はいくつかの観察を提供します:
はい、データベースはグローバルな状態です。
実際、あなたが指摘したように、それは超グローバルな状態です。それは普遍的です!その範囲は伴うものか、誰のデータベースに接続します。そして、長年の経験を持つ多くの人々が、データ内の「奇妙なこと」が1つ以上の関連アプリケーションで「予期しない動作」につながったという恐ろしい話をあなたに伝えることができると思います...
グローバル変数を使用することの潜在的な結果の1つは、2つの異なる「モジュール」がその変数を独自の異なる目的で使用することです。そして、その範囲で、データベーステーブルは同じです。同じ問題の犠牲になる可能性があります。
うーん...ここにあるもの:
モジュールが何らかの方法で外部的に動作しない場合、何も実行されません。
有用なモジュールにはデータを指定するか、見つけることができます。また、データを返すことも、状態を変更することもできます。しかし、何らかの方法で外部の世界と相互作用しない場合、何もしないかもしれません。
現在、私たちの好みはデータを受け取り、データを返すことです。ほとんどのモジュールは、外の世界が何をしているかをまったく無視して書くことができれば、簡単に書くことができます。しかし、最終的には、何かがする必要が見つけたデータをと変更、外部、グローバルな状態を。
さらに、実際のアプリケーションでは、データが存在するため、さまざまな操作でデータを読み取って更新できます。一部の問題は、ロックとトランザクションによって防止されます。ただし、原則としてこれらの操作が互いに競合するのを防ぐには、結局のところ、慎重に考える必要があります。(そして間違いを犯す...)
しかし、また、私たちは通常、グローバルな国家と直接連携していません。
アプリケーションがデータ層(SQLなど)に存在しない限り、モジュールが動作するオブジェクトは、実際には共有グローバルステートのコピーです。実際の共有状態に影響を与えることなく、必要なことは何でもできます。
そして、そのグローバル状態を変更する必要がある場合、与えられたデータが変更されていないという仮定の下で、通常、ローカルグローバルで行うのと同じようなロックを実行できます。
我々はよりそして最後に、我々は通常、データベースと異なることを行う可能性がありますいたずらグローバルで。
いたずらで壊れたグローバルは次のようになります。
Int32 counter = 0;
public someMethod() {
for (counter = 0; counter < whatever; counter++) {
// do other stuff.
}
}
public otherMethod() {
for (counter = 100; counter < whatever; counter--) {
// do other stuff.
}
}
私たちは、そのようなインプロセス/運用的なものにはデータベースを使用しません。そして、それはデータベースと私たちを抑止する単純な変数の相対的な利便性の遅い自然かもしれません:データベースと私たちの低迷、厄介な相互作用は、単にそれら作る悪い候補者たちは、歴史的に行われてきた過ちの多くのための変数。