Imagine you’ve developed a software solution for one of your customers, for example a custom CRM. Everything in this system revolves around the concept of a customer as the key entity. Of course, this is reflected in your code as well. The code is crowded with variable and class names like customerThis and CustomerThat. But now your customer wants you to change the term customer to client.
The minimal and lazy solution would be to change only those occurrences of the word, which are visible to the users. This includes:
- Texts displayed in the user interface. If your application is internationalized or at least prepared for internationalization, they are usually neatly contained in translation files and can be easily updated.
- User documentation like manuals. Don’t forget to update the screenshots.
However, if you do not want to let the code diverge from the language of the domain, you have to rename and update a lot more:
- identifiers in the code (types, namespaces/packages, variables, constants)
- source files and directories
- code comments
- log output strings
- internationalization keys
- text protocol strings (e.g. JSON keys) and HTTP API routes/parameters. Of course you can only do that if you are allowed to break the protocol! Don’t accidentaly break your API or formats, e.g. if JSON keys or XML tags are generated via reflection from code identifiers.
- IDs of HTML tags in views, CSS class names and selector strings in referencing Javascript code
- internal documentation (e.g. Wiki)
IDE support for renaming can help a lot. Especially the renaming of identifiers is reliable in statically typed languages. However, local variables, function parameters, and fields usually have to be renamed separately. In dynamically typed languages automated renaming of identifiers is often guesswork. Here you must rely on a good test coverage. Even in statically typed languages identifiers can be referenced via strings if reflection is used.
If you use a grep-like tool or the search feature of your IDE or editor to assist you, keep in mind that composite terms can occur in many different forms like FooBar
, fooBar
, foo-bar
, foo_bar
, foo.bar
, foo bar
or foobar
. Don’t forget about irregular plural forms, e.g. technology – pl. technologies. Also think of abbreviations, otherwise a
for (Option opt : options)
might end up as
for (Alternative opt : alternatives)
But this is not the end of the story. A lot of renamings require migration scripts or update scripts to be executed at the time of the next update or deployment:
- database tables and columns
- some ORMs like Hibernate store class names in the database for the “table-per-hierarchy” mapping
- string-based enum values in database entries
- configuration keys and values
- keys and values in data formats (JSON, XML, …) of stored data. You probably have to provide backward-compatibility for the old formats if the data files are not stored all in one place and can’t be converted in one go
- names of data folders
If you don’t rename everything all at once, but decide to use the new term only in newly written code and to leave the old term in the existing code until it eventually gets replaced, you will probably end up with a long transition phase and lots of confusion for new project members who don’t know about the history of the project.
One thought on “Renaming is hard work”