It's only anecdotal, but I find pure, immutable code far easier to maintain in any language. To a first approximation, a functional interface == a testable interface.
I've joined several projects in their maintenance phase which had no tests, and introduced some as I went about debugging, adding features, etc. Since the code was often untestable, I'd make a few refactorings over and over again to allow testing, and these just-so-happen to tease apart the pure computation from the effects; in essence making the code more functional.
An obvious example is to turn implicit state into explicit parameters, eg.
// BEFORE
function foo(x, y) {
b = x + y + a;
}
// AFTER
function foo(x, y) {
b = foo_pure(x, y, a);
}
function foo_pure(x, y, z) {
return x + y + z;
}
This doesn't make `foo` more functional or easier to test; but testing `foo_pure` is trivial. In particular this makes debugging logic errors much easier; since there's no need for elaborate/brittle test setup (eg. setting all the right globals, creating and cleaning up files, etc.).>What about programming in the large?
less code -> less code at large -> win
>What about efficiency of naive implementations?
like a stack overflow version of it the starters always come up with in Java? what exactly are you talking about?
>What about maintainability?
What does FP or any of this thread for that matter do with maintainability? You can write unmaintainable code in any language.
These are a very limited subset of what really matters in software engineering. (I would also remove the naive implementation part.)
that doesn't necessarily follow
Or did I misunderstood the meaning of "less code"?