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.

SOLUTION : 1.Here Point class is just the data class with some fields and crude methods like getters and setters. 2.Distance and Direction calculator is the class having methods that depend completely on Point class Data. 3.So move the methods from DistanceAndDirectionCalculator class to point class that contains most of the data used by methods. This makes Point class coherent.