patternjavaMinor
Calculating min and max with if-statements within a for-loop
Viewed 0 times
withstatementsloopminwithincalculatingmaxforand
Problem
This code section is from the main method of my Annual Fuel Use class. The program projects my annual fuel usage based on at least three fill ups of my car.
Here, I am calculating the max and min for distance (which is miles traveled), MPG, and price per gallon. I'd like a general review.
Here, I am calculating the max and min for distance (which is miles traveled), MPG, and price per gallon. I'd like a general review.
//initialization of array of objects
AnnualFuelUse[] fillUps = {new AnnualFuelUse (1, 1, 6500, 6800, 9.70, 3.11),
new AnnualFuelUse (2, 10, 6800, 7052, 8.10, 3.08),
new AnnualFuelUse (3, 20, 7052, 7349, 9.20, 3.15)};
//calculate Min and Max for distance, MPG, and price per gallon
double minDist = 0, maxDist = 0;
double minMPG = 0.0, maxMPG = 0.0, minPrice = 0.0, maxPrice = 0.0;
Double dMin = Double.MAX_VALUE;
Double dMax = Double.MIN_VALUE;
Double mpgMin = Double.MAX_VALUE;
Double mpgMax = Double.MIN_VALUE;
Double priceMin = Double.MAX_VALUE;
Double priceMax = Double.MIN_VALUE;
for (int i = 0; i dMax) {
dMax = fillUps[i].getDist();
maxDist = dMax;
}
if (fillUps[i].getMilesPerGallon() mpgMax) {
mpgMax = fillUps[i].getMilesPerGallon();
maxMPG = mpgMax;
}
if (fillUps[i].getPrice() priceMax) {
priceMax = fillUps[i].getPrice();
maxPrice = priceMax;
}
}Solution
The code violates Tell, Don't Ask:
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things.
~Alec Sharp
Before we get to that, consider:
Can be written:
Similarly:
Can be written:
The important question remains unanswered: why does the code check against distance and price? If all you want to do is determine how much it will cost on a given tank of gas, then write:
If you want to know the price to fill the remainder of the tank, write:
Move the code that uses the variables into the class that has the variables.
You can also compare objects, rather than the internal variables. For example:
At the end of the loop you'll have objects that contain the desired information. With those objects you can then ask them to perform specific tasks. Then make the get accessor methods
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things.
~Alec Sharp
Before we get to that, consider:
fillUps[i].getDist() > dMinCan be written:
fillUps[i].canTravel( dMin )Similarly:
fillUps[i].getPrice() > priceMaxCan be written:
fillUps[i].priceExceeds( priceMax );The important question remains unanswered: why does the code check against distance and price? If all you want to do is determine how much it will cost on a given tank of gas, then write:
float maxDistance = fillUps[i].calculateDistance();If you want to know the price to fill the remainder of the tank, write:
float price = fillUps[i].calculateFillPrice();Move the code that uses the variables into the class that has the variables.
You can also compare objects, rather than the internal variables. For example:
AnnualFuelUse fillUps[] // ...
AnnualFuelUse minPriceFillUp;
for (int i = 0; i < fillUps.length; i++) {
if( fillUps[i].exceedsPrice( fillUps[i-1] ) ) {
maxPriceFillUp = fillUps[i];
}
if( fillUps[i].exceedsDistance( fillUps[i-1] ) ) {
maxDistanceFillUp = fillUps[i];
}
// ...
}At the end of the loop you'll have objects that contain the desired information. With those objects you can then ask them to perform specific tasks. Then make the get accessor methods
private.Code Snippets
fillUps[i].getDist() > dMinfillUps[i].canTravel( dMin )fillUps[i].getPrice() > priceMaxfillUps[i].priceExceeds( priceMax );float maxDistance = fillUps[i].calculateDistance();Context
StackExchange Code Review Q#35647, answer score: 4
Revisions (0)
No revisions yet.