@demon123
developer

Объясните код, если можно то с комментариями?

package bf;

import java.util.HashMap;
import bf.DataBaseException;
import bf.SysOptionController;

class Tries {

    private long lastTry;
    private int tryCount;

    public Tries() {
        tryCount = 0;
        lastTry = System.currentTimeMillis();
    }

    public long getLastTry() {
        return lastTry;
    }

    public int getTryCount() {
        return tryCount;
    }

    public void addTryCount() {
        this.tryCount++;
        lastTry = System.currentTimeMillis();
    }

    public void reset() {
        this.tryCount = 0;
    }
}

public class BFController {

    private long lockTime;
    private int retries;
    private final HashMap<String, Tries> map = new HashMap<String, Tries>();

    public BFController(SysOptionController soc) throws DataBaseException {
        synchronize(soc);
    }

    public final synchronized void synchronize(SysOptionController soc) throws DataBaseException {
        retries = (Integer) soc.getOption("retries").getValue();
        lockTime = (Integer) soc.getOption("lockmills").getValue();
    }

    public synchronized boolean needWait(String ipAnduser) {
        Tries t = map.get(ipAnduser);
        if (t == null) {
            return false;
        }
        if (t.getTryCount() < retries) {
            return false;
        }
        if (t.getLastTry() < System.currentTimeMillis() - lockTime) {
            return false;
        }
        return true;
    }

    public synchronized void addTry(String ipAnduser) {
        Tries t = map.get(ipAnduser);
        if (t == null) {
            t = new Tries();
            map.put(ipAnduser, t);
        }
        t.addTryCount();
    }

    public synchronized void resetTries(String ipAnduser) {
        Tries t = map.get(ipAnduser);
        if (t == null) {
            return;
        }
        t.reset();
    }
}
  • Вопрос задан
  • 2353 просмотра
Решения вопроса 1
pi314
@pi314
Президент Солнечной системы и окрестностей
Код - как код... умеренной кривизны. Тянет из какой-то БД параметры (таймаут и количество попыток), откладывает в Мэп некие статусы по ключу IP+Пользователь, и позволяет опрашивать их состояние (не вышел ли таймаут и не исчерпано ли заданное количество попыток) / удалять / сбрасывать... короче, очень похоже на кусок какой-то хрени для рассылки спама.

Что конкретно непонятно в этом коде?
Спрашивайте!.. не думаю, что кто-нибудь станет просто так комментировать каждую строчку этой простыни без конкретной постановки вопроса :)

Update:
@gurinderu
Прикольно, а откуда инфа про базу данных? )))))))

@Losted
По DataBaseException, полагаю


Именно... эта exception может прилететь только из getOption(). А в остальном все просто, как угол дома. Некая сущность создает экземпляр этого класса, передавая в конструктор контроллер, из которого при инициализации потянутся начальные "настройки". Т.к. метод synchronize() публичный, очевидно, данные в "базе" могут поменяться на лету, и его можно дернуть еще раз, чтоб перезачитать актуальные настройки. (Действительно ли за этим скрывается БД или что-то другое, сказать невозможно - детали абстрагированы фасадом SysOptionController.)

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

Отсюда более-менее понятно, что делает эта некая сущность. Скорее всего, она предназначена для выполнения какого-то действия с "пользователями" (например, отправки им спама), которое может сработать с первого раза, а может и не сработать. На обработку одного пользователя отводится лимит времени и попыток. Пользователь идентифицируется по IP и имени. Скорее всего, там есть некий ЕхecutionService с пулом потоков. Поток получает экземпляр BFController и, в зависимости от того, что он делает, может воспользоваться соотв. методами:
addTry() - когда начинается очередная "попытка"
needWait() - чтоб проверить, продолжать ли попытки или лимит для пользователя исчерпан
resetTries() - чтоб сбросить счетчик попыток.

Помимо кривой синхронизации, семантика публичного интерфейса мутная, базируется на неких неочевидных предположениях об использовании класса и, вдобавок, реализация никак не очищает память. Короче, с т.з. объектного дизайна - уверенная троечка с плюсом :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы