#android #инспекция_кода
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются. Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском». Закрыт 2 года назад. Исправил все баги и недочеты что написали в прошлый раз, добавил нормальное отображение текста и фотографии, теперь ссылка будет ссылкой, фотка фоткой и тд... Добавил проект этот в github И переписал его, чтобы он удовлетворял принципам MVP (Хотя не уверен т.к. model имеет ссылку на Presenter) Прошу подсказать с ревью кода
Ответы
Ответ 1
По одному классу CommentAnswerObject. Думаю в остальных так же. Зачем тут два огромных конструктора, фактически дублирующих друг друга? public CommentAnswerObject(String urlImage, String name, String dogName, String text, String date, int numberUserComments, int numberLikeComents, boolean like, ListtoggleObjects) { this.urlImage = urlImage; this.name = name; this.dogName = dogName; this.text = text; this.date = date; this.numberUserComments = numberUserComments; this.numberLikeComents = numberLikeComents; this.like = like; this.toggleObjects = toggleObjects; } public CommentAnswerObject(String urlImage, String name, String dogName, String text, String date, int numberUserComments, int numberLikeComents, boolean like) { this.urlImage = urlImage; this.name = name; this.dogName = dogName; this.text = text; this.date = date; this.numberUserComments = numberUserComments; this.numberLikeComents = numberLikeComents; this.like = like; } Второй легко заменяется на public CommentAnswerObject(String urlImage, String name, String dogName, String text, String date, int numberUserComments, int numberLikeComents, boolean like){ this(urlImage, name, dogName, text, date, numberUserComments, numberLikeComments, like, new ArrayList<>()); } Такое огромное количество аргументов конструктора в 99% случаев говорит о том, что класс неправильно спроектирован. Действительно ли в этом объекте нужны все эти поля? Как он используется? Какова его ЕДИНСТВЕННАЯ ОТВЕТСТВЕННОСТЬ? Вот это экстрактится в класс CommentContent this.urlImage = urlImage; this.name = name; this.dogName = dogName; //имя собаки? this.text = text; Для чего используются эти два свойства? this.numberUserComments = numberUserComments; this.numberLikeComents = numberLikeComents; По CardObject. Все то-же, но и еще: у вас мешанина методов. Один конструктор сверху, другие разбросаны по тексту. Почитайте Роберта Мартина "Чистый код" раздел "Вертикальное форматирование" Класс HTTP. По феншую лучше Http. Статика - зло. В данном случае лучше применить паттерн Singletone. Он тоже не сахар, но при умелой готовке вполне себе ничего. ParsingPage - вообще жесть. Чистый Код в руки и читать до дыр. Методы адски перегружены логикой и вызывают кровотечение из глаз при попытке понять, что происходит. Для начала разбить монстров на кучу мелких методов, выполняющих атомарные операции и понять, что половина из них дублирует друг друга. Вообще данный класс штуки на 4 разбивать надо, на глаз если. Например класс ParsingPage метод parsFullTag (закроем глаза на статику), первая итерация "причесывания" private static NameAndTagFullInfoObject full; private static String html; public static NameAndTagFullInfoObject parsFullTag(String html) { full = new NameAndTagFullInfoObject(); ParsingPage.html = html; setName(); setUrlPhoto(); if (html.contains(" ")) setDopName(); if (html.contains("")) { setContribution(); } setQuestion(); setAnswer(); setDecisions(); setTextInto(); return full; } private static void setName() { full.setName(html.split("Информация по тегу «")[1].split("».")[0]); } private static void setUrlPhoto() { full.setUrlPhoto(tagContent("",1 )); } private static void setDopName() { full.setDopName(divContent("page-header__subtitle\" itemprop=\"jobTitle",1 )); } private static void setContribution() { full.setContribution(joinNewLine(divContent("mini-counter__count mini-counter__count-contribution", 1), divContent("mini-counter__value", 1)); } private static void setQuestion() { full.setQuestion(joinNewLine(divContent("mini-counter__count", 1), divContent("mini-counter__value", 2)); } private static void setAnswer() { full.setAnswer(joinNewLine(divContent("mini-counter__count", 2), divContent("mini-counter__value", 3)); } private static void setDecisions() { full.setDecisions(joinNewLine(divContent("mini-counter__count mini-counter__count-solutions", 1), divContent("mini-counter__value", 4))); } private static void setTextInto() { full.setTextInfo(trim(html.split(" ")[1].split("")[0]) + "\n"); } private static String joinNewLine(String first, String second) { return first + "\n" + second; } private static String divContent(String div, int position) { return tagContent(" ", "", position) } private static String tagContent(String start, String end, int position){ return trim(html.split(start)[position].split(end)[0]); } private static String trim(String string) { return string.replaceAll("\n", "").replaceAll(" ", ""); } Код метода стал читаемым. Просто читая его сверху вниз понятно, что он делает. Можно легко найти и поменять/отладить отдельные операции. Например если изменилась разметка для поиска setUrlPhoto мы правим один простой метод, который находится мнгновенно. Методы trim, divContent, tagContent, joinNewLines прекрасно применяются ко всем остальным методам вашего класса, катастрофически повышая их читаемость и сокращая размер.
Комментариев нет:
Отправить комментарий