Существует класс статистики, который должен принимать определенный набор объектов, имеющих значение 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)
.Но это сильно загромождало класс и не давало большой гибкости другим программистам.Как бы я улучшил свой дизайн для лучшего класса отчета?