0
Xpug Coding Dojo:
 The OCP Kata
Kata
Pairs
Randori
Costraints
The OCP Kata
http://matteo.vaccari.name/blog/archives/293
0. Write the first failing test.
Then write a factory that returns an object,
or an aggregate of objects, that make the
test pass.
The factory should be limited to
creating objects and linking them
together. No conditionals allowed.
1. Write the next failing test.
2. Can you make it pass by changing the
factory and/or creating a new class and
nothing else?
If yes, great! Go back to 1.
If not, refactor until you can.
The refactoring should bring the
system to a state where it’s possible
to implement the next test just by
changing the agg...
Be careful not to implement new
functionality; the current test should
still fail.
An example
package xpug;
import junit.framework.Assert;

import org.junit.Test;

public class AFizzbuzzer {
	 @Test
	 public void sho...
package xpug;

public class FizzbuzzerFactory {
	 public static Fizzbuzzer create() {
	 	 return new Fizzbuzzer();
	 }
}
package xpug;

public class Fizzbuzzer {
	 public String say(int digit){
	 	 return String.valueOf(digit);
	 }
}
@Test
	   public void shouldReturnFizzForMultipleOfThree(){
	   	 Fizzbuzzer fizzbuzzer = FizzbuzzerFactory.create();
	   ...
package xpug;

public interface Counter {
	 public boolean canHandle(int digit);

	 public String say(int digit);
}
package xpug;

public class Echo implements Counter {

	   @Override
	   public boolean canHandle(int digit) {
	   	 retur...
package xpug;
import java.util.List;

public class Fizzbuzzer {
	 private List<? extends Counter> counters;

	 public Fizz...
package xpug;

import java.util.Arrays;

public class FizzbuzzerFactory {
	 public static Fizzbuzzer create() {
	 	 return...
@Test
	   public void shouldReturnFizzForMultipleOfThree(){
	   	 Fizzbuzzer fizzbuzzer = FizzbuzzerFactory.create();
	   ...
package xpug;
public class Fizz implements Counter {

	   @Override
	   public boolean canHandle(int digit) {
	   	 return...
package xpug;

import java.util.Arrays;

public class FizzbuzzerFactory {
	 public static Fizzbuzzer create() {
	 	 return...
...
...
...
...
...
...
...
package xpug;

import java.util.Arrays;

public class FizzbuzzerFactory {
	 public static Fizzbuzzer create() {
	 	 return...
KataYahtzee
Let’s start!
XpUg Coding Dojo: KataYahtzee in Ocp way
Upcoming SlideShare
Loading in...5
×

XpUg Coding Dojo: KataYahtzee in Ocp way

4,019

Published on

Introduction to Ocp way to do a kata, used during a Xpug Milano Coding Dojo.

Published in: Technology, Education
2 Comments
4 Likes
Statistics
Notes
No Downloads
Views
Total Views
4,019
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
56
Comments
2
Likes
4
Embeds 0
No embeds

No notes for slide
  • Transcript of "XpUg Coding Dojo: KataYahtzee in Ocp way"

    1. 1. Xpug Coding Dojo: The OCP Kata
    2. 2. Kata
    3. 3. Pairs
    4. 4. Randori
    5. 5. Costraints
    6. 6. The OCP Kata http://matteo.vaccari.name/blog/archives/293
    7. 7. 0. Write the first failing test.
    8. 8. Then write a factory that returns an object, or an aggregate of objects, that make the test pass.
    9. 9. The factory should be limited to creating objects and linking them together. No conditionals allowed.
    10. 10. 1. Write the next failing test.
    11. 11. 2. Can you make it pass by changing the factory and/or creating a new class and nothing else?
    12. 12. If yes, great! Go back to 1.
    13. 13. If not, refactor until you can.
    14. 14. The refactoring should bring the system to a state where it’s possible to implement the next test just by changing the aggregate of objects that is returned by the factory.
    15. 15. Be careful not to implement new functionality; the current test should still fail.
    16. 16. An example
    17. 17. package xpug; import junit.framework.Assert; import org.junit.Test; public class AFizzbuzzer { @Test public void shouldReturnSameNumberForPlainNumber() { Fizzbuzzer fizzbuzzer = FizzbuzzerFactory.create(); Assert.assertEquals("1", fizzbuzzer.say(1)); Assert.assertEquals("2", fizzbuzzer.say(2)); } }
    18. 18. package xpug; public class FizzbuzzerFactory { public static Fizzbuzzer create() { return new Fizzbuzzer(); } }
    19. 19. package xpug; public class Fizzbuzzer { public String say(int digit){ return String.valueOf(digit); } }
    20. 20. @Test public void shouldReturnFizzForMultipleOfThree(){ Fizzbuzzer fizzbuzzer = FizzbuzzerFactory.create(); Assert.assertEquals("Fizz", fizzbuzzer.say(3)); Assert.assertEquals("Fizz", fizzbuzzer.say(6)); Assert.assertEquals("Fizz", fizzbuzzer.say(9)); }
    21. 21. package xpug; public interface Counter { public boolean canHandle(int digit); public String say(int digit); }
    22. 22. package xpug; public class Echo implements Counter { @Override public boolean canHandle(int digit) { return true; } @Override public String say(int digit) { return String.valueOf(digit); } }
    23. 23. package xpug; import java.util.List; public class Fizzbuzzer { private List<? extends Counter> counters; public Fizzbuzzer(List<? extends Counter> counters) { this.counters = counters; } public String say(int digit) { for (Counter counter : counters) if (counter.canHandle(digit)) return counter.say(digit); return ""; } }
    24. 24. package xpug; import java.util.Arrays; public class FizzbuzzerFactory { public static Fizzbuzzer create() { return new Fizzbuzzer(Arrays.asList( new Echo())); } }
    25. 25. @Test public void shouldReturnFizzForMultipleOfThree(){ Fizzbuzzer fizzbuzzer = FizzbuzzerFactory.create(); Assert.assertEquals("Fizz", fizzbuzzer.say(3)); Assert.assertEquals("Fizz", fizzbuzzer.say(6)); Assert.assertEquals("Fizz", fizzbuzzer.say(9)); }
    26. 26. package xpug; public class Fizz implements Counter { @Override public boolean canHandle(int digit) { return digit % 3 == 0; } @Override public String say(int digit) { return "Fizz"; } }
    27. 27. package xpug; import java.util.Arrays; public class FizzbuzzerFactory { public static Fizzbuzzer create() { return new Fizzbuzzer(Arrays.asList( new Fizz(), new Echo())); } }
    28. 28. ... ... ... ... ... ... ...
    29. 29. package xpug; import java.util.Arrays; public class FizzbuzzerFactory { public static Fizzbuzzer create() { return new Fizzbuzzer(Arrays.asList( new Fizzbuzz(), new Buzz(), new Fizz(), new Echo())); } }
    30. 30. KataYahtzee
    31. 31. Let’s start!
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×