2013-05-06 10 views
16

私のJavaプロジェクトでは、オブジェクト(アイテム)の配列を作成し、アイテムの配列を作成し、対応するアイテムを吐き出すアイテムコードを入力するようにメインメソッドを作成する必要がありました。 Javaプログラムに関するアドバイス

それは把握する私にしばらく時間がかかったが、私はクラス間のオブジェクトを参照/ 通過を避けるためにパブリック変数を使用することにより、「不正行為」終わりました。

オブジェクトを適切に戻してください。

とというメソッドを含むクラスのほとんどです。

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); 

     } 
    } 
} 

感謝!!!!!!

+7

+1のために+1を受け入れるには、 –

+6

+1と答えているだけではなく、学びたいと思っています。 – SomeShinyObject

+1

'printQueriedItem'メソッドをCatalogクラスに追加すると、null checkとprintが実行されます。 – assylias

答えて

11

store.find(key);は、あなたがそれを使用すると、完全にqueriedItemの使用を削除し、ちょうどfindからアイテムを返す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); 
9

からパブリックフィールドを削除する必要がありItemを返します。

を交換してください
 store.find(key); 

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

FINDメソッドを編集する必要はありますか? –

+1

queriedItemのクラスレベルの定義を削除したら、それを 'find'の中で定義します。 – CPerkins

+0

これは私の初めてのStackoverflowです。その最後の賞賛は、私の部品xD上の些細な命名エラーの結果でした。 –

-1

でまあ、ここでいくつかのsuggesetionsです(ご自身の判断で複雑さを選択し、それらのすべてを強くお勧めします):

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


、あなたが達成することができデカップリングのレベルが高いほど、より良いあなたのプログラムになります。

Single Responsibility Principle状態:は、「すべてのクラスは、単一の責任を持つ必要があり、その責任は完全にクラスによってカプセル化されなければなりません」。これはメソッドにも当てはまります。それらは、副作用なしに明確に定義されたタスクを1つだけ持つ必要があります。

+3

これは、言語が始まったばかりの人にとって不必要に複雑です。 – AndyPerfect

+0

ええ、これは明らかにJava 101の質問です。あなたの長くて詳細な答えをありがとうございますが、それは私のスキルレベルとGoogleを介してこれを見つけるかもしれない人々のために生産的ではありません。 –

+1

@AndyPerfectまあ、そうではありません。だからこそ私は「自分の裁量で複雑さを選択する」ように提案した。そのモジュール性はJavaの力の鍵です。また、この質問はもともと「正しい方法」と読みました。これは正しい方法です。 – Powerslave

関連する問題