powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильный код
5 сообщений из 5, страница 1 из 1
Правильный код
    #39294521
liberum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я программирую не очень давно, и сейчас столкнулся определенной проблемой, проблема не в написании рабочего кода, а в правильной архитектуре и разбивке..

Сразу скажу, это не работа, это для себя, в первую очередь для практики и более глубокого понимания..
Использую IDE Idea, из фреймворков только hibernate, с которым первый опыт, selenium, как парсер страниц, и для написания тестов, и maven, для подгрузки библиотек..

например есть кусок кода, работающий, он делает логин в аккаунт, выбирает все опубликованные книги, парсит все ASIN на странице, кликает переход на следующую страницу и снова парсит..

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
    public static void main(String[] args) throws InterruptedException {
        WebDriver driver;
//        System.setProperty("webdriver.gecko.driver", "D://different/java//selenium/geckodriver.exe");
        System.setProperty("webdriver.chrome.driver", "D://different/java//selenium/chromedriver.exe");
//        driver = new FirefoxDriver();
        driver = new ChromeDriver();
        String linkKDP = "https://kdp.amazon.com/bookshelf";
        driver.get(linkKDP);

        WebElement login = driver.findElement(By.id("ap_email"));
        login.sendKeys("login@gmail.com");

        WebElement psw = driver.findElement(By.id("ap_password"));
        psw.sendKeys("password");
        WebElement enter = driver.findElement(By.id("signInSubmit-input"));
        enter.click();

        WebElement s = driver.findElement(By.id("bookshelftable_filter_input-option"));
        Select ss = new Select(s);
        ss.selectByVisibleText("Live");

       Thread.sleep(5000);

        String regexpResult = "ASIN: (\\w*)";
        Pattern counts = Pattern.compile(regexpResult);

        try {
            while (true) {
                List<WebElement> tableBooks = driver.findElements(By.tagName("tr"));
                for (WebElement w: tableBooks) {

                    Matcher matcher = counts.matcher(w.getText());
                    while(matcher.find())
                        System.out.println(matcher.group());
                }
                WebElement next = driver.findElement(By.className("a-last"));
                next.click();
                Thread.sleep(8000);
            }
        } catch (Exception e)
        {
            System.out.println("Konets");
        }
    }



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

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

По коду выше, есть идея создать для работы с аккаунтом отдельный пакет, и в нем классы, да, это подсказка капитана :) В пакете класс для основных действий, авторизация, логаут, сохранение-загрузка куки, выбор типа драйвера селениума.. класс для собирания информации внутри аккаунта, там вышеописанное собирание всех ASIN, который будет идентификатором книги, (по нему генерирует линк на страницу продажи книги в амазоне, с которой в свою очередь будет парсится ранг, ревью, дата публикации, название и т.д.). А дальше вопрос, для установки промо, создавать новый класс, или сделать метод в существующем. Читал, что для удобства класс должен помещаться в размер экрана, но когда смотришь крутой код, да той же java, там классы и по 200 и по 300 строк..

Как то сумбурно получилось, в целом вопрос как сильно стоит дробить класс, стоит ли писать отдельные методы на 2 строчки кода, стоит ли отделять по методам(или классам) поиск элемента и вытаскивание значений регулярками.

как более правильно
Код: java
1.
2.
3.
4.
		WebElement element = driver.findElement(By.id("data"));
		Matcher matchASIN = Pattern.compile("ASIN: (\\w*)").matcher(element.getText());
		matchASIN.find();
		System.out.println(matchASIN.group());



или

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
		WebElement element = driver.findElement(By.id("data"));
		System.out.println(getASIN(element));
		        
		private String getASIN(WebElement el)
		{
			String asin;
			String regexpSearchASIN = "ASIN: (\\w*)";
			Pattern counts = Pattern.compile(regexpSearchASIN);
			Matcher matchASIN = counts.matcher(el.getText());
			matchASIN.find();
			asin = matchASIN.group();			
			return asin;
		}
...
Рейтинг: 0 / 0
Правильный код
    #39294536
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
liberumЧитал, что для удобства класс должен помещаться в размер экрана,
не класс, а функция размер экрана и меньше. Хоть одну строку.
Функция это самая маленькая атомарная часть БЛ.
liberumстоит ли писать отдельные методы на 2 строчки кода
см. выше
liberumон делает логин в аккаунт, выбирает все опубликованные книги, парсит все ASIN на странице, кликает переход на следующую страницу и снова парсит..
Вот с этого и начинать. С ООП.
Проектировать классы и их взаимосвязи - работу.
Если логи в аккаунт, значит класс логина.
Если там кода мало, то он и выбирает книги. Если он разросся, то потом в рефакторинге его разделишь на 2.
Класс парсера обычно всегда отдельный. У него могут быть плагины-помощники-классы в зависимости от типа сайта.
И т.д.
Можно начать с главной функции main. Там вообще 2-3 строки нужно.
Application - создать
Application - Run - выполнить
...
Рейтинг: 0 / 0
Правильный код
    #39294551
liberum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

main есть, точнее его нет, это веб приложение, уже есть регистрация, авторизация, сущности для книг, пользователей, аккаунта, hibernate все это сохраняет и загружает, через сервлеты это транслируется на веб страницы.. Знаю, что более правильно было бы использовать spring, но как говорится, одна проблема за раз, сейчас я осваиваю hibernate и selenium, с его довольно тяжелыми для моего понимания xpach..

Но я услышал, спасибо, методы небольшие, классы по необходимости.. Вопрос еще по 2 кусочкам кода что в конце, как более правильно?
...
Рейтинг: 0 / 0
Правильный код
    #39294576
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
liberumspring
его потом, т.к. selenium - крутая штука.
liberumВопрос еще по 2 кусочкам кода что в конце, как более правильно?
насколько вижу, разницы в коде нет, только разбил на несколько строк и завернул в функцию?
Тогда вар.1. И 4 строки не оптимизируют. Это уж слишком.
IMHO
...
Рейтинг: 0 / 0
Правильный код
    #39294677
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Послушай, Люк, правильный код это как сила. Послушай, Люк, ты должен почувствовать свою силу. Только она поможет тебе в борьбе с роем жуков. Не сдавайся, Люк. Никогда не сдавайся. Когда ты почувствуешь слабость, вспомни про силу, Люк.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильный код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]