So Shivam had just learned about OOP. He had written a program before that did two things,
- Find distance between two points
- Find direction (angle) between two points in Radians.
He has this code in the org.procedural.DistanceAndDirectionCalculator
It looks like this for the reference -
public class DistanceAndDirectionCalculator {
public static double distance(double x1, double y1, double x2, double y2) {
double xDistance = x1 - x2;
double yDistance = y1 - y2;
return Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
}
public static double direction(double x1, double y1, double x2, double y2) {
double xDistance = x2 - x1;
double yDistance = y2 - y1;
return Math.atan2(yDistance, xDistance);
}
}
He thought it'll be a good idea to convert this to Object Oriented Programming. So he wrote a new implementation in package org.oop
, he got 2 classes -
org.oop.DistanceAndDirectionCalculator
org.oop.Point
However, his trainer told him that what he did is not Object Oriented programming and asked Shivam to try again.
- Try to articulate problems with Shivam's OOP solution. (Write it somewhere and share it with your trainer)
- Fork the project and fix the design related problem with Shivam's OOP solution. Share that with your trainer too.
I had tried to minimize the number of elements with just one class Point
public class Point {
public double distance(Point point) {
if (this == point)
return 0.0;
Point differenceVector = getDifferenceVector(this , point);
return sqrt(square(differenceVector.xPosition) + square(differenceVector.yPosition));
}
public double direction(Point point) {
Point differenceVector = getDifferenceVector(this , point);
return atan2(differenceVector.yPosition, differenceVector.xPosition);
}
}
I have further took some steps to minimze duplicate and have also considered implementation details