Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Leonid ecobike #1

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open

Leonid ecobike #1

wants to merge 19 commits into from

Conversation

Rommelua
Copy link
Owner

No description provided.

Copy link

@boroda4436 boroda4436 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вцілому досить непогане рішення!

  • бачу що в тебе дуже багато java doc коментарів. Зазвичай java doc масивно використовують при написанні бібліотек.
    в продакшині java doc додають за потреби

src/main/java/com/ecobike/EcoBikeApplication.java Outdated Show resolved Hide resolved
src/main/java/com/ecobike/EcoBikeApplication.java Outdated Show resolved Hide resolved
@@ -0,0 +1,170 @@
package com.ecobike.dao;

import static com.ecobike.EcoBikeApplication.COMMUNICATOR;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я б рекомендував уникати статики. Краще реалізувати тут DI. Можна той же об'єкт communicator передати в якості параметру в конструкторі FileBikeDao

src/main/java/com/ecobike/dao/FileBikeDao.java Outdated Show resolved Hide resolved
*/
private Bike parseBike(String line) {
try {
if (line.startsWith(BikeType.SPEEDELEC.toString())) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Що буде коли в тебе додасться ще один тип велосипедів? Швидше за все ти тоді будеш порушувати OCP із SOLID. Подумай, як можна було б розширяти функціонал без внесення змін в цей метод

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил пакет parser, в нем отдельные классы-парсеры для каждого типа байков и в абстрактном парсере статический фабричный метод, который возвращает нужный парсер в зависимости от переданной строки

synchronized (this) {
Stream<Bike> bikeStream = bikes.parallelStream()
.filter(bike -> bike.getBikeType() == parCont.getBikeType()
&& bike.getBrand().equalsIgnoreCase(parCont.getBrand())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А якщо я не вкажу brand при пошуку? Я отримаю велосипеди всіх брендів? Чи я отримаю велосипеди, де бренд не вказано?

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В сообветствии с заданием Тип и Бренд нужно указать обязательно, остальное опционально. Прилажуха так и работает - будет требовать Бренд до посинеия)
Option 5
Implement the search function, which allows you to find the products of a certain type (ebikes, folding bikes and speedelecs) of a given brand and with the given parameters. The list of
parameters can be any from empty (then the search works only by the name of the brand) to the full
(when all parameters specific to this type of bike are set).

}

/**
* Method reads text from file and loads parsed Bike objects to DataHolder.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

слово and вказує на те, що порушується принцип SRP. Постарайся відрефакторити цей метод

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отрефакторил BikeDao, теперь он ничего не знает о дата холдере, а просто читает данные и возвращает лист байков в методе readBikes и записывает лист байков в методе saveBikes

* operation specified by user.
*/
public interface Command {
Communicator COMMUNICATOR = EcoBikeApplication.COMMUNICATOR;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В тебе в реалізації майже всюди порушується DI. Спробуй відрефакторити своє рішення.

src/main/java/com/ecobike/model/AbstractElectroBike.java Outdated Show resolved Hide resolved
src/main/java/com/ecobike/model/AbstractElectroBike.java Outdated Show resolved Hide resolved
Copy link

@boroda4436 boroda4436 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • мені подобається що ти створив інтерфейс команда і описав кожні команду як клас
  • interface BikeParser - це хороше рішення

src/main/java/com/ecobike/ConsoleCommunicator.java Outdated Show resolved Hide resolved
*/
public synchronized void init() throws IllegalDataSourceException {
bikes.clear();
bikes.addAll(bikeDao.readBikes());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не до кіняці можу зрозуміти. Де ми зберігаємо bikes? Виглядає, що ти збергіаєш bikes тут, в класі DataHolder, але при цьому зберігаєш їх ще десь, звідки ти отримуєш за допомогою DAO.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так у нас по заданию:

  • Reads in the file ecobike.txt when starting the program
    Вот я в начале работы программы считываю данные из файла и загружаю в DataHolder, этот класс хранит их во время рантайма. Поиск или добавление новых байко мы делаем в DataHolder. Если пользователь хочет, то записывает обновленные данные в файл.

}
synchronized (this) {
Stream<Bike> bikeStream = bikes.parallelStream()
.filter(bike ->

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Rommelua Як ти дивишся на те, щоб реалізувати щось типу FilterChain?
Зараз я бачу вузьке місце - мені щоб додати новий фільтр - треба редагувати ось цей метод. Як на мене - це порушення OCP.
FilterChain дозволяє тобі динамічно додавати фільтри. Глянь наприклад як працюють фільтри по авторизації.
Дуже просто опишу як я це бачу:

if (attributes == null || attributes.isEmpty()) {
        // skip this filter
        return;
    }

Якщо параметри для фільтру присутні - фільтруєш список велосипедів.
Приклад фільтру: BrandFilter, WeightFilter, ColorFilter, etc...

src/main/java/com/ecobike/dao/FileBikeDao.java Outdated Show resolved Hide resolved
src/main/java/com/ecobike/model/AbstractElectroBike.java Outdated Show resolved Hide resolved
src/test/java/com/ecobike/DataHolderTest.java Outdated Show resolved Hide resolved
src/test/java/com/ecobike/FileBikeDaoTest.java Outdated Show resolved Hide resolved
src/test/java/com/ecobike/parser/EbikeFileParserTest.java Outdated Show resolved Hide resolved
expectedEx.expect(IllegalArgumentException.class);
bikeParser = FileBikeParser.getBikeParser(WRONG);
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please check your code

Copy link
Owner Author

@Rommelua Rommelua Aug 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

checkstile, очевидно, не проверяет тесты, погуглю...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants