Java - これは良いプログラミング手法ですか?
-
22-08-2019 - |
質問
次のことは良いプログラミングの実践であると考えられるかどうか疑問に思っていますか?私は個々のソース ファイルをできる限り簡潔かつ整然とした状態に保ちたいと思っていますが、経験豊富なプログラマーがそれをどう思うかは疑問です。私は特に、すべての「マジック ナンバー」を 1 か所に保管するための Settings.java クラスのアイデアが気に入っています。問題を改善する方法について何か提案はありますか?
コーディングを楽しんでください:-)
class ApplicationLauncher
{
public static void main(String[] args)
{
SwingApplication mySwingApplication = new SwingApplication();
}
}
//////////////
import javax.swing.*;
public class SwingApplication extends JFrame
{
public SwingApplication()
{
JFrame myJFrame = new JFrame();
myJFrame.setSize(Settings.frameWidth, Settings.frameHeight);
myJFrame.setVisible(true);
}
}
//////////////
class Settings
{
static int frameWidth = 100;
static int frameHeight = 200;
}
解決
設定クラスを持つことには何も問題はありません。しかし、あなたの例の設定は、彼らがどのように適用されるフレームの面でかなりambigiousません、どちらも彼らは厳密にSwingApplicationクラスに属している実際の設定ではなく、デフォルト値です。
私たちは多くのコントロールの上に持っていないもう一つは、プログラムのメッセージポンプループにスウィングカスケードにどのようにコンストラクタ呼び出しである。
は、私にとって、それは返さない(フレームが閉じられていない限り)とオブジェクトを初期化するだけではありませんでしコンストラクタで意味を成しませんでした。
他のヒント
静的メンバーとしてのマジックナンバーを持つ特別なクラスを持つことは良いのJava勧めします。
プログラムが成長するにつれ、複数の設定クラス、わかりやすい名前とそれぞれ、使用することができます。
このようなもののすべてのグループにのようないくつかの、実行時に読んで(との意味を成して)され、大きくて醜いXMLファイル内のマジックナンバーなど...。あなたのアプローチは、小規模なプロジェクト(例えば一般コース)のために、明らかに大丈夫ですが、XMLファイルからこれらの設定を得ることの明白な利点を考える:あなたは、あなたの設定に加えた変更を反映するために、ソースコードを再コンパイルする必要はありません。)
あなたは、通常の定数がインポートされたインタフェースであるものの、一部の人々は、「恐ろしい定数インターフェースアンチパターン」と呼ぶものを使用しています。私は特に、静的な輸入品の出現以来、これで問題ありませんが、おそらく誰かがひどい悪で私たちを記入します。そのうちの一つが、「それはインタフェースがのためにあるものではない」のようです。
より多くの懸念は、あなたがスレッドであなたのGUIを起動する必要があるということです。
//Schedule a job for the event-dispatching thread: creating
//and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame myJFrame = new JFrame();
myJFrame.setSize(Settings.frameWidth, Settings.frameHeight);
myJFrame.setVisible(true);
}
});
他の人が言ったように、これは完全に良い習慣ですが、コードを改善するためにできることがいくつかあります。
- を与える
Settings
class 引数のないプライベートコンストラクター。これによりインスタンス化が不可能になり、定数のリポジトリとしての意図がより明確になります。 - 設定は次のとおりです
final
(不変) だけでなくstatic
. - 通常、Java の定数は次のように記述されます。
LIKE_THIS
それよりもlikeThis
. - Java 1.5 以降を使用している場合は、次を使用できます。
import static Settings.FRAME_WIDTH;
クラスで使用できるようにするFRAME_WIDTH
書かなくても直接Settings.FRAME_WIDTH
.
これにより、次のようになります。
class Settings
{
/** Do not instantiate! */
private Settings() {}
static final int FRAME_WIDTH = 100;
static final int FRAME_HEIGHT = 200;
}
Mackerはよくそれをカバーしました。また、彼らはプログラムのさまざまな部分をカスタマイズすることができますので、あなたは、将来的には、実際のユーザーの好みに簡単に設定の一部を移動することができますこの方法をやって。すべての設定は、すでに独自のクラスに分離されているので、これはあなたの部分に、最小限の労力が必要になります。
私は限り設定を変更することはほとんどありませんし、あなたが設定間の関係を文書として良い練習することができると思います。これらは変更する可能性がある場合、それらは再コンパイルを必要としないので、次に設定ファイルおよび/またはコマンドライン引数は、より多くの意味を成しています。
は、あなたがそれらを変更しないためにあなたが意味する場合、彼らは、また、最終的にしていることを確認してください、あなたの魔法の数字のために静を使用しようとしている場合。
変更可能な静は本当に悪い考えです。 「上からのパラメータ化」に固執しています。
これは直接尋ねたが、例のコードは、他の問題がありました。あなたはJFrame
(悪い習慣を)延長したが、その後のことを無視して、実際に使用するために別のJFrame
を作成しました。また、あなたは常に、AWTイベントディスパッチスレッド(EDT)にSwingコンポーネントにアクセスするための定型を含める必要があります。
あなたはあなたのGUIに対応するためのJSR 296( Swingアプリケーションフレームワークの)に見たいと思うかもしれません設定/起動/プロパティます。
staticインポートを必要としない別の解決策は、フィールド、ゲッターとセッターとの完全な「ApplicationSettings」クラスを作成し、パラメータを必要とするクラスのコンストラクタに、このクラスのインスタンスを渡すことであろう。これは、ユーザーが、例えば、ウィンドウのサイズを変更した場合、新しいサイズを保存したい場合は、簡単に永続化または変更することができる構成オブジェクトを維持することができます。