CSC/ECE 517 Fall 2009/wiki2 4 va: Difference between revisions
Line 9: | Line 9: | ||
This paper will discuss ways in which a polymorphism technique can be applied to replace the IF control structures, pros and cons of the both, and will demonstrate some examples written in Ruby language. | This paper will discuss ways in which a polymorphism technique can be applied to replace the IF control structures, pros and cons of the both, and will demonstrate some examples written in Ruby language. | ||
== What is wrong with using IF statements | == What is wrong with using IF statements? == | ||
Most of the time, a correctly written IF statement would not cause any harm. It, however, possesses a potential to be error prone as in the following Ruby code: | Most of the time, a correctly written IF statement would not cause any harm. It, however, possesses a potential to be error prone as in the following Ruby code: |
Revision as of 16:28, 9 October 2009
Introduction
The IF statement, a conditional language structure, has been available to programmers for quite some time. It was first introduced in FORTRAN in a form of an arithmetic IF statement back in 1957. The logic behind this element is simple. The control of the program is redirected to one of three labels, depending on the value of the analyzed arithmetic expression (which could be negative, positive, or zero). Over the years, this language element had become obsolete and was replaced by a logical IF statement (if-then-else), the one that is still widely used to this day.
The logical IF statement is very familiar to most programmers as it is one of the first language concepts they learn. Despite that, it is a cause of many code errors. Since the IF statement is more suitable for structured programming, most today's object-oriented languages have more sophisticated mechanisms to replace it. One of such approaches is a use of polymorphism.
This paper will discuss ways in which a polymorphism technique can be applied to replace the IF control structures, pros and cons of the both, and will demonstrate some examples written in Ruby language.
What is wrong with using IF statements?
Most of the time, a correctly written IF statement would not cause any harm. It, however, possesses a potential to be error prone as in the following Ruby code:
if i >= 0 puts "greater or equal to zero" elsif i < 0 puts "less than zero" else puts "will never run!!!!" end
Example using IF statements
Let's consider a simple code that would illustrate a use of IF statement in an object-oriented language. First, we define a parent class, Vehicle, and two child classes - Car and Truck. We would then ask a user to choose which of the two classes they would like to initialize. Depending on their selection, the code would look up and suggest a type of fuel that would work with the selected vehicle.
Below is a Ruby code that implements the above utilizing the IF statement:
class Vehicle def initialize puts "I am a vehicle" end end class Car < Vehicle def initialize super puts "I am a passenger car" end end class Truck < Vehicle def initialize super puts "I am a commercial truck" end end class Driver puts "Do you have a Car or a Truck?" type = gets # expects Car or Truck, case sensitive my_car = eval(type).new if my_car.class == Car puts "I like 87 octane gasoline" elsif my_car.class == Truck puts "I like diesel" end end
If we respond with a "Car", the output would look as follows:
Do you have a Car or a Truck? Car I am a vehicle I am a passenger car I like 87 octane gasoline
One apparent downside of this solution is that the code is not easily maintainable if the selection of vehicles grows further. For instance, let's imagine we decided to add two new vehicle types, Motorcycle and Bicycle. In order to support this addition, we would need to add two new classes, as well as to modify the IF statement (or, better to replace it with a more appropriate conditional, such as case.)
Example of IF replaced by polymorphism
Now, let's refactor our code by implementing the same example using polymorphism. The first modification is to introduce a method named "get_type_of_fuel" in all child classes. Similar to the earlier example, the caller of the method is has no way of knowing which class will be chosen as it would be a run-time decision.
Again, we will use Ruby code to demonstrate the new approach:
class Vehicle def initialize puts "I am a vehicle" end end class Car < Vehicle def initialize super puts "I am a passenger car" end def get_type_of_fuel "I like 87 octane gasoline" end end class Truck < Vehicle def initialize super puts "I am a truck" end def get_type_of_fuel "I like diesel" end end class Driver puts "Do you have a Car or a Truck?" type = gets # expects Car or Truck, case sensitive my_car = eval(type).new puts my_car.get_type_of_fuel end
If a "Car" is selected, the output would remain the same:
Do you have a Car or a Truck? Car I am a vehicle I am a passenger car I like 87 octane gasoline
However, the maintainability of the application has improved. For instance, as we add new Vehicle types, the class Driver would remain completely intact. Thus, the only change would be to add new child classes (and they must contain a "get_type_of_fuel" method).
Conclusion
xxxxx