2013-05-06 32 views
16

Dự án java của tôi yêu cầu tôi tạo một mảng các đối tượng (các mục), điền vào các mảng của các mục và sau đó tạo một phương thức chính yêu cầu người dùng nhập mã mục mà quay trở lại mục tương ứng.Lời khuyên về chương trình Java

Tôi đã mất một thời gian để tìm ra, nhưng tôi đã kết thúc "gian lận" bằng cách sử dụng một biến công để tránh qua/tham khảo đối tượng giữa các lớp.

Vui lòng giúp tôi truyền lại đối tượng đúng cách.

Đây là lớp có hầu hết các phương pháp của tôi, bao gồm chèntìm phương thức.

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

này được lớp học chính của tôi:

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

     } 
    } 
} 

Cảm ơn Tôi đánh giá cao sự giúp đỡ !!!!!!

+7

+1 để thừa nhận là dành cho một lớp học –

+6

+1 cho muốn tìm hiểu và không chỉ nhận được câu trả lời. – SomeShinyObject

+1

bạn có thể thêm phương thức 'printQueriedItem' vào lớp Catalog của bạn, điều đó sẽ thực hiện kiểm tra và in null. – assylias

Trả lời

11

store.find(key); trả về một Item bạn nên sử dụng nó và xóa các lĩnh vực công cộng từ 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

Hủy bỏ việc bạn sử dụng queriedItem hoàn toàn và chỉ cần trả lại mục từ find: Thay thế

 store.find(key); 

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

Với

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

Tôi có phải chỉnh sửa phương pháp FIND của mình không? –

+1

Khi bạn xóa định nghĩa cấp lớp của queriedItem, có - nhưng chỉ cần định nghĩa nó trong 'find'. – CPerkins

+0

Đây là lần đầu tiên tôi trên Stackoverflow. Lời khen cuối cùng đó là kết quả của một lỗi đặt tên tầm thường về phần xD của tôi. –

-1

Vâng, đây là một số suggesetions (chọn phức tạp theo ý riêng của mình, nhưng tất cả đều là rất khuyến khích):

  • Nghiên cứu Properties, ví dụ here. Hoặc XML. Bạn có thể điền mảng với các giá trị từ một tệp cấu hình để linh hoạt hơn.
  • Sử dụng constanst cho các chữ trong mã của bạn (nơi chúng cần thiết).
  • Tạo một ApplicationFactory khởi tạo toàn bộ ứng dụng cho bạn. Những thứ như thế này cần phải được tách ra khỏi logic miền của bạn.
  • Tạo giao diện UserInputProvider để bạn có thể dễ dàng thay đổi cách thức đầu vào của người dùng được đọc mà không ảnh hưởng đến bất kỳ điều gì khác. Thực hiện nó với một lớp ConsoleInputProvider chẳng hạn.
  • Nói chung, hãy thử sử dụng giao diện cho mọi thứ không phải là đối tượng tên miền thuần túy (tại đây, đối tượng duy nhất bạn có có lẽ là Item).
  • Cố gắng giữ cho các phương pháp của bạn càng ngắn càng tốt. Thay vì làm nhiều thứ trong một phương thức, yêu cầu nó gọi các phương thức khác (nhóm logic liên quan) được đặt tên thích hợp để biết nó đang làm gì.
  • Nếu bạn không được phép để lừa và sử dụng List hoặc một Map, đưa ra thực hiện riêng của bạn về một, tách cấu trúc dữ liệu và xử lý từ logic đại diện bởi Catalog (tức Catalog sẽ lần lượt đại biểu đến, ví dụ, Map.get hoặc Phương pháp tương đương của việc triển khai cấu trúc dữ liệu của bạn)
  • Chính của bạn về cơ bản chỉ cần có ApplicationFactory (hoặc khung công tác IoC) để xây dựng và khởi tạo ứng dụng của bạn, gọi số UserInputProvider (nó không biết chính xác việc thực hiện nó) , xác thực và chuyển đổi dữ liệu theo yêu cầu, gọi Catalog để tìm số Item thích hợp và sau đó (tương tự như interfa đầu vào ce) gửi kết quả (dữ liệu chính xác mà nó nhận được, không phải chuỗi hoặc tương tự) đến một số giao diện SearchResultView quyết định cách hiển thị kết quả này (trong trường hợp này nó sẽ là một thực thi dựa trên giao diện điều khiển) các Item nó đã nhận).


Nói chung, cao hơn mức độ tách bạn có thể đạt được, thì càng tốt chương trình của bạn sẽ được.

Các Single Responsibility Principle trạng thái: "mỗi lớp nên có trách nhiệm duy nhất, và trách nhiệm đó phải được hoàn toàn đóng gói bởi lớp". Điều này cũng đúng đối với các phương thức: chúng phải có một và chỉ một tác vụ được xác định rõ ràng mà không có bất kỳ tác dụng phụ nào.

+3

Điều này là phức tạp không cần thiết cho một người mới bắt đầu với ngôn ngữ. – AndyPerfect

+0

Vâng dude, điều này rõ ràng là một câu hỏi java 101. Cảm ơn câu trả lời dài và chi tiết của bạn nhưng nó phản tác dụng do trình độ kỹ năng của tôi và của những người có thể tìm thấy điều này thông qua Google. –

+1

@AndyPerfect Vâng, không hẳn. Đó là lý do tại sao tôi đề nghị "chọn sự phức tạp theo quyết định của riêng bạn". Tính mô đun của nó là chìa khóa cho các quyền hạn của Java. Ngoài ra, câu hỏi ban đầu đọc "làm thế nào để làm điều đó đúng". Đây là cách làm đúng. – Powerslave

Các vấn đề liên quan