|
|
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
Собственно ребята. Написал прогу для загрузки картинок в группу в vk.com. Это вторая написанная мной прога в процесе изучения java. Хотелось бы услышать критику от более опытных людей, если конечно вам не очень влом ковыряться в чужом коде. Програмулину выложил на гитхаб https://github.com/GaraZ/VKLoader еще есть архив если влом заливать Заранее благодарен за участие ) ЗЫ: в предыдущей теме прогнал со ссылкой (( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 11:13 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
App. - Java logger никто не юзает. Даже тут видно что его не удобно конфигурировать. - "Архитекура на Helper-ах" показывает несостоятельность в следовании Single Responsibility Principle. Если класс называется Helper, это значит что его создатель понятия не имеет для чего этот класс ему будет нужен. Так же и для читателя слово Helper никакой полезной информации не несёт. Просто мусор в коде. - mainForm.setVisible(true) вызывается до инициализации. Это значит юзер увидит не валидную форму. Если в методе initSettings предполагается progress indicator, то я бы назвал его runInitialization. Если не предполагается, то инициализацию стоит выполнить до вывода на UI. Common - класс с говорящим именем. Сразу понятно о чем речь. Ещё и с volatile полями. - забавно логгер конфигурируются через точку, а здесь текущая директория через System.getProperty("user.dir") (а это одно и то же). Причем очевидный copy paste. Стоило сделать parent/root dir отдельным полем. Я бы не рекомендовал user.dir. Он может быть разным у одного и того же приложения. В зависимости от того как запущено приложение. - Нет такого слова uncorrect. Возможно такое словообразование, но оно обозначало бы совсем другое. - getIsArhContent - JavaBeans спецификация разрешает boolean getter-ы с префиксом is. isArhContent() - Нет такого слова Arh. - getArhContentDir и getArhPagesDir бессмысленные методы. Созданые через copy paste. Если конфигурация не валидна, то приложение должно говорить об этом на этапе инициализации, а не на этапе использования настроек. - Вместо mkdir() стоит использовать mkdirs(), чтобы обезопасить код от будущих изменений в настройках. - для простого XML я бы использовал JAXB, а не DOM. Тем более что вам в обе стороны сериализовать нужно. DOM подходит хорошо для изменения данных в существующем XML. Crypt - getKey() - создаём массив значений, но зачем-то их все потом заменяем. Честно говоря не понял задумки. Имя метода плохое - не сообщает что именно делает метод. Так же в этом методе стоило написать коментарий. Мне сходу не понятно что там происходит. - Все методы статические. Зачем? - Нельзя так писать. Код: java 1. 2. Либо фигурные скобки. Либо в одну строку. Ну, и вообще, вернуть null при null аргументе это спорное решение. Только усложняет поиски источника null значения. Подумайте действительно ли вам нужны null значения. Или стоит просто запретить их на более верхнем уровне и не тыкать проверки где попало. CustomList - ещё одно имя не о чем. Можно было называть хотя бы XmlList. Правда не ясно почему обязательно эти методы к List привязывать, а не к любой сущности. - Зачем там E extends Object тоже не ясно. ExceptionLoggerForm - Хорошая попытка дать внятное имя классу. Но тем неменее не удачная. Почему Exception, если туда можно всё логировать? Почему Form? Если оно не для ввода, а для вывода. to be continued... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 12:15 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо огромное за коментарии! BlazkowiczApp. - Java logger никто не юзает. Даже тут видно что его не удобно конфигурировать. а что юзают? Log4J? Blazkowicz"Архитекура на Helper-ах" показывает несостоятельность в следовании Single Responsibility Principle. Если класс называется Helper, это значит что его создатель понятия не имеет для чего этот класс ему будет нужен. Так же и для читателя слово Helper никакой полезной информации не несёт. Просто мусор в коде. Вы правы. "Архитекура на Helper-ах" - я понятия не имею что это какая то специфическая архитектура. "Helper" назвал без какойто задней мысли BlazkowiczmainForm.setVisible(true) вызывается до инициализации. Это значит юзер увидит не валидную форму. Если в методе initSettings предполагается progress indicator, то я бы назвал его runInitialization. Если не предполагается, то инициализацию стоит выполнить до вывода на UI. Не доглядел. В принципе согласен. BlazkowiczCommon - класс с говорящим именем. Сразу понятно о чем речь. Ещё и с volatile полями Ну да )) Название наверное не очень. Там хранятся общие настройки. а volatile потому что эти настройки могут дергать несколько потоков Хотя да скорре всего volatile в данном случае бесмысленно. BlazkowiczЯ бы не рекомендовал user.dir. Он может быть разным у одного и того же приложения. В зависимости от того как запущено приложение. Можете этот момент разъяснить более подробно? BlazkowiczНет такого слова uncorrect. Возможно такое словообразование, но оно обозначало бы совсем другое. Там должно быть incorrect. Провтыкал BlazkowiczgetArhContentDir и getArhPagesDir бессмысленные методы. Созданые через copy paste. Если конфигурация не валидна, то приложение должно говорить об этом на этапе инициализации, а не на этапе использования настроек. Ну я хотел обезопаситься, если пути стали некорректными в процесе работы приложения. Ведь путь можно задать какой угодно в любой момент. Хотя возможно стоило поступить как-то иначе BlazkowiczВместо mkdir() стоит использовать mkdirs(), чтобы обезопасить код от будущих изменений в настройках. Да что то я этот метод провтыкал. Так конечно лучше. Blazkowiczдля простого XML я бы использовал JAXB, а не DOM. Тем более что вам в обе стороны сериализовать нужно. DOM подходит хорошо для изменения данных в существующем XML. Я про JAXB не слышал. Поковыряюсь что за зверь. BlazkowiczgetKey() - создаём массив значений, но зачем-то их все потом заменяем. Честно говоря не понял задумки. Имя метода плохое - не сообщает что именно делает метод. Так же в этом методе стоило написать коментарий. Мне сходу не понятно что там происходит. Ну задумка в том чтобы ключ зависел от мак адреса. Но поскольку длинна массива батов должна быть 16 байт, а длинна мак адреса меньше, то я заменяю только первые несколько байт в первоначальной последовательности Ну здесь конечно есть недоработка если мак адресов несколько) статические они потому что для каждой шифровки/дешифровки не вижу смысла создавать экземпляр класса. Blazkowicz- Нельзя так писать. if(source == null || source.trim().isEmpty()) return null; Либо фигурные скобки. Либо в одну строку. Ну, и вообще, вернуть null при null аргументе это спорное решение. Только усложняет поиски источника null значения. Подумайте действительно ли вам нужны null значения. Или стоит просто запретить их на более верхнем уровне и не тыкать проверки где попало. Насчет скобок согласен. Провтыкал просто. Ну а насчет нула - возможно вы правы. Подумаю. BlazkowiczCustomList - ещё одно имя не о чем. Можно было называть хотя бы XmlList. Правда не ясно почему обязательно эти методы к List привязывать, а не к любой сущности. - Зачем там E extends Object тоже не ясно. С фантазией что то туго было на тот момент. Ваше название получше. )) E extends Object не нужно действительно. Чесно говоря не помню о чем я тогда думал BlazkowiczExceptionLoggerForm - Хорошая попытка дать внятное имя классу. Но тем неменее не удачная. Почему Exception, если туда можно всё логировать? Почему Form? Если оно не для ввода, а для вывода. Ну хоть гдето хорошая попытка ))) Blazkowiczto be continued... Буду ждать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 12:59 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
GaraZВы правы. "Архитекура на Helper-ах" - я понятия не имею что это какая то специфическая архитектура. Ну, это как паттерн "золотой молоток" и аналогичные. Стиль программирования "не знаю как надо, сделаю как-нибудь". GaraZ"Helper" назвал без какойто задней мысли Можно вместо слова Helper использовать Manager. :) Зоркому взгляду понятно, что про SRP автор не знает. Но зато хоть выглядит солиднее - FileManager, например, чем FileHelper. GaraZBlazkowiczЯ бы не рекомендовал user.dir. Он может быть разным у одного и того же приложения. В зависимости от того как запущено приложение. Можете этот момент разъяснить более подробно? java -jar {полный путь к jar приложния} - эту команду можно запустить из любой директории системы. Из какой запустите, та и будет user.dir. Есть ещё такая тема что в Windows приложения принято ставить в Program Files. А в корпоративном\государственном секторе админы могут запретить запись в Program Files. Если ваше приложение захочет там хранить файлы, то он не будет работать под пользовательским аккаунтом. Только под админом. GaraZBlazkowiczgetArhContentDir и getArhPagesDir бессмысленные методы. Созданые через copy paste. Если конфигурация не валидна, то приложение должно говорить об этом на этапе инициализации, а не на этапе использования настроек. Ну я хотел обезопаситься, если пути стали некорректными в процесе работы приложения. Ведь путь можно задать какой угодно в любой момент. Хотя возможно стоило поступить как-то иначе Параметры нужно валидировать в момент установки. А не в момент чтения. В момент установки, падает валидация в stacktrace видно какая падла установила кривое значение. В момент чтения в stacktrace видно кто хочет получить валидное значение. Но оно уже не валидное. И для того чтобы узнать кто его установил, надо дебагать. Что намного дольше, чем просмотр stacktrace. А если это случится у клиента, то дебагать может быть и принципиально не возможно. Смысл вообще держать объект в невалидном состоянии и всем кричать - "я не валидный, я не валидный" GaraZНу задумка в том чтобы ключ зависел от мак адреса. Но поскольку длинна массива батов должна быть 16 байт, а длинна мак адреса меньше, то я заменяю только первые несколько байт в первоначальной последовательности Ну здесь конечно есть недоработка если мак адресов несколько) статические они потому что для каждой шифровки/дешифровки не вижу смысла создавать экземпляр класса. Стоило либо метод назвать так чтобы было понятно, что ключ вычисляется из MAC каким-то известным способом. Либо описать это в коментарии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 13:51 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
GaraZ, в сборке у тебя есть java_cup. А через какую dependency ты ее подключаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 13:54 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
mayton, перерыл весь код где я его использую java_cup так и не нашел ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:17 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Blazkowiczjava -jar {полный путь к jar приложния} - эту команду можно запустить из любой директории системы. Из какой запустите, та и будет user.dir. Есть ещё такая тема что в Windows приложения принято ставить в Program Files. А в корпоративном\государственном секторе админы могут запретить запись в Program Files. Если ваше приложение захочет там хранить файлы, то он не будет работать под пользовательским аккаунтом. Только под админом. Именно изз того что доступ к папке может быть залочен я решил по умолчанию складывать все туда где запущено приложение про то что приложение можна запустить с любого места я както не подумал так какое наиболее приемлимое решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:21 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
GaraZmayton, перерыл весь код где я его использую java_cup так и не нашел ) А ладно. Забудь. Я думаю это в зависимостях от gson или html cleaner или еще чего-то что должно парсить текст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:29 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
GaraZBlazkowiczCustomList - ещё одно имя не о чем. Можно было называть хотя бы XmlList. Правда не ясно почему обязательно эти методы к List привязывать, а не к любой сущности. - Зачем там E extends Object тоже не ясно. С фантазией что то туго было на тот момент. Ваше название получше. )) E extends Object не нужно действительно. Чесно говоря не помню о чем я тогда думал Я вспомнил )) без объявления Код: java 1. в интерфейсе я не могу сделать вот так в реализации Код: java 1. а без этого я не могу сделать вот так Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:30 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
В конфигах мне кажется лучше прописывать пути к home-каталогу пользователя. Код: xml 1. Или через точку ".". Или через "user.home". Так надёжнее что будет доступ на запись всегда и приватнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:33 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
ExceptionLoggerForm - setLocationRelativeTo(null); - по центру экрана. Лучше ориентироваться по родителю. - Родительское окно не указано для JDialog, это приводит к багам в Swing при пеперключении через Alt-TAB между окнами. Особенно на модальном может вылезти. Лучше указывать родительское окно всегда. - Я вообще не понимаю, почему вы учитесь на Swing. Стоило взять JavaFX. - В данном тривиальном примере, конечно, не критично. Но переменным всегда стоит давать внятные и красивые имена, даже UI контролам. А не те что предлагает IDE по-умолчанию. textArea, mainPanel, scrollPane читаются и выглядят намного лучше чем jTextArea, jPanelMain и jScrollPane. - Поле объявлено внизу класса. Это Coding Convention такой? FileHelper - MASKS_LIST - почему константа и вдруг Mutable список? - if (MASKS_LIST.isEmpty()) return true; Зачем проверка что он пустой? Другие классы меняют состояние этого поля? Инкапсуляция ни к черту. - Coding Convention обычно требует определенный порядок членов класса. А тут бац - в середине static метод. - Это не одно ли и то же? Зачем так раздувать код? Для диплома? Код: java 1. 2. 3. 4. 5. Вам же уже писали что JavaDoc стоит читать, а не копипастить код отовсюду. - getHarmonizeSelFiles - генерики куда-то просрались. - if (fl == true) - Идия Style? - fl это вообще что за переменная? Flag? Flag чего? Совпадения? Так и надо было назвать тогда equal, matches, etc. - file.delete() - результат этого метода стоит обрабатывать. А так же изучть Java NIO2 API для работы с файлами. И использовать его. - selFilesList = selectedFiles не сокращайте без надобности. Код должен быть как можно ближе к английскому языку. - используйте Buffered UI Stream-ы. Это проще чем самому через byte[] гонять данные. - GregorianCalendar calendar = new GregorianCalendar(); лучше Calendar calendar = Calendar.newInstance(); - FileHelper работает с файлами. А у вас какие-то images везде в именах проскакиваю. Хотя методам всё равно image там ли что-то другое. - Локальный StringBuilder не нужен, если нет цикла, который в него добавляет строки. Лучше строить пути через File/Path API, а не через String. - changeSelListPos - не хватает пробелов вокруг +,-,> - форматируйте свой код в IDE и настройте форматирование согласно выбраному соглашению о кодировании. - строки вида if (arg == null) return false/null; лучше отделять от тела методов дополнительным переносом строки. Тогда видно, тут у нас валидация аргумента, а тут у нас реализация логики. - ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:33 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
maytonВ конфигах мне кажется лучше прописывать пути к home-каталогу пользователя. Код: xml 1. Или через точку ".". Или через "user.home". Так надёжнее что будет доступ на запись всегда и приватнее. Точка это то же самое что user.dir. user.home - правильное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:35 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, а оно работает ? Использовать можно по назначению? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 14:55 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
JCanvas - в drawImage вместо null стоило передать this. Это должно уберечь от частичной отрисовки изображения до его окончательной загрузки. MainForm - реальная колбаса. - Ох, как не хватает Dependency Injection: Код: java 1. 2. если мне влом подключать Spring или другой IoC контейнер, я просто завожу отдельный класс, который у меня собирает всю структуру. Такие циклические зависимости как App создаёт MainForm, а MainForm использует App, только всё усложнают. Аналогично и с SettingsForm. - FilesTreeCellRenderer вызывает showImage, который больше нигде не используется, но метод зачем-то во внешнем классе. Renderer, ведь, можно было спокойно отдельным классом оформить? - Нарушения принципа "наименьшего удивления": Код: java 1. 2. 3. - Строки вида app.getSettingsHelper().getCommon().getIsArhPages() - это грубейшее нарушение инкапсуляции. А так же "угадай какой из методов верунул null" и привел к NPE. - Вместо if (evt.getSource() == someControl), вместо KeyAdapter и т.п. лучше использовать Action. Его можно пере-использовать. Из них проще строить иерархию. Они не будут раздувать методы, когда у вас появиться десяток-другой пунктов в меню. Плюсов море. - MigLayout рулит. - getFocusDown() это для чего вообще? Есть устойчивое чуство что можно было проще. - Никаким MVP, смотрю, не пахнет. Все удаления\добавления происходят сразу на дереве, а не на бизнес-модели. - В целом, тот самый "золотой молоток", о котором я писал выше. И GUI показывает. И кучу бизнес-логики реализует. - line.separator разве работает в JOptionPane? По-моему нужно JTextArea использовать вместо строки. ProfileObj - Object login; - как так? - А вот это оригинально. Код: java 1. 2. 3. 4. Чем гарантируется уникльность hashCode? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:12 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
GaraZЯ вспомнил )) без объявления Код: java 1. в интерфейсе я не могу сделать вот так в реализации Код: java 1. а без этого я не могу сделать вот так Код: java 1. Просто где-то недоразобрались с генериками. В идеале типа Object в коде не должно быть вообще. Либо генерик тип, либо конкретный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:23 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
MasterZivBlazkowicz, а оно работает ? Использовать можно по назначению? Это к какому моему коментарию вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:24 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
ProfilesArrayList показывает нам основной косяк подхода Active Record в Java. Почему для загрузки нового экземпляра ProfilesArrayList требуется какой-то другой экземпляр, чтобы вызывать instance метод readFromXML? В каком отношении старый экземпляр состоит с новым? JAXB позволит выкинуть вам кучу лишнего кода. Наследование от ArrayList тоже спорное решение. Обратите внимание сколько общего кода между SitesArrayList и ProfilesArrayList. Возникает резонный вопрос. Почему бы общий код не вынести в общий предок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:29 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
SettingsForm - в рот мне ноги! Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:32 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Blazkowicz- Родительское окно не указано для JDialog, это приводит к багам в Swing при пеперключении через Alt-TAB между окнами. Особенно на модальном может вылезти. Лучше указывать родительское окно всегда. - Я вообще не понимаю, почему вы учитесь на Swing. Стоило взять JavaFX. Багов не замечал. Компоненты Swing описывались в тех учебниках которые я читал. Про JavaFX ничего не встречал, а специально не смотрел. Посмотрю по свободе что за зверь Blazkowicz- В данном тривиальном примере, конечно, не критично. Но переменным всегда стоит давать внятные и красивые имена, даже UI контролам. А не те что предлагает IDE по-умолчанию. textArea, mainPanel, scrollPane читаются и выглядят намного лучше чем jTextArea, jPanelMain и jScrollPane. Интерфейсы я создавал вручную.Эти названия мне показались достаточно красивыми )) Blazkowicz- MASKS_LIST - почему константа и вдруг Mutable список? - if (MASKS_LIST.isEmpty()) return true; Зачем проверка что он пустой? Другие классы меняют состояние этого поля? Инкапсуляция ни к черту. Да в данном варианте согласен - полная ерунда. Я собирался MASKS_LIST вынести в интерфейс, но потом чето передумал, а переписать забыл. Гон конечно. Каюсь ( BlazkowiczВам же уже писали что JavaDoc стоит читать, а не копипастить код отовсюду. - getHarmonizeSelFiles - генерики куда-то просрались. - if (fl == true) - Идия Style? - fl это вообще что за переменная? Flag? Flag чего? Совпадения? Так и надо было назвать тогда equal, matches, etc. Доку читаю по необходимости, но копипастить проще ))) Про fl наверное следовало назвать более осмысленно, но функция маленькая в ней сложно запутаться Blazkowiczfile.delete() - результат этого метода стоит обрабатывать. А так же изучть Java NIO2 API для работы с файлами. И использовать его. Спасиб посмотрю. Blazkowicz- используйте Buffered UI Stream-ы. Это проще чем самому через byte[] гонять данные. Так проще или лучше? BlazkowiczGregorianCalendar calendar = new GregorianCalendar(); лучше Calendar calendar = Calendar.newInstance(); Чем лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:49 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
SettingsHelper - сериализация может подтормаживать, если нет буферизации input\output stream. Будем надеятся что Dom4j сам обернет. - в XML сериализуется, а интерфейс не реализует. - readFile не закрывает стримы. Почему try-with-resource не используется? SiteHelper - длинный список аргументов я предпочитаю форматировать в столбик. - GetThread - ни о чем. Что за поток? Чем занимается? - GetThread - цикла в run не вижу. Зачем надо было наследоваться от Thread? Используйте Executors/SwingWorker. - Есть потоки, но обращение к GUI не выполнено из EDT. Срочно читать статьи о потоках в Swing. - parse методы - каша, вникать лень. class Timer implements Runnable Really? То есть java.util.Timer, javax.swing.Timer и ScheduledExecutorService на столько кривые, что пришлось написать свой? TokenForm - Hyperlink label стоило оформить отдельным классом-Swing-контролом. - А что за мода на StringBuilder-ы пошла? У меня молодой коллега так же пишет где попало. VkHelper - много сомнительных констат. В целом, такое надо было на каком-то динамическом скриптовом языке писать, чтобы при изменении адресов и URL VK вдруг не потребовалось пересобирать проект, а можно было бы просто обновить скрипт. В целом, очень сильно не хватает разбиения на абстрактные слои. Тонны бизнес-логики в GUI классах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:54 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
Blazkowiczмода на StringBuilder это из-за того что копипастят из декомпилорованного кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 15:55 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
GaraZБагов не замечал. Возможно это только в модальных. GaraZКомпоненты Swing описывались в тех учебниках которые я читал. Какого года учебники? GaraZПро fl наверное следовало назвать более осмысленно, но функция маленькая в ней сложно запутаться Если flag имеет значение, то его можно прочитать из названия. В противном случае нужно разбираться из кода, что же этот флаг обозначает. А функции имеют свойство расти во временем. GaraZBlazkowicz- используйте Buffered UI Stream-ы. Это проще чем самому через byte[] гонять данные. Так проще или лучше? Если потоки не буферизировать вообще, будет поддтормаживать. Потоки чтения\записи лучше буферизировать. Buffered Reader-ы и Stream-ы проще использовать, чем самому создавать массив и цикл копирования через него. GaraZBlazkowiczGregorianCalendar calendar = new GregorianCalendar(); лучше Calendar calendar = Calendar.newInstance(); Чем лучше? Не знаю. Как-то привычнее и вопросов не вызывает. Почему именно GregorianCalendar... Абстракцию, ведь, для чего-то создали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 16:03 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
ЛагманBlazkowiczмода на StringBuilder это из-за того что копипастят из декомпилорованного кода. Не думаю. Просто прочитали что конкатенация тормозит, но не разобрались где и почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 16:04 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЛагманпропущено... это из-за того что копипастят из декомпилорованного кода. Не думаю. Просто прочитали что конкатенация тормозит, но не разобрались где и почему. именно )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 16:07 |
|
||
|
Покритикуйте код. Заход 2
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, BlazkowiczJCanvas - в drawImage вместо null стоило передать this. Это должно уберечь от частичной отрисовки изображения до его окончательной загрузки. Спасибо не знал Blazkowiczесли мне влом подключать Spring или другой IoC контейнер, я просто завожу отдельный класс, который у меня собирает всю структуру. Такие циклические зависимости как App создаёт MainForm, а MainForm использует App, только всё усложнают. Аналогично и с SettingsForm. Да согласен что както запутано. Но как будет лучше я както смутно представляю BlazkowiczFilesTreeCellRenderer вызывает showImage, который больше нигде не используется, но метод зачем-то во внешнем классе. Renderer, ведь, можно было спокойно отдельным классом оформить? Можно было конечно BlazkowiczСтроки вида app.getSettingsHelper().getCommon().getIsArhPages() - это грубейшее нарушение инкапсуляции. А так же "угадай какой из методов верунул null" и привел к NPE. а как лучше сделать? не испотльзовать один класс дя доступа к другим а передавать их все в конструктор (Допустим MainForm) BlazkowiczВместо if (evt.getSource() == someControl), вместо KeyAdapter и т.п. лучше использовать Action. Его можно пере-использовать. Из них проще строить иерархию. Они не будут раздувать методы, когда у вас появиться десяток-другой пунктов в меню. Плюсов море. MigLayout рулит. Погляжу. Пока я не в теме BlazkowiczgetFocusDown() это для чего вообще? Есть устойчивое чуство что можно было проще. Когда из Дерева удаляем ноду - фокус должен переместится на следущую или на первую - если удаленная нода последняя Blazkowiczline.separator разве работает в JOptionPane? По-моему нужно JTextArea использовать вместо строки а почему нет BlazkowiczProfileObj - Object login; - как так? - А вот это оригинально. public boolean equals(Object obj) { ... return this.hashCode() == obj.hashCode(); } В общем в текущей реализации переопределять equals вообще нет никакого смыла. Это осталось от более ранней версии но я и сам понял что херня какаято вообще забыл что что-то там переопределял (( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 16:14 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38525769&tid=2127739]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 453ms |

| 0 / 0 |
