FOR is evil or something

Have you ever wondered how FORs impact your code? How they are limiting your design and more important how they are transforming your code into an amount of lines without any human meaning?

How can you not want to read an article that starts like that? I had to steal the intro from the original. Seriously, I have used FOR since I learned BASIC back in the day. I never thought about how it was limiting my design. I. Must. Learn. How.

The article I am referring to is, Avoiding FORs – Anti-If Campaign. Eager learner I, I could not not read it.

After the resplendent intro, Avoiding FOR goes on to show “how to transform a simple example of a for […], to something more readable and well designed.”

It takes this unreadable piece of code — that I now recognize as unreadable:

public class Department {

    private List resources = new ArrayList();

    public void addResource(Resource resource) {
        this.resources.add(resource);
    }

    public void printSlips() {

        for (Resource resource : resources) {
            if(resource.lastContract().deadline().after(new Date())) {

                System.out.println(resource.name());
                System.out.println(resource.salary());
            }
        }
    }
}

My eyes hurt already. Thankfully the author transforms the aberration above into this clean, much more readable snippet:

public class ResourceOrderedCollection {
        private Collection<Resource> resources = new ArrayList<Resource>();



    public ResourceOrderedCollection() {
        super();
    }

    public ResourceOrderedCollection(Collection<Resource> resources) {
        this.resources = resources;
    }

    public void add(Resource resource) {
        this.resources.add(resource);
    }

    public void forEachDo(Block block) {
        Iterator<Resource> iterator = resources.iterator();

        while(iterator.hasNext()) {
            block.evaluate(iterator.next());
        }

    }

    public ResourceOrderedCollection select(Predicate predicate) {

        ResourceOrderedCollection resourceOrderedCollection = new ResourceOrderedCollection();

        Iterator<Resource> iterator = resources.iterator();

        while(iterator.hasNext()) {
            Resource resource = iterator.next();
            if(predicate.is(resource)) {
                resourceOrderedCollection.add(resource);
            }
        }

        return resourceOrderedCollection;
    }
}

public class Department {

    private List<Resource> resources = new ArrayList<Resource>();

    public void addResource(Resource resource) {
        this.resources.add(resource);
    }

    public void printSlips() {
        new ResourceOrderedCollection(this.resources).select(new InForcePredicate()).forEachDo(new PrintSlip());
    }

}

Wait, what? Is this an Onion article?

Snarky Mode Off.

I understand what the author wanted to do, but really, the example used is so off the left field that it’s not even funny.

Also read...

Leave a Reply