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.
Problems with Shivam's OOP solution -
Even though classes have been used it does not follow object-oriented principles and mostly procedural. The use of getter and setter methods could possibly result in the breaking of encapsulation. The Point class has only properties associated with it and DistanceAndDirectionCalculator has only behaviour associated with it. Presence of unused setters. The tests written do not follow the AAA format. Logic duplication in the methods, distance and direction to obtain x and y distance.