Friday, November 28, 2014

Difference between a hobby project and a product

One of the most important lessons an engineer learns is that a going from a demonstration prototype (i.e. "hobby project") to a product that other non-engineer people can use requires a lot of additional work. I would say that prototype to product transition requires as much work as creating the protoype.

A product
  • is well tested and can work under a wide range of conditions (this is the main cost difference because additional testing reveals previously unknown weaknesses and will force you to make major design changes)
  • anticipates internal errors / environmental anomalies and has mechanisms in place to recover gracefully
  • anticipates user error and guides the user when he does something wrong
  • has an intuitive user interface (i.e. people don't need to ask an engineer how to operate it)
A novice thinks he almost has a product when he demonstrates basic functionality. The wise one knows that he has only covered half the distance.

Friday, November 21, 2014

Improving java.awt.Polygon contains() method

The contains() method in java.awt.Polygon, which checks if the input coordinate is inside the boundary, might not return true for all the points that you would expect. Example: xPoints = {0, 5, 10, 15, 15}, yPoints = {0, 5, 3, 10, 0}. With the standard Polygon class, contains(5,5), contains(15,10), contains(15, 0) all return false although these points are on the polygon (indicated by arrows in the figure below). If you use Matlab's inpolygon function you will get true for all of them.

The reason is related to the "insideness" definition. A point is considered to lie inside a Shape if and only if:
  • it lies completely inside the Shape boundary or
  • it lies exactly on the Shape boundary and the space immediately adjacent to the point in the increasing X direction is entirely inside the boundary
  • or it lies exactly on a horizontal boundary segment and the space immediately adjacent to the point in the increasing Y direction is inside the boundary.
I have written ImprovedPolygon whose contains() method returns true for the above cases by checking if the input coordinates lie on the edges of the polygon using the line formula y = m*x + n and limits of the line end points. Both ImprovedPolygon and its unit test class ImprovedPolygonTest can be downloaded from GitHub here.

Listening to: Take me to Church - Hozier

Monday, November 17, 2014

Java: Information hiding using interfaces

Typically, the "private" key word is used to hide any methods/attributes from other classes. However, there are cases where a class has one set of methods that is used by class A and another set of methods that are used by class B which means that all these methods have to be public. To prevent class A from accessing methods meant for class B, we can use interfaces as depicted in the following example: