RSS
 

Archive for December, 2009

Socrates on SOLID: The Interface Segregation Principle

23 Dec

This is the fifth in a series of (hopefully) amusing posts into Robert Martin’s SOLID principles.  It’s written as a dialog between Socrates and a student named Loej in the spirit of the dialectic method popularized by Plato.  In this post, the principle explored is the “The Interface Segregation Principle”.  I hope you find this enjoyable.

Socrates, who is the narrator of the dialogue.
Loej, who is but a blink of data in the maelstrom of the Net.

Socrates: We have we made great progress in our understanding of the SOLID principles. So far we have discussed the Single Responsibility Principle, the Open/Closed Principle and the Liskov Substitution Principle. Do you recall what each of these mean?

Loej: Yes. The Single Responsibility Principle says that a software entity should have only a single responsibility. Robert Martin further clarified this to mean that a class should have only one reason to change.

Socrates: Nicely stated. And the Open/Closed principle?

Loej: Easy enough. Software entities should be open to extension and closed for modification.

Socrates: And the Liskov substitution principle?

Loej: The Liskov substitution principle…

Socrates: Yes?

Loej: It said something about sets and subsets.

Socrates; Right. But what did we infer from it?

Loej: Oh. A consumer of a base class should remain ignorant of its subclasses.

Socrates: Great. Did we get a bit more from it?

Loej: Right. It says that descendants shouldn’t dictate the behavior of their parents.

Socrates: And also?

Loej: A descendant should guarantee the behavior of its parents or it shouldn’t inherit from it.

Socrates: Precisely! Another way to state the entire thing is that the the preconditions of a derived class routine must be the same or weaker to the base class and the post conditions of a derived class routine must be the same or stronger than the base class.

Loej: Uh.. I’ll take your word on that one.

Socrates:Today we discuss the I in solid, the Interface Segregation principle.

Loej: Ok. What does that mean?

Socrates: The interface segregation principle says that clients should not be forced to depend upon interfaces that they do not use.

Loej: Well that seems straightforward enough to enforce.

Socrates: Well it is now and it’s so fundamental in .NET today thanks to Interfaces it is often an afterthought. But originally Robert Martin had to use multiple inheritance to support it.

Loej: How is that? I heard multiple inheritance is bad.

Socrates: C++ doesn’t have interfaces as a language feature, so if you want to support more than one abstract interface without mucking up your inheritance hierarchy, you need to use it.

Loej: And in Java and C# we use interfaces?

Socrates: Exactly. If we follow the advice to the letter, almost every client should have its own custom interface.

Loej: Well, the benefits seem obvious.

Socrates: There’s another benefit Robert Martin didn’t discuss. Let me ask you, how many things can you keep in your head at once?

Loej: 7 +/- 2. I’ve heard that statistic a number of places.

Socrates: What if I told you you could remember much more than 7 +/- 2?

Loej: How so?

Socrates: By a process cognitive scientists call “chunking”. Try to remember these letters. A, M, T, I, F, A, N, S, L, H, P, C…

Loej: I’m already lost. I told you, I can only do about seven letters.

Socrates: But what about these letters? AAPL, MSFT, INTC

Loej: Oh I recognize those. Those are the stock symbols for Apple, Microsoft, and Intel.

Socrates: Did you know the second group had the same exact letters as the first group?

Loej: Really?

Socrates: Indeed. But you remembered the second group much easier. Why is that?

Loej: Because they were put together into meaningful stock symbols. I recognize those.

Socrates: And the first?

Loej: A tangled mess of letters. But what does this have to do with this principle?

Socrates: When interfaces are more targeted, they chunk more naturally. Similar to how the Single responsibility principle focuses each software entity to a specific purpose, so the interface segregation principle focuses each interface to a specific purpose, typically one per client.

Loej: I see. Like grouping the letters into stock symbols. I can see the benefit . It’s much easier to deal with small simple things than large things.

Socrates: Yes. But for the record, of all the SOLID principles, I am most dubious of this one.

Loej: Didn’t you just spend the last five minutes convincing me of this principle? What gives?

Socrates: I believe this principle is slightly misguided. To split up large interfaces into small ones always will achieve looser coupling, but high cohesion is a different matter. There is no guarantee of high cohesion.  For example. Are these groups of letters easier to grasp than the random letters? AMTI FANS LHPC.

Loej: Not really, no.

Socrates: And yet they have been segregated into groups of the same size – 4 each.

Loej: But if you are really dividing up an interface based on client needs it wouldn’t be so arbitrary.

Socrates: True, this is contrived. But why should client dependencies dictate your design any more than other aspects?

Loej: What do you mean?

Socrates: In a domain driven design, quality interfaces are a natural aspect of the system. To segregate interfaces by client technology without the domain driving the process seems unnecessarily technical.

Loej: I see.

Socrates: One more to go Loej! until next time!

 
 

Socrates on Solid: The Liskov Substitution Principle

22 Dec

This is the fourth in a series of (hopefully) amusing posts into Robert Martin’s SOLID principles.  It’s written as a dialog between Socrates and a student named Loej in the spirit of the dialectic method popularized by Plato.  In this post, the principle explored is the “Liskov Substitution Principle”.  I hope you find this enjoyable.

Socrates, who is the narrator of the dialogue.
Loej, who is but a tiny minnow in a sea of 1′s and 0′s

Socrates:  Welcome back Loej.  Last time we discussed the Open / Closed principle.

Loej:  Yes.  We agreed that software entities should be open for extension but closed for modification.  In .NET, careful use of Interfaces help us achieve this goal.

Socrates: Excellent. Today we will discuss the ‘L’ in Solid, the Liskov substitution principle.

Loej: Gazoontite.

Socrates: Huh?

Loej:  Oh, I thought you sneezed.

Socrates: The Liskov substitution principle states that, if for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.

Loej:  Got it.

Socrates: Really?

Loej: Yes.  It makes perfect sense.  Crystal clear.  I think we’re done.

Socrates:  Well what does it mean then?

Loej:  It means that if for each o1 (mumble) such that (mumble mumble) the behavior of (mumble) and Q.E.D. Can I go now?

Socrates: But you just repeated what I said, more or less.   Look this one is fairly straightforward.

Loej: Alright then. Let’s get on with it.

Socrates: According to Liskov if in all cases I can substitute type A for type B then A is a subset of B.   So If I could substitute Circles, Rectangles, and Squares for…

Loej:  Shapes?

Socrates:  Or snakes, sharks, and monkeys for…

Loej:  Politicians?

Socrates:   I was thinking animals.  But if I can substitute one for the other,  then I have a subtype to type relationship.

Loej:  But this is just basic tenant of object oriented programming.  A Cat IS AN animal.  A Circle IS A shape.

Socrates:  So then anywhere I expect an animal, I should be able to pass a cat, or a brontosaurus, or any other animal?

Loej:  Yes.  A brontosaurus IS A dinosaur which IS AN animal.  You can pass them to a function that takes animals without a problem. That’s a basic property of polymorphism.  I don’t see anything terribly profound here.

Socrates:  Well, there is an important corollary which can be derived from the Liskov principle.  Anywhere code expects a base type, the program shouldn’t need to know it’s getting a derived type.

Loej:  So if our function takes an Animal it shouldn’t need to know that it’s really getting a Cat?  But why not?

Socrates: What would happen if we added a Dog type?

Loej: I see.  We might find that we had to modify the function that took an Animal to update its behavior for the Cat type in case it overlaps with the Dog type.

Socrates: Right and this violates the Open/Closed principle.  But there is one more serious problem.  If our function takes an Animal and then interrogates its subtype to discover how to handle the animal, the base type has taken a dependency on its subtype!

Loej: That would be bad.

Socrates:  There’s an even more subtle side to the Liskov substitution principle.

Loej: What’s that?

Socrates: Just as it would be incorrect for a subtype to dictate its parent’s behavior, it is incorrect to assign a subtype that cannot guarantee its parent behavior.

Loej: But that’s not possible with an IS A relationship, right?

Socrates: Actually Bob Martin’s paper on the Liskov substitution principle discusses this in depth.  IS A doesn’t guarantee behavior of subtypes conform to base types.  To really get inheritance right takes some deeper thought.

Loej: If I can’t depend on IS A what can I depend on?!?

Socrates: Well, usually IS A ‘IS A’ valid criterion. Most of the time two classes in an IS A relationship will have the same behavior as you move down the inheritance tree.  But think before your inheriting.  Make sure that behavior and constraints are enforceable down the tree.

Loej: Well I definitely have some thinking to do.

Socrates:  Until next time my friend.

 
 

Comic #5

14 Dec

strip5

 
No Comments

Posted in Comics