Language design for Refactoring
A question came up on the Yahoo! Groups Refactoring Group about what language design would be best to support Refactoring.
We think about this quite a bit, but usually we phrase the question more generally:
What language design would make it easiest to write tools that work well?
That includes Refactoring, as well as Intellisense, Syntax Coloring, etc.
The answer seems to be that explicitness: a language that forces the developer to be explicit, instead of implicitly inferring stuff from the context.
It seems like this is really the answer to:
What language design makes the code easy to read?
Unfortunately, language readability is often at odds with writability. This is a point that language designers struggle with all the time.
In C# 2.0, there are two points of inference that were added to the language:
Generic method type parameters are inferred from the concrete parameters.
Anonymous method type is inferred from the usage
We discussed, but did not add inference of the type of the instance variable in a ‘foreach’ statement.
There’s an MSDN Magazine article that discusses some of these points in C# 2.0.
In general, the design of C# has focused on making your code more explicit that C++, to avoid many of the pitfalls we observed in C++. That same explicitness has made C# Refactoring easier to get right.