Рекомендации по программе Java

В моем проекте 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);

        }
    }
}

Спасибо, я ценю помощь!!!!!!

Ответ 1

store.find(key); возвращает Item, вы должны использовать его и удалить общедоступное поле из 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);

Ответ 2

Полностью удалите использование queriedItem и просто верните элемент из find: Замените

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

Ответ 3

Ну, вот несколько советов (выберите сложность по своему усмотрению, но все они очень рекомендуются):

  • Исследование Properties, например здесь. Или XML. Вы можете заполнить массив значениями из файла конфигурации для большей гибкости.
  • Используйте константу для литералов в вашем коде (где они необходимы).
  • Создайте ApplicationFactory, чтобы инициализировать все приложение для вас. Такие вещи должны быть отделены от вашей логики домена.
  • Создайте интерфейс UserInputProvider, чтобы вы могли легко изменить способ ввода ввода пользователя, не затрагивая ничего другого. Реализуйте его с помощью класса ConsoleInputProvider.
  • В общем, попробуйте использовать интерфейсы для всего, что не является чистым доменным объектом (здесь единственное, что у вас есть, вероятно, это Item).
  • Постарайтесь, чтобы ваши методы были как можно короче. Вместо того, чтобы делать много вещей в методе, нужно ли вызывать другие методы (группируя связанную логику) так, чтобы они могли сказать, что он делает.
  • Если вам не разрешено обманывать и использовать List или Map, разработайте свою собственную реализацию, разделив структуру данных и обработку из логики, представленной Catalog (т.е. Catalog по очереди будет делегировать, например, Map.get или эквивалентный метод реализации вашей структуры данных)
  • В основном ваш основной должен иметь ApplicationFactory (или структуру IoC) для создания и инициализации вашего приложения, вызывать UserInputProvider (он не должен знать, какая именно реализация используется), чтобы получить пользовательский ввод, проверить и преобразовать данные как требуется, вызовите Catalog, чтобы найти соответствующий Item, а затем (аналогично интерфейсу ввода) отправите результат (точные данные, которые он получил, а не какую-то строку или аналогичную), к некоторой реализации интерфейса SearchResultView, который решает как отобразить этот результат (в этом случае это будет консольная реализация, которая печатает строку, представляющую полученную Item).


Как правило, чем выше уровень развязки, который вы можете достичь, тем лучше будет ваша программа.

Принцип единой ответственности гласит: "у каждого класса должна быть отдельная ответственность, и эта ответственность должна быть полностью инкапсулированный классом". Это также верно для методов: они должны иметь одну и только одну четко определенную задачу без каких-либо побочных эффектов.