When writing scripts using a modern scripting language, e.g. Powershell or JavaScript, where should I define constants? Should I make all constants global for readability and ease of use, or does it make sense to define constants as close to their scopes as possible (in a function, for instance, if it's not needed elsewhere)? I'm thinking mostly of error messages, error IDs, paths to resources or configuration options.
2 Answers 2
Consts are good for just giving descriptive variable names to avoid the magic number problems, but they cause a similarly annoying problem of not being able to identify the value actually being used when the const is defined away from it's use.
My suggestion, in all languages: define consts in as close a scope as possible to their actual usage. If used in only one class; only put in that class. Multiple classes would mean make sure it's at least in the same namespace as all classes using it.
In javascript this means as close lexically in scope as it can be to all usages.
-
they cause a similarly annoying problem of not being able to identify the value actually being used
Shouldn't IDEs have a "go to definition" or be able to preview the value as any other var? The metadata's harder to for scripts I suppose.StuperUser– StuperUser10/26/2012 15:05:19Commented Oct 26, 2012 at 15:05 -
1Typically one isn't using an IDE to build shell scripts. And even when one is the dynamic nature does not lend itself to resharper style "go to definition" tooling.Wyatt Barnett– Wyatt Barnett10/26/2012 15:06:18Commented Oct 26, 2012 at 15:06
-
1@StuperUser I am a VS StuperUser going on 12 years now so I'm all for using the tooling available, but I think a better approach in designing is to think about how the code can be as maintainable without the tools as possible, this lends to design concepts useful across languages with less tooling, and usually has no effect on the usefulness of the tools if available. Tools at times can make bad designs easy to maintain, which is why tool reliance is often panned.Jimmy Hoffa– Jimmy Hoffa10/26/2012 15:09:02Commented Oct 26, 2012 at 15:09
-
similarly annoying problem of not being able to identify the value actually being used
One doesn't have to check very often thatGRAVITATIONAL_ACCELERATION
is 9.80665. Once a constant is set you should abstract yourself for the value, and think in the name of the thing.Tulains Córdova– Tulains Córdova10/27/2012 02:34:03Commented Oct 27, 2012 at 2:34
Instead of using constants, you could use a configuration file. JavaScript allows you to have easily parsable files in json format. I don't know about PowerShell.
Configuration files have the advantage of being centralized, yet the name of the property in the function scope (when you retrieve it) allows you to maintain readability.
-
Sometimes that can be overkill. Especially if the value is only used internally to the code and not displayed to the user. I prefer to keep my configuration files minimal so that the app easier to setup.David Hogue– David Hogue10/26/2012 16:04:52Commented Oct 26, 2012 at 16:04