Как избежать случаев при попытке сделать отчет класса статистики? - PullRequest
0 голосов
/ 02 декабря 2018

Существует класс статистики, который должен принимать определенный набор объектов, имеющих значение int, из которого нам нужно вычислить среднее / медиану / наибольший / ... из.Эти результаты должны быть выведены в отчет файлов различных типов (txt / html /...).

Вот класс статистики:

public class Statistics {

private IStatsCommand highestValue;
private IStatsCommand lowestValue;
private int median;
private int average;


public Statistics(List<IStatsCommand> commands){
    calculateAverage(commands);
    calculateMedian(commands);
    calculateHighestValue(commands);
    calculateLowestValue(commands);
}

public void calculateAverage(List<IStatsCommand> commands){

    int totalValue = 0;
    for(IStatsCommand command: commands){
        totalValue += command.execute();
    }
    this.average =  totalValue/commands.size();
}



public void calculateMedian(List<IStatsCommand> commands) {

    List<IStatsCommand> newCommands = commands;
    int median = 0;

    Collections.sort(newCommands, new Comparator<IStatsCommand>() {

        @Override
        public int compare(IStatsCommand command1, IStatsCommand command2) {

            return command1.execute() - command2.execute();
        }
    });

    int index = newCommands.size()/2;
    if (newCommands.size()%2 == 1){
        median = newCommands.get(index).execute();
    }
    else{

        median = (newCommands.get(index).execute() + newCommands.get(index - 1).execute())/2;
    }
    this.median = median;
}

public void calculateHighestValue(List<IStatsCommand> commands){
    IStatsCommand commandWithHighestValue = commands.get(0);
    for(IStatsCommand command: commands){
        if (command.execute() > commandWithHighestValue.execute()){
            commandWithHighestValue = command;
        }
    }
    this.highestValue = commandWithHighestValue;
}

public void calculateLowestValue(List<IStatsCommand> commands){
    IStatsCommand commandWithLowestValue = commands.get(0);
    for(IStatsCommand command: commands){
        if (command.execute() < commandWithLowestValue.execute()){
            commandWithLowestValue = command;
        }
    }
    this.lowestValue = commandWithLowestValue;
}

public IStatsCommand getHighestValue(){
    return this.highestValue;
}

public IStatsCommand getLowestValue() {
    return lowestValue;
}

public int getMedian() {
    return median;
}

public int getAverage() {
    return average;
}
}

Теперь мне нужно создатьотчет из этого файла.Мне нужно добавить дополнительную информацию от самого высокого и самого низкого объекта.Эти объекты могут быть различными вещами, из которых необходимо извлечь различную информацию, в значительной степени зависящую от объекта.Как создать report class, чтобы избежать проверки конкретного типа каждого из этих IStatsCommand объектов в классе статистики, используя что-то вроде instance of.

Я попытался передать тип в Статистика, а затемв report class были функции toString(Statistics st, Type1 t1), toString(Statistics st, Type2 t2).Но это сильно загромождало класс и не давало большой гибкости другим программистам.Как бы я улучшил свой дизайн для лучшего класса отчета?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...