Figure out what something does, and rename it (with a stupidly verbose name, if you have to). Use the IDE refactor tools to rename all instances of that identifier
Take a function, figure out what it does, and refactor it in a way that makes sense to you
Use the editor’s diff mode to compare duplicate code, extract out anything different into a variable or callback, and combine the code into a function call. Vscode’s “select for compare” and “compare with selected” are useful for this
Track what you’re doing / keep notes in something like Obsidian. You can use [[Wikilinks]] syntax to link between notes, which lets you build a graph structure using your notes as nodes
be cognizant of “Side Effects”
For example, a function or property, or class might be invoked using Reflection, via a string literal (or even worse, a constructed string). And renaming it can cause a reflective invocation somewhere else random to fail
Or function or operator overloading/overiding doing something bizarre
Or two tightly coupled objects that mutate each other, and expect certain unstated invariants to be held (like, foo() can only be called once, or thingyA.len() must equal thingyB.len()
write tests if you can, either using a testing framework or custom Python scripts
You can use these to more thoroughly compare behavior between the original and a refactor
Lowering indent levels is nice in functions. Early returns mean you don’t have to think as much. “If it got here, I know foo isn’t null because it already would have returned”.
I always feel bad about putting little ifs at the top of functions. Is it not bad practice? I like them because they’re simple to implement modify and read, but I have this voice telling me I need to make things more impressive.
Reduce the cognitive load required to understand and reason about a piece of code. Honestly, the more you can express complicated ideas simply, the more impressive you are
I started putting a helpful comment above the ifs as a seperator to cope with that.
public Value? Func(String arg) {
// Sanitize.
if (arg.IsEmpty()) return null;
if (this.Bar == null) return null;
// Get [that] and/or do [this].
var foo = this.baz.foo;
...
return new Value();
}
if it’s not in git / SVC, add it as is. Create a “refactor” branch, and liberally use commits
Treat it like a decompilation
Figure out what something does, and rename it (with a stupidly verbose name, if you have to). Use the IDE refactor tools to rename all instances of that identifier
Take a function, figure out what it does, and refactor it in a way that makes sense to you
Use the editor’s diff mode to compare duplicate code, extract out anything different into a variable or callback, and combine the code into a function call. Vscode’s “select for compare” and “compare with selected” are useful for this
Track what you’re doing / keep notes in something like Obsidian. You can use
[[Wikilinks]]syntax to link between notes, which lets you build a graph structure using your notes as nodesbe cognizant of “Side Effects”
For example, a function or property, or class might be invoked using Reflection, via a string literal (or even worse, a constructed string). And renaming it can cause a reflective invocation somewhere else random to fail
Or function or operator overloading/overiding doing something bizarre
Or two tightly coupled objects that mutate each other, and expect certain unstated invariants to be held (like,
foo()can only be called once, orthingyA.len()must equalthingyB.len()You can use these to more thoroughly compare behavior between the original and a refactor
I use sentences as variable names sometimes, because I necessarily end up with lots of similar-sounding variables or functions.
List_of_foo_dicts = Get_foo_from_bar_api()
Separate out those “concerns”, into their own object/interface, and pass them into the class / function at invocation (Dependency Injection)
Lowering indent levels is nice in functions. Early returns mean you don’t have to think as much. “If it got here, I know foo isn’t null because it already would have returned”.
I always feel bad about putting little ifs at the top of functions. Is it not bad practice? I like them because they’re simple to implement modify and read, but I have this voice telling me I need to make things more impressive.
Never make things more “impressive”
Make them more comprehensible
Reduce the cognitive load required to understand and reason about a piece of code. Honestly, the more you can express complicated ideas simply, the more impressive you are
I started putting a helpful comment above the ifs as a seperator to cope with that.