グローバル変数を使用したい場合、上司に言うこと


13

現在、私はインターンシップに4か月あります。コードをレビューするとき、上司は特定のオブジェクトを1つのアセンブリ内のいくつかの別個のクラスの多くのメソッドに対してローカルに保持していたことを嫌いました。彼は、私が毎回新しいオブジェクトを作成することを嫌い、代わりにどこからでもアクセスできる単一のオブジェクトを作成するように言った。したがって、静的クラス内で静的オブジェクトとして作成し、ここから参照するだけで使用する必要がありました。

私はプロとして4か月しかプログラミングしていないので、これにどう対処しますか?


4
あなたの上司は技術者ですか、それとも非技術者ですか?彼が技術的なものであれば、ロバートC.マーティンの「クリーンコード」を読んだことがありますか?
ジョージストッカー

5
それで、あなたの上司はあなたをコーディングに雇いました、そして今、あなたはコーディングの方法を教えていますか?
ジェレミーハイラー

8
以下のコメントで、「オブジェクトには、多くの定数を除いて、状態がありません」と述べました。その場合、静的クラスは私にとって良い解決策のようです。
ジャスティン

5
「はいボス」が思い浮かぶ

2
「どこからでもアクセスできる単一のオブジェクトを作成するように言われました。したがって、静的オブジェクトとして作成する必要がありました」これは妥当な理由ではありません。アプリケーション全体からアクセス可能な単一のオブジェクトにシングルトンが含まれていることを暗示しているように話します。集約ルートで作成し、その参照を依存クラスに渡してみませんか?
エリジウムをむさぼり食う

回答:


33

1つのオブジェクトで十分な場合、毎回オブジェクトを作成するのは無駄であり、ここで上司は正しいかもしれません。

問題は、そのオブジェクトへの適切なアクセスです。常に静的オブジェクトを返す適切な可視性を備えた工場のようなメソッドは、頭に浮かぶ最初のソリューションです。他にも確かに存在します。


3
+1:「GoFがそう言った」という答えが嫌いな限り、そうです。
ハビエル

1
私はシングルトンについて考えましたが、グローバル変数のラッパーとして見ただけでしたので、フォローアップしませんでした。オブジェクトには状態がないので、これを試してみましょう。多くの定数は別ですが、問題ないはずです。ありがとう。
ダレンヤング

9
私はこれが事実であると疑っていました(「オブジェクトには状態がありません...多くの定数」)。あなたの上司は正しい。ガベージコレクターに、決して変化しない値を求める人為的な圧力をかける意味はありません。
ベリンロリチュ

3
@ darren-young:余談ですが、状態を持たないことは興味深く、いくつかの強力なアプローチを可能にします。まだ「関数型プログラミング」と呼ばれているものを見てください。
9000

8

特定のケースについてコメントすることはできませんが、グローバル変数を使用することが良い解決策になる場合あります。JavaのSystemクラスには、静的なグローバル変数がいっぱいです。

しかし、一般的に、自分が正しいと思い、上司が間違っているとしたら、なぜ上司にグローバル変数がより良い解決策だと思うのを説明してもらえませんか?単純な「好きではない」とは、「グローバル変数は悪」と同じくらいあいまいです。上司にもっと要求する必要があります!

彼が自分のスタンスの理由を述べることができず、あなたがあなたのスタンスに理由を与えることができる、またはその逆の場合、それは良い学習の機会です。両方があなたのスタンスを正当化できるなら、それはおそらく好みの問題、または経験の問題です:あなたの上司は4ヶ月以上専門的にプログラミングしていたに違いないと思いますか?


1
を参照してください。java.lang.System正確に3つのグローバル変数が含まれており、それぞれに適切に設定する方法があります。しかしSystem、グローバルオブジェクトを返す静的メソッドでいっぱいであり、これには何の問題もありません。
9000

2
はい; グローバル変数は、グローバルオブジェクトを返す静的メソッドとほとんど同じだと考えています。
ジョナスプラッカ

Javaがこれを行います。それは、それが良いアイデアであるかどうかの完全に別の質問です。Cの標準乱数ジェネレーターは、グローバルな状態を保持します。しかし、これは恐ろしいことであり、したがって乱数発生器は特定のアプリケーションでは使用できないことは一般に認められています(たとえば、Bentley et al。、Engineering a sort functionを参照)。特にJavaには(C#で部分的に改善された)多数の設計上の問題があるため、このように引数として使用することにはあまり注意しません。
コンラッドルドルフ

@Konrald Rudolph:最終的には設計上の決定です。すべての決定には長所と短所があります。たとえば、グローバル状態を維持Systemすると、残りの0.1%で問題を引き起こすという犠牲を払って、たとえば、ユースケースの99.9%が単純化されます。その0.1%が余分な複雑さに見合うかどうかについて、「正しい」答えはありません。
ジョナスプラッカ

5

あなたの立場の誰かとして、あなたができる最も多くは学ぶことです。オブジェクトが本質的に定数(つまり、変更できず、状態を維持できない)である場合、上司は正しいかもしれません。静的定数オブジェクトを使用しても害はありません。結局のところ、PIの定義はいくつありますか?

一部の人々は、「グローバルなオブジェクトなし」の考え方を宗教的な熱心さまで擁護しています。それは2つの理由のうちの1つです:グローバル変数/オブジェクトの過剰使用のためにバグやシステムの脆弱性を追跡するのが難しいか、それが悪いと聞いて自分で考えられないということです。私は個人的に、もろさやバグの追跡に苦しんでいる人々のグループに分類されますが、ここでもある程度のバランスを学びました。

もし私があなたの靴を履いていたら、私は先に進み、ボスが言うことをします-結局のところ、それは彼の尻です。それから、私は時間の経過とともにその選択の効果を見て見ます。これは効果的な学習ツールです。


インターンシップです。あなたは学習することになっています。上司の言うことを盲目的にやることは学習ではありません。
デビッドソーンリー

5
盲目的に上司に逆らうこともありません。書かれているように、私のアドバイスは、上司の選択の影響を観察することでした。スタック交換では、重要な情報が不足しているため、状況について価値判断を下すことができません。これは、少し科学的な方法を実行する場合です。OPには仮説があり、ボスはそれに挑戦しました。それでは、実験を実行します。
ベリンロリチュ

2

特定の状況によっては、グローバル変数が最適なソリューションになる場合があります。組み込みプログラミングでは、グローバルはスタックスペースを占有しないため、適切な選択です。

グローバルであろうとなかろうと、グローバルに接頭辞を付けることは良い実践であることがわかりました。これにより、他のプログラマーがコードをグーグルで調べて、コードが混乱した場合の影響を認識できます。


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