Hacker News new | ask | show | jobs
by crdoconnor 3562 days ago
>All the horrid Java libraries that we hated working with 10 years ago were created because of slavish devotion to the single responsibility principle, short methods, DRY, and testability. The absolute worst codebases I've ever seen sprung from an overaggressive concern for extensibility.

Slavish adherence to these principles (with the exception of DRY) violates one of my core principles: write the least code possible to solve a problem.

The single responsibility principle in particular isn't what I'd consider a fundamental principle of good code since it often can lead to writing an awful lot of unnecessary boilerplate. Short methods are similar (if a method is called only once I often consider that a code smell).

I think the culture of Java is also partly responsible for this: grand architectural designs are valued over terseness and simplicity. A system with stack traces as high as your arm are seen as something to be proud of.

2 comments

I go back and forth on the singly-called function as a code smell. It really depends. What annoys me are the private method refactors that then can't be unit tested unless the 'private' keyword is removed.

For an instance of how it depends, see the classic Forth example for implementing a washing machine driver:

        ...
    	: RINSE  FAUCETS OPEN  TILL-FULL  FAUCETS CLOSE ;
        ...
    	: WASHER  WASH SPIN RINSE SPIN ;
Then a single call to WASHER is all that happens when the user presses the start button.

Function calls should make things clearer, not less clear because of some other principle (like DRY or single responsibility or testability etc.). That's ultimately where I think the JavaLand culture has gone wrong, all these abstractions (many of them caused by being forced to live in a Kingdom of Nouns) that are sometimes quite useful in the large are always a pain in the small, but many times the small is all that is needed. Big projects are slowly learning they don't need to be so big, they can instead be a set of independent smaller projects, but it'll take more time.

>if a method is called only once I often consider that a code smell

Well I certainly disagree; it often makes sense to separate out a singly-called function if for no other reason than to be able to unit test that functionality individually.