1

内側のクラスで外側のクラスのメソッドを呼び出し、外側のクラスで内側のクラスのメソッドを使用することは悪い習慣と見なされるかどうか疑問に思っていました。

この場合: BidParserでは、外部クラスに属するメソッド updateMaps ()を呼び出します。さらに、BidParserで 2 番目の内部クラス InputSanityChecker のメソッドを呼び出しています。

それは悪い習慣と反パターンですか?ここで神のオブジェクトを作成していますか?(ただし、他の外部クラスで従うべき関数がさらにあります)

編集: Outer に属しているが、updateX および checkX メソッドに必要な 2 つの変数 Var1、Var2(としましょう) があります。

public class Outer{


    public static void main( String[] args ){
        if(args.length == 1){
            File file = new File(args[0]);
            BidParser.parseBids(file);//<--- Question refers here
        }else{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BidParser.parseBids(br);  //<--- and here
        }
    }


    private static void updateMaps(String[] elements){
        //.....blah blah
    }

    static class BidParser{
        public static void parseBids(File file){
            //.....blah blah
            InputSanityChecker.checkInput(elems);//<---second inner class method
            InputSanityChecker.checkMaps(elems);    //<---second inner class method
            updateMaps(elems);  //<-----outer class method

        }
        public static void parseBids(Reader reader){
            //.....blah blah
            InputSanityChecker.checkInput(elems);//<---second inner class method
            InputSanityChecker.checkMaps(elems);    //<---second inner class method
            updateMaps(elems);  //<-----outer class method

        }
      }
    static class InputSanityChecker{

        public static boolean checkInput(String[] elements){
              //.....blah blah
        }

        public static boolean checkMaps(String[] elements){
              //.....blah blah
        }   
    }
}
4

1 に答える 1

5

循環参照ではありません。すべてのクラス (外部およびネストされた静的) は、コンパイラに対して同等に独立しています。また、静的メソッドを呼び出している間は、インスタンス参照はありません。

この設計は、単一責任の原則に違反していますBidParser。入札の解析を担当する必要があります。それだけです。つまり、このクラスは入力を受け取る必要がありFileます。ReaderBids

Reader次に、1) any の形式で入力を準備すること、および 2) 生成されたBidsオブジェクトを取得し、それを使用して何かを行うことは、呼び出し元の責任です。Reader は、FileReader、BufferedReader、StringReader などのインスタンスにすることができます... Java IO ドキュメントを参照してください

また、このデザインは、 Don't Repeat Yourselfの原則に違反しています。に重複したコードが表示されBidParserます。この違反は、より抽象的な入力のみで動作するようにクラスを設計すると、自動的に修正されます。

を考慮InputCheckerすると、各要素が他の要素とは無関係にチェックされる場合、このクラスは一度に 1 つのチェック可能なチャンク (要素) のみをチェックする必要があります。また、要素を繰り返し処理しInputChecker、必要に応じて呼び出すのはパーサーの責任です。

外部クラスに入札の解析とチェックに必要な変数がある場合は、それらを引数として渡す必要があります。チェックの失敗によって解析が妨げられない場合は、チェッカーをパーサーから除外することをお勧めします。したがって、次のようになります。

try{
     Bids bids = BidParser.parse( bidsInput );
     BidChecker.check(bids, var1);
     Maps.update(bids, var2);
} catch (...){
}

一般化すると、このような設計は悪いものです。クライアントの内部に関する知識がクラスに注入されるためですBidParser。つまり、密結合はテストできず、保守性が低下するため、避ける必要があります。クラスは、引数を介して渡される以外に、クライアントについて何も認識してはなりません。そして (この短い例ではやり過ぎです) 制御の反転 (およびそれに続く依存性注入) の概念は、疎結合を追求し、よりテスト可能でクリーンな設計を生成するためにさらに進んでいます。

オブジェクト指向設計の SOLID 原則を検討してください。また、 Don't Repeat Yourselfに関するウィキペディアの記事は、ある種のプログラミング哲学を紹介する別の有用な原則へのリンクです。

于 2014-11-25T05:36:07.767 に答える