This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
programming:object_oriented_rules_of_thumb [2011/07/25 19:26] mjallison |
programming:object_oriented_rules_of_thumb [2012/10/10 16:47] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
Designing an implementing successful object oriented code is tough because of the variety of situations with which a programmer will find themselves. Often when a coder is trying to code a solution to a problem the question is asked, "what pattern should I use, or what object scheme should I use?" The answer invariably is "it depends". There are so many variables in any problem, there is generally not a single fit answer. This page is an attempt to capture more of the interesting ways of looking at problems. | Designing an implementing successful object oriented code is tough because of the variety of situations with which a programmer will find themselves. Often when a coder is trying to code a solution to a problem the question is asked, "what pattern should I use, or what object scheme should I use?" The answer invariably is "it depends". There are so many variables in any problem, there is generally not a single fit answer. This page is an attempt to capture more of the interesting ways of looking at problems. | ||
+ | |||
+ | ====== Goals ====== | ||
====== Red Flags ====== | ====== Red Flags ====== | ||
Line 18: | Line 20: | ||
* **Circular References** In order for objects to be useful and flexible, they need to be used in a wide variety of circumstances. Much like exposing implementation, or making a class knowlegable about it's callers implementation, circular dependencies between classes reduces this flexibility. When you have classes which are dependent upon one another, you can't use just a single class without using the other dependent classes. In general, keep your dependencies flowing in a single direction. Technically this would be called a Directed Acyclic Graph (DAG), in the class "type space". Note that this applies not only to two classes referring to each other, but to a series of classes which also form a cycle. In fact this becomes worse with more classes. | * **Circular References** In order for objects to be useful and flexible, they need to be used in a wide variety of circumstances. Much like exposing implementation, or making a class knowlegable about it's callers implementation, circular dependencies between classes reduces this flexibility. When you have classes which are dependent upon one another, you can't use just a single class without using the other dependent classes. In general, keep your dependencies flowing in a single direction. Technically this would be called a Directed Acyclic Graph (DAG), in the class "type space". Note that this applies not only to two classes referring to each other, but to a series of classes which also form a cycle. In fact this becomes worse with more classes. | ||
+ | |||
+ | * **Lying with code** We used to call them "side effects", methods that don't quite do what they advertise. You may have seen them, a method named "add" which does a subtraction, etc. Generally this is a bad thing with respect to all coding, not just OO. Here is an interesting example called "bait and switch" pattern (for the record, I don't quite recommend this...) [[http://thedailywtf.com/Articles/Representative-Property-MaxRetry.aspx]] or try this one [[http://thedailywtf.com/Articles/An-Enum-or-_2.aspx]] | ||