LSP compliant solution
One of the main lessons I learned is that sub-typing
needs to be done with respect to the behaviour of the types and not with respect
to the data only. In this aspect, the SpecialCurrentAccount IS NOT A
CurrentAccount. A banker will shout at me for sure if I say this to
him. But for you the intelligent programmers this would make sense. This is
because they do not exhibit the same behaviour against the same message. I decided
to break the hierarchy and come up with is new design with Account as an
abstract base type and CurrentAccount and SpecialCurrentAccount as its
sub-types.
The abstract Account
class declares an abstract method closeAccount(), which is implemented by both
CurrentAccount and SpecialCurrentAccount. I have now changed the interface class
to accept an Account type of Object as opposed a particular type of Account
Object. The new interface class looked like this.
public boolean closeAnAccount(Account ac)
With this hierarchy, what may surprise you is that we have not changed
the implementation of the closeAccount() method in any of the classes. The
pre-conditions and the post-conditions remain the same. But in essence, what has
happened is that the user will not make any assumption about the behaviour of
the account object he is dealing with. This makes the module more maintainable
and reusable in the sense that now it is very easy to add another type of
account which may impose some other pre-condition and post-condition without
breaking the LSP and Design by Contract.
No overriding!!!
It may seem from the above discussion that overriding
is the main problem with LSP and in that case inheritance makes no sense. To
some extent, it is puzzling but always keep the Design by Contract
principle in mind before you override. If you are unable to comply with the
same, then it might be worth revisiting your class diagrams. Always make sure
that the derived class must enforce less strict pre-conditions while overriding
any base class method. Try to think about the situation on your own and surely
you will come up with some logic why LSP is so important for a good OO design.
Next month
Next month, look forward to some of the other important
principles of the OO design. Hope this series will help you design a better Object
Oriented Software.
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|