On Tuesday, 25 January 2022 at 09:53:25 UTC, rempas wrote:
>It is known that people dislike global variables and the reason is that they make the code harder to debug.
Assuming you mean mutable global state. Immutable global data is okay IMO.
Because purity is convenient. When I call a function, let's say field.initializeUnit(12, 15)
it's so much nicer and tidier if I can rest assured it won't affect anything else than field
, and if I know it acts the exact same way every time, when the arguments are similar.
Now consider if field
was a global variable. Okay, initializeUnit(12, 15)
is shorter than field.initializeUnit(12, 15)
. But I have to set the field I want to manipulate in advance, theField = /*whatever*/
. And when reading code that acts like this, I do not know what affects what without peeking what each of the called functions do. Did the initializeUnit
use theField
or thatOtherField
? With the pure version I can instantly see it's the field
variable I'm using. The non-pure version is much uglier and harder to read after all, despite having a shorter argument list.
If the argument lists get lengthy, it is sometimes worth to collect the argument sets into structs or classes that have most of the needed data in one place. You might also consider the with
statement. But globals just plain blow.