HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

Calculate work progress in percentage of batches that contain tasks and task contain sub tasks

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
containsubbatchesprogresstasksthatworkcalculateandpercentage

Problem

I am trying to calculate work progress in percentage. I have multiple batches, and each batch contains a set of tasks and each task also contains a set of sub tasks. Below code is the best I could do. Is there any more efficient way to do this?

I just edited the code using the Math static method to do help with rounding and getting the next up value.

```
double numOfBatches = 3;
double weightOfEachBatch = (1*100)/numOfBatches;

double numOfTasksInEachBatch = 1;
double weightOfEachTask =
(1*weightOfEachBatch)/numOfTasksInEachBatch;

double numOfSubTasksInEachTask = 2;
double weightOfEachSubTask =
(1*weightOfEachTask)/numOfSubTasksInEachTask;

System.out.println("Weight of each batch: " + weightOfEachBatch + "%");
System.out.println("Weight of each task: " + weightOfEachTask + "%");
System.out.println("Weight of each sub task: " + weightOfEachSubTask + "%");

double fromBatchWeight = 0;
for(int i = 1; i <= numOfBatches; i++) {

double toBatchWeight = weightOfEachBatch * i;
System.out.println(
"Batch " + i +
" from " + Math.floor(fromBatchWeight) +
"% to " + Math.floor(toBatchWeight) + "%");

double fromTaskWeight = fromBatchWeight;
for(int j = 1; j <= numOfTasksInEachBatch; j++) {

double toTaskWeight = (weightOfEachTask * j) + fromBatchWeight;
System.out.println(
"\tTask " + j +
" from " + Math.floor(fromTaskWeight) +
"% to " + Math.floor(toTaskWeight) + "%");

double fromSubTaskWeight = fromTaskWeight;
for(int k = 1; k <= numOfSubTasksInEachTask; k++) {

double toSubTaskWeight = (weightOfEachSubTask * k) + fromTaskWeight;
System.out.println(
"\t\tSub Task " + k +
" from " + Math.floor(fromSubTaskWeight) +
"% to " + Math

Solution

-
System.out.println("\t\tSub Task " + k + " from " + Math.floor(fromSubTaskWeight) + "% to "
    + Math.floor(toSubTaskWeight) + "%");


I'd use System.out.format here, it's easier to read than string concatenation:

System.out.format("\t\tSub Task %d from %f%% to %f%%%n", 
    k, Math.floor(fromSubTaskWeight), Math.floor(toSubTaskWeight));


With that you can easily format floating numbers.

Weight of each task: 33,333333%
Weight of each sub task: 16,666667%


Could be a readable

Weight of each task: 33,33%
Weight of each sub task: 16,67%


With

System.out.format("Weight of each task: %.2f%%%n", weightOfEachTask);
System.out.format("Weight of each sub task: %.2f%%%n", weightOfEachSubTask);


-
Having three nested for loops is hard to read. I'd try to extract out a printSubtaskWeights and a printTaskWeights method.

-
I've seen earlier the numOfSubTasksInEachTask style variables but I've found subTasksInEachTaskNumber more easier to work with. Maybe because if more than one variable starts with numOf it's hard to differentiate them.

-
i, j, k variables could be more descriptive and could express their purpose. For example,
batchNumber, taskNumber and subtaskNumber.

-
Batches, tasks and subtasks looks very similar. I'd try to create a common abstraction for them and use that three times instead of duplication.

public class Item {

    private int subItemCount;
    private double weight;

    public Item(final int subItemCount, double weight) {
        super();
        this.subItemCount = subItemCount;
        this.weight = weight;
    }

    public int getSubItemCount() {
        return subItemCount;
    }

    public double getOneSubItemWeight() {
        final double subItemWeight = (1 * weight) / subItemCount;
        return subItemWeight;
    }

    public String getWeightInfo() {
        return String.format("Weight of each %s: %.2f%%", 
            name, getOneSubItemWeight());
    }
}


(I'd call it Task but it hasn't already been used.)

I started refactoring the code but I guess I won't finish it. The beginning of the code looked like this:

final Item batches = new Item(3, 100);
final Item tasks = new Item(1, batches.getOneSubItemWeight());
final Item subtasks = new Item(2, tasks.getOneSubItemWeight());


100 is the batches' weight, tasks and subtasks inherit the weight of their parents.

Note that the duplicated Weight of each print statement was also moved to the Item class.

I'd also try to move a loop into the Item class and call subitem printing from that method. I'd reduce the number of loops to one. Something like this:

public class Item {

    private final Item subitems;
    ...

    public void print(double fromWeight) {
        for (int item = 1; item <= itemCount; item++) {

            double toWeight = getItemWeight() * item;
            System.out.format("%s %d from %f%% to %f%%%n", 
                name, item, Math.floor(fromBatchWeight),
                Math.floor(toBatchWeight));

            if (subitems != null) {
                subitems.print(fromWeight);
            }
            fromWeight = Math.nextUp(toWeight);
    }
}

Code Snippets

System.out.println("\t\tSub Task " + k + " from " + Math.floor(fromSubTaskWeight) + "% to "
    + Math.floor(toSubTaskWeight) + "%");
System.out.format("\t\tSub Task %d from %f%% to %f%%%n", 
    k, Math.floor(fromSubTaskWeight), Math.floor(toSubTaskWeight));
Weight of each task: 33,333333%
Weight of each sub task: 16,666667%
Weight of each task: 33,33%
Weight of each sub task: 16,67%
System.out.format("Weight of each task: %.2f%%%n", weightOfEachTask);
System.out.format("Weight of each sub task: %.2f%%%n", weightOfEachSubTask);

Context

StackExchange Code Review Q#26592, answer score: 3

Revisions (0)

No revisions yet.