LINUX.ORG.RU

Покритикуйте Java код

 


0

2

Господа, я тут в рамках изучения Java написал очень простой парсер для HTML. Всё, что он может, это искать теги, их атрибуты и значения этих атрибутов. Писал используя паттерн State. Вообще, парсер был мне нужен для учебного проекта, в котором я сейчас использую JSoup. Но суп медленный, поэтому я хотел написать что-то максимально быстрое и простое.

В общем, буду благодарен за замечания. По поводу кода, его оформления, интерфейса класса и т.п. Да, ещё я пытался написать юнит тесты, но чую, что вышли они плохо. Так же буду рад критике.

Код парсера: https://gist.github.com/koniahin/0eeee57c14f04bb1af9c

Тесты: https://gist.github.com/koniahin/6b7274333e65cc134dc8

★★★

Ответ на: комментарий от int13h

Я у мамы экстремист. И у меня всё открывается, проблемы есть только с самим гитхабом, не с гистами.

Weres ★★★
() автор топика

Очень поверхностно глянул, бросилось в глаза следующее:

  • extends TestCase в тестах — это устаревший подход, пользуйтесь аннотациями @Test.
  • Использовать модульные тесты для проверки производительности мягко говоря нельзя.
  • Многовато вложенных классов, лучше по отдельным файлам раскидать.
  • Поля класса лучше в начале указывать, а не в конце.
CARS ★★★★
()

А то что это жаба-код, это уже повод для критики. А лучше сразу сблевать.

anonymous
()
Ответ на: комментарий от CARS

Про эту аннотацию читал, код переделаю, спасибо.

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

На stackoverflow мне вообще посоветовали лексический анализ в отдельный класс выделить. Подумаю над этим, но если вложенные классы вынести, то класс парсера будет совсем крохотным.

Это всё Хорстманн. Да и я считал, что в начале метода должно быть то, что нужно его пользователю, то есть интерфейс. Поля же обычно закрыты и пользователю не нужны. Но сейчас посмотрел,

Weres ★★★
() автор топика
Ответ на: комментарий от umren

В моей глуши не так строги. Билайн на работе открывал гист без проблем, гитхаб раз через десять. Дома Lanta, вообще проблем нет. Не думал, что где-то будет всё так серьёзно с блокировкой.

Weres ★★★
() автор топика
if ((name.length() > 0) && !name.toString().equals("/") && (attr.get(name.toString()) == null))

тут лишние скобки

kazufukurou
()

Каждому енаму в AttrStat в map в мап кладется соотвествующий наследник State. Возможно проще было бы методы из AttrStat перенести в State и переопределять конкретные енамы. Мап states тогда вообще не нужен. Правда я саму логику до конца не осознал.

kazufukurou
()

очень-очень бегло глянул...

- есть подозрение, что парсер глюкнет если html приготовлен обычными раздолбаями в windows.

- html любят приправлять doctype`ом - где он? и entities по хорошему нужны

- на первый взгляд комментарии отрабатываются некорректно, или по крайней мере неочевидно

- есть гадский тег <script> внутри которого ловить другие теги бесммысленно

MKuznetsov ★★★★★
()

JSoup. Но суп медленный, поэтому я хотел написать что-то максимально быстрое

И как, получилось быстрее?

f1xmAn ★★★★★
()
Ответ на: комментарий от Weres

Про эту аннотацию читал, код переделаю, спасибо.

Погугли про BDD. Хоть сейчас стандартом де-факто и является JUnit, рекомендую глянуть на другие фреймворки, мне, к примеру, намного больше нравится Spock. А Groovy вообще классная штука ;)

Это всё Хорстманн. Да и я считал, что в начале метода должно быть то, что нужно его пользователю, то есть интерфейс. Поля же обычно закрыты и пользователю не нужны.

Use interfaces everywhere, Luke. https://www.youtube.com/watch?v=G6LJkWwZGuc

f1xmAn ★★★★★
()

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

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

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

Valkeru ★★★★
()
Ответ на: комментарий от Weres

Просто мне важна скорость работы

Тогда зачем было использовать яву?
И еще вопрос: зачем делать велосипед? Неужели нет достаточно быстрого xml/html парсера для явы? Чем плохи регулярки?
Это было бы проще сделать используя perl или sed|grep

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от Valkeru

Всем.

Нет

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

Во-первых, слабым железом для разработки пользуются только от недостатка средств.
Во-вторых, вместо результатов такого теста можно выводить рандомное число, информативность не изменится.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

Во-первых, слабым железом для разработки пользуются только от недостатка средств.

Ага, а потом удивляются «а чё это у меня на восьми ядрах и 128 гигах памяти всё летает, а люди говорят, что у них тормозит?».

Valkeru ★★★★
()
Ответ на: комментарий от Valkeru

у меня на восьми ядрах и 128 гигах памяти всё летает, а люди говорят, что у них тормозит?

Раздавай собранный бинать и таких проблем не будет, не нужно заставлять всех пользователей собирать софт из исходников. Если у юзера какой-нибудь асер еее, что ему теперь, месяц ждать?

ya-betmen ★★★★★
()
Ответ на: комментарий от kazufukurou

В states лежит набор всех возможных внутренних состояний парсера. Там такой, конечный автомат. Я бы хотел эту часть кода улучшить. выглядит как-то криво, но про переопределение енамов я не понял.

Weres ★★★
() автор топика
Ответ на: комментарий от MKuznetsov

Спасибо, доработаю. Есть такие проблемы. Что делать с комментариями я ещё не решил, так как мне нужно парсить закомментированные участки кода. Поэтому сейчас я просто игнорирую тег комментариев.

Weres ★★★
() автор топика
Ответ на: комментарий от f1xmAn

И как, получилось быстрее?

Для моих задач - да. Но они просты, так что я скорее всего всё усложнил и замедлил. Основной целью было написать работающий и, по возможности быстрый, код для обучения.Так то наверняка есть парсеры быстрее.

Погугли про BDD.

Спасибо, погуглю. Я TDD Кента Бека прочитал, очень понравилось то, что он описал. Хочется сначала научиться писать нормальные тесты, потом уже буду бегать по фреймворкам. Но для общего развития я их посмотрю.

Weres ★★★
() автор топика
Ответ на: комментарий от ya-betmen

Для домашних поделок это затруднительно. Но идею понял, спасибо.

Weres ★★★
() автор топика
Ответ на: комментарий от crutch_master

Я хочу поменять работу и практикуюсь в написании всего подряд. Работа связана с Джавой, поэтому на ней и пишу. Велосипед просто потому что могу. Мне показалось интересным написать парсер на Джаве. Наверняка есть парсеры быстрее, мне вот уже некий StAX насоветовали. Но, как я уже писал выше, хочется практики.

Weres ★★★
() автор топика
Ответ на: комментарий от anonymous

Поддерживаю, тоннель до любого доступного вне России сервера и нет проблем, тоже мне блокировщики.

ychuperka
()
Ответ на: комментарий от Weres

Нарой какой-нибудь open-source java проект. Разберись в коде, сделать пару коммитов (чтобы их внесли). Это очень хорошая практика. Доведи до ума, например, SquirrelSQL, чтобы он стабильно работал, не жрал много памяти, допили туда визуальный редактор структуры таблиц, переделай плагин для копирования данных, чтобы он не глючил и копировал хотя-бы 30 тыс.записей/сек. И тебе практика и клиент будет хороший.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Для опен-сорса нужен не джуниорский уровень. Я бы себя и джуниором не назвал. Мне будет стыдно коммитить в проект с нормальным кодом. Пока что попрактикуюсь на велосипедах. Вот разобраться, да стоило бы. Спасибо за наводку на SquirrelSQL, посмотрю код.

Weres ★★★
() автор топика
Ответ на: комментарий от Weres

Мне будет стыдно коммитить в проект с нормальным кодом.

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

crutch_master ★★★★★
()
Ответ на: комментарий от Weres

потом уже буду бегать по фреймворкам

Ну, BDD это подход к правильному написанию тестов, которые в то же время являются и документацией к тестируемому классу.

f1xmAn ★★★★★
()
Ответ на: комментарий от Weres

как то так

enum Colors {
    Red {
        @Override public String getHex() {
            return "#ff0000";
        },
    Blue {
        @Override public String getHex() {
            return "#0000ff"
        };

    public abstart String getHex();
}

kazufukurou
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.