Skip to content

Instantly share code, notes, and snippets.

@saber-nyan
Last active June 5, 2018 16:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saber-nyan/850f72587a82e6ad10d916a4623ab52a to your computer and use it in GitHub Desktop.
Save saber-nyan/850f72587a82e6ad10d916a4623ab52a to your computer and use it in GitHub Desktop.

Руки бы оторвать за три класса в файле!
Это мне еще повезло, что ИДЕЯ их вот так отображает:
CYKA

Не стоит импортировать с *, чуть медленнее запускается и со временем запутаешься в зависимостях.

CommonLog.java

Строка 5 private static final ArrayList<String> commonLog = new ArrayList<>();

Статическая коллекция, если ее можно сделать не статической, и при этом ничего не сломать -- не нужна.
Можно считать ее как утечку памяти, ведь она постоянно проинициализирована и хранит в себе данные...

Строка 7 commonLog.add(new Date().toString() + " " + record);

Лучше не вызывать лишний раз toString() -- сбережешься от лишнего NPE, ведь оно само приводится к строке при конкатенации.
В твоем случае получишь ексепшен, в случае без toString() строку null.

Строка 16-18

У тебя:

    public static String getRecordsAsString() {
        String result = "";
        for (String record : commonLog)
            result += record + "\n";
        return result;
    }

Было бы быстрее:

    public static String getRecordsAsString() {
        StringBuilder result = new StringBuilder();
        for (String record : commonLog)
            result.append(record).append("\n");

        return result.toString();
    }

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

ConfigGenerator.java

Строка 80 configMap.put("NetworkLatencyMultiplier", (float)3.0);

Вместо (float) 10.0 можно написать 10f. Там еще с другими типами такая штука есть.

Строка 105 new File("jphon.config").delete();

Игнорируешь результат delete(). Он возвращает статус (из доков):

     * @return  <code>true</code> if and only if the file or directory is
     *          successfully deleted; <code>false</code> otherwise

Если файл не удалится, дальше все пойдет по пизде и будет глючить, судя по коду.

Строка 106 (№1) Files.write(Paths.get("jphon.config"), Arrays.asList(config), Charset.forName("US-ASCII"), StandardOpenOption.CREATE_NEW);

ИДЕЯ говорит мне, что если у тебя один элемент, то вместо Arrays.asList(obj) лучше писать Collections.singletonList(obj).
Но учти -- этот массив будет иммутабельным.

Строка 106 (№2) Files.write(Paths.get("jphon.config"), Arrays.asList(config), Charset.forName("US-ASCII"), StandardOpenOption.CREATE_NEW);

Чому US-ASCII? По стандарту JSON должен лежать в одном из: UTF-{8,16,32}.

CoreHandler.java

Строка 4 interface CoreHandlerInterface {

А интерфейс здесь вообще нужен? Просто я ща поискал по коду, он используется только один раз -- после его объявления.

Строка 5 public InputStream startProcess() throws Exception, IOException;

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

Строка 12 private InputStream inputStream;

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

Строка 17, 22 и так далее throw new Exception("Ядро уже запущено!");

Лучше сабкласнуть Exception своим классом. Так и семантика лучше, и какие-нибудь данные кроме строки с информацией туда можешь запихнуть.

Строка 49-50

        } catch (IOException|SecurityException e) {
            throw new Exception("Ошибка при запуске процесса!");
        }

За такое отрывают руки -- ты не залоггировал причину на месте или не пробросил source exception (ексепшн, который ты поймал) вверх по стеку.
Экспресс-фикс: throw new Exception("Ошибка при запуске процесса!", e);, ну лучше, как я уже говорил, сабкласснуть Exception.

Строка 67 return coreProcess != null;

Думаю, если coreProcess не равен null, то надо еще проверить isAlive().

CoreParser.java

Ух, ебать! Хуй разберешься, что здесь происходит, как-то все в одном бедном конструкторе навалено.
Разнеси по разным методам, даже если они будут вызываться из одного места. Итак...

Строка 6, 12

Nested try. Здесь тот самый случай, когда ексепшн лучше пробросить наверх, а то совсем каша.

Строка 11 while ((json = br.readLine()) != null) {

Не понял, что здесь происходит -- ты считываешь ЖСОН по строчке? У него же структура есть... Хотя если это работает, то я упоролся.

Там же

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

Строка 18 switch(parsed.get("noticeType").getAsString()) {

На будущее -- строки в switch сравнивать небезопасно из-за коллизии хешей, здесь они слабенькие.

Строка 92 CommonLog.addRecord(json);

break; в последнем выражении свитча, конечно, не обязателен, но лучше поставить -- а вдруг ты после этого еще один кейс допишешь?
Охуеешь отлаживать.

Строка 95 CommonLog.addRecord("! Json нихера не парсится. Что-то не так пошло. Проблемная строка:");

Ты залоггировал JSON, что не распарсился, но не записал сам ексепшен, а там тоже есть полезные сведения.

Main.java!

Тут сразу в начале файла четыре поля, которые можно преобразовать в локальные переменные, но не суть.
Именно в этом файле могу ошибаться, так как со свингом не работал.

Строка 46-48 и другие одновызовные лямбды

            trayMenuShow.addActionListener((ActionEvent e) -> {
                toggleVisibility(aboutFrame);
            });

можно заменить на

trayMenuShow.addActionListener((ActionEvent e) -> toggleVisibility(aboutFrame));

Строка 65-69

                            if (getState() == Frame.NORMAL) {
                                setState(Frame.ICONIFIED);
                            } else {
                                setState(Frame.NORMAL);
                            }

можно полностью заменить на тернарный оператор setState(getState() == Frame.NORMAL ? Frame.ICONIFIED : Frame.NORMAL);, но я их не люблю.

Строка 109-111

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            coreHandler.stopProcess();
        }));

можно заменить на Runtime.getRuntime().addShutdownHook(new Thread(() -> coreHandler.stopProcess()));, но еще лучше заменить на Runtime.getRuntime().addShutdownHook(new Thread(coreHandler::stopProcess));.

Строка 490-491

                    CoreParser coreParser;
                    coreParser = new CoreParser(is);

Поскольку эта переменная присваивается, но не считывается, компилятор имеет полное право это выражения удалить, емнип. Оно здесь нужно?

ЕБАТЬ Я МНОГО НАПИСАЛ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment