Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2016, 17:53   #1
Lokki1723
Новичок
Джуниор
 
Регистрация: 19.05.2016
Сообщений: 1
Лампочка Оценка кода

Добрый день

Мне тут задали некоторое небольшое задание сделать.
Почти сделел только остались тесты.

Но мне нужен взгляд со стороны. Мне кажется что сделоно неплохо но явно чего-то не хватает.

Кину задание ну и мою реализацию. Можите одним глазком посмотреть.

Задание: Implement a simple point of sale.

Assume you have:
– one input device: bar codes scanner
– two output devices: LCD display and printer

Implement:
– single product sale: products bar code is scanned and:
– if the product is found in products database than it's name and price is printed on LCD
– if the product is not found than error message 'Product not found' is printed on LCD
– if the code scanned is empty than error message 'Invalid bar-code' is printed on LCD
– when 'exit' is input than receipt is printed on printer containing a list of all previously scanned items names and prices as well as total sum to be paid for all items; the total sum is also printed on LCD display

Rules:
– use only SDK classes and your favorite test libraries
– mock/stub the database and IO devices
– concentrate on proper design and clean code, rather than supplying fully functioning application

Класс SalePoint
Код:
public class SalePoint {
    private InputDevice codesScanner = new CodesScanner();
    private DBWorker dbWorker = null;
    private OutputDevice lcdDisplay = new LCDDisplay();
    private OutputDevice printer = new Printer();

    private List<Product> list = new ArrayList<Product>();

    public SalePoint(){
        try {
            dbWorker = new DBWorker();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void setDefaultBarCodes(){
        codesScanner.write("exit");
        codesScanner.write("");
        codesScanner.write("0000000001");
        codesScanner.write("0000000002");
    }


    public void run() {
        try {
            Product product = null;
            while(codesScanner.hasNext()) {
                String barCode = codesScanner.readLine();

                switch (barCode) {
                    case "":
                        lcdDisplay.printError("Product not found");
                        break;
                    case "exit":
                        printer.println("Printer: ");
                        printProducts();
                        return;
                    default:
                        product = dbWorker.findProduct(barCode);

                        if (product == null) {
                            lcdDisplay.printError("Invalid bar-code");
                        }

                        lcdDisplay.print(product);
                        list.add(product);
                }
            }

        } catch (EmptyStackException e) {
            e.printStackTrace();
        }
    }

    private void printProducts() {
        double summ = 0.0;

        for (Product product :
                list) {
            summ += product.getPrice();
        }

        ((Printer)printer).printProductsAndTotalPrice(list, summ);
    }
}
Class InputDevice
Код:
public class InputDevice {
    private Stack<String> buffer = new Stack<>();

    public void write(String message){
        buffer.push(message);
    }

    public String readLine(){
        if(buffer.isEmpty())
            return null;
        return buffer.pop();
    }

    public void clear(){
        buffer.clear();
    }

    public boolean hasNext(){
        return !buffer.isEmpty();
    }
}
Class CodesScanner
Код:
public class CodesScanner extends InputDevice{

    public CodesScanner() {
        super();
    }
// не знаю что добавить
}
Class OutputDevice
Код:
public class OutputDevice {
    void println(String message){
        System.out.println(message);
    }
    void print(String message){
        System.out.print(message);
    }
    void printError(String message){
        System.out.println("Error: " + message);
    }
    void print(Product product){
        System.out.println(product);
    }
}
Class LCDDisplay
Код:
public class LCDDisplay extends OutputDevice {
    public LCDDisplay() {
    }

    public void print(Product product){
        System.out.println(product.getName() + "\t\t" + product.getPrice());
    }

}
Class Printer
Код:
public class Printer extends OutputDevice {
    public Printer() {
        super();
    }

    public void printProducts(List<Product> productList){
        System.out.println("List of products:");
        for (Product product:
             productList) {
            System.out.println(product.getName() + "\t\t\t" + product.getPrice());
        }
    }

    public void printProductsAndTotalPrice(List<Product> productList, double totalPrice){
        System.out.println("List of products:\nName\t\t\tPrice");
        for (Product product:
                productList) {
            System.out.println(product.getName() + "\t\t\t" + product.getPrice());
        }
        System.out.println("Total:\t\t\t" + totalPrice);
    }

}
Class DBWorker
Код:
public class DBWorker {
    private static String URL = "jdbc:mysql://localhost:3306/mydbtest";
    private static String USERNAME = "root";
    private static String PASSWORD = "root";
    private static String SELECT = "SELECT product_name, price, bar_code FROM products WHERE bar_code = ?;";

    private Connection connection;

    public DBWorker() throws SQLException {
        Driver driver = new FabricMySQLDriver();
        DriverManager.registerDriver(driver);

        connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    public Product findProduct(String barCode) ;// урезано
}
Class Product
Код:
public class Product {
    private String name;
    private double price;
    private String barCode;

    public Product(String name, double price, String barCode) {
        this.name = name;
        this.price = price;
        this.barCode = barCode;
    }

    public Product() {
    }

    public Product(Product obj){
        this(obj.getName(), obj.getPrice(), obj.getBarCode());
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Product product = (Product) o;

        if (Double.compare(product.price, price) != 0) return false;
        if (name != null ? !name.equals(product.name) : product.name != null) return false;
        return barCode != null ? barCode.equals(product.barCode) : product.barCode == null;

    }

    @Override
    public int hashCode();// урезано

    @Override
    public String toString();// урезано
// сеттеры и геттеры
}
main
Код:
    public static void main(String[] args) {
        SalePoint salePoint = new SalePoint();

        salePoint.setDefaultBarCodes();
        salePoint.run();

    }
Извините за много кода.

Как на ваш взгляд что нужно доделать или переделать?

Да и по поводу тестирования пока смог написать только это:

Код:
public class DBTest {
    private static final Product PRODUCT = new Product("beer", 2.3, "0000000001");
    private static final String BAR_CODE = "0000000001";

    @Mock
    SalePoint salePoint;

    @Test
    public void testFindProduct(){
        DBWorker dbWorker = mock(DBWorker.class);

        when(dbWorker.findProduct(BAR_CODE)).thenReturn(new Product("beer", 2.3, "0000000001"));

        Product product = dbWorker.findProduct(BAR_CODE);

        Assert.assertEquals(product, PRODUCT);
    }

}
Lokki1723 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оценка потребляемой памяти и оценка времени выполнения. halcyon Общие вопросы C/C++ 0 22.03.2015 13:42
Оценка и хвастанье) helper999999 Общие вопросы по программированию, компьютерный форум 3 26.03.2014 06:37
оценка компа Rost93 Компьютерное железо 5 25.01.2012 14:22
Рейтинговая оценка Александр_63 Microsoft Office Excel 6 06.06.2010 19:09
Оценка алгоритма Алежа Помощь студентам 7 20.01.2009 14:28