16

私の Java プロジェクトでは、オブジェクト (項目) の配列を作成し、項目の配列にデータを入力してから、対応する項目を吐き出す項目コードを入力するようにユーザーに要求するメイン メソッドを作成する必要がありました。

理解するのにしばらく時間がかかりましたが、パブリック変数を使用してクラス間でオブジェクトを渡したり参照したりしないようにすることで「不正行為」をしました。

オブジェクトを適切に戻すのを手伝ってください。

これは、 insertメソッドやfindメソッドを含むほとんどのメソッドを含むクラスです。

public class Catalog {
    private Item[] itemlist;
    private int size;
    private int nextInsert;
    public Item queriedItem;

    public Catalog (int max) {

        itemlist = new Item[max];
        size = 0;
    }
    public void insert (Item item) {
        itemlist[nextInsert] = item;
        ++nextInsert;
        ++size;
    }
    public Item find (int key) {
        queriedItem = null;

        for (int posn = 0; posn < size; ++posn) {
            if (itemlist[posn].getKey() == key) queriedItem = itemlist[posn];
        }{
            return queriedItem;
        }
    }
}

これは私のメインクラスです:

import java.util.*;

public class Program {
    public static void main (String[] args) {

        Scanner kbd = new Scanner (System.in);
        Catalog store;
        int key = 1;

        store = new Catalog (8);
        store.insert(new Item(10, "food", 2.00));
        store.insert(new Item(20, "drink", 1.00));



        while (key != 0) {

            System.out.printf("Item number  (0 to quit) ?%n");
            key = kbd.nextInt();
            if (key == 0) {
                System.out.printf("Exiting program now!");
                System.exit(0);
            }

            store.find(key);

            if (store.queriedItem != null) {
                store.queriedItem.print();
            }
            else System.out.printf("No Item found for %d%n", key);

        }
    }
}

ありがとうございます!

4

3 に答える 3

11

store.find(key);を返し、Itemそれを使用して public フィールドを削除する必要がありますCatalog

public Item find (int key) {
   Item queriedItem = null;
   //....
}

Item searched = store.find(key);

if (searched != null)
   searched.print();
else 
   System.out.printf("No Item    found for %d%n", key);
于 2013-05-06T14:50:39.270 に答える
-1

さて、ここにいくつかの提案があります(複雑さを選択するのはあなた自身の裁量ですが、それらすべてを強くお勧めします):

  • 研究プロパティ、たとえばここ。またはXML。柔軟性を高めるために、配列に構成ファイルの値を入力できます。
  • コード内のリテラルには定数を使用します (必要な場合)。
  • アプリケーション全体を初期化する ApplicationFactory を作成します。このようなことは、ドメイン ロジックから分離する必要があります。
  • UserInputProvider他に影響を与えることなく、ユーザーの入力を読み取る方法を簡単に変更できるように、インターフェイスを作成します。ConsoleInputProviderたとえば、クラスで実装します。
  • 一般に、純粋なドメイン オブジェクトではないすべてのものにインターフェイスを使用してみてください (ここでは、おそらく だけですItem)。
  • メソッドをできるだけ短くするようにしてください。メソッドで多くのことを行う代わりに、適切に名前が付けられた他のメソッド (グループ化された関連ロジック) を呼び出して、そのメソッドが何をしているかを伝えます。
  • Listまたはをだまして使用することが許可されていない場合はMap、独自の実装を考案し、データ構造と処理を で表されるロジックから分離しますCatalog(つまりCatalog、たとえば、Map.getまたはデータ構造実装の同等のメソッドに委任します)。
  • メインは基本的に、アプリケーションをビルドおよび初期化するための ApplicationFactory (または IoC フレームワーク) を持つ必要があります。UserInputProvider(使用している正確な実装を認識しないでください) を呼び出して、ユーザー入力を取得し、必要に応じてデータを検証および変換し、呼び出しCatalogて検索します。適切なItem、そして(入力インターフェースと同様に)結果(文字列などではなく、取得した正確なデータ)を、SearchResultViewこの結果を表示する方法を決定するインターフェースの実装に送信します(この場合、コンソールになります-を表す文字列を出力するベースの実装Item)。


一般に、達成できるデカップリングのレベルが高いほど、プログラムは優れたものになります。

単一責任の原則では、「すべてのクラスは単一の責任を持つべきであり、その責任はクラスによって完全にカプセル化されるべきである」と述べています。これはメソッドにも当てはまります。副作用のない明確に定義されたタスクを 1 つだけ持つ必要があります。

于 2013-05-06T15:30:07.403 に答える