DEV Community

Cover image for What's wrong with this code?

What's wrong with this code?

Sung M. Kim on September 04, 2018

Photo by Caroline Attwood on Unsplash. What's wrong with this code? Can you find the logical error? (โš ๏ธ As the tag shows, it's a non-se...
Collapse
 
joelnet profile image
JavaScript Joel • Edited

The reason to use const instead of let is because you want your code to be immutable. (just a note, const doesn't make object immutable, you have to freeze).

So how do you eat your groceries while being immutable?

Try to view immutable code as code with the added dimension of TIME!

// the past
const { flour, eggs, turkey } = groceries

// the present
const cookedEggs = cookEggs(eggs)

// the future
const cookTurkey = turkey => ({ ...turkey, cooked: true })

At any moment in our application we can go back and look at what the state was before.

So imagine at 12:00 you had raw turkey. then at 12:30 you had cooked turkey. This is how immutable code works.

With mutable code, you know you have cooked turkey, but your past is invisible to you. You can never look at a previous state.

Collapse
 
dance2die profile image
Sung M. Kim

Thanks joelnet for following up with technical aspect of the code and the implication of using const.

Collapse
 
kepta profile image
Kushan Joshi

const is a good practice, but you even continue using let with immutable code. Sometimes itโ€™s easier and more readable to use let for an immutable object, to which you are going to apply transforms.

Collapse
 
joelnet profile image
JavaScript Joel

sure.

i just try my best to make everything immutable and handle mutable state separately, like in a redux store.

Collapse
 
sadarshannaiynar profile image
Adarsh

@joelnet I still don't need cookTurkey instead I can do turkey.cooked = true and so it doesn't matter whether I use const or let if my code is written keeping immutability in mind.

Collapse
 
joelnet profile image
JavaScript Joel

that is kind of why I mentioned '(just a note, const doesn't make object immutable, you have to freeze)' was to distinguish between const and immutable.

If you want a primitive value to be immutable, const is enough. If you want an object to be immutable, you have to freeze it as well.

So if we can assume groceries is immutable (which is should be).

const deepFreeze = require('deep-freeze')

const grocieries = deepFreeze({
  flour: {
    cooked: false
  },
  turkey: {
    cooked: false
  },
  eggs: {
    cooked: false
  }
})

Then your groceries will truly be immutable

const { turkey } = grocieries
turkey.cooked = true
//=> turkey({ cooked: false })
Thread Thread
 
sadarshannaiynar profile image
Adarsh

Sorry. Misunderstood as the freeze wasn't mentioned in the previous code. Thanks for clearing it up! :)

Collapse
 
dwd profile image
Dave Cridland

const. I hate const in Javascript, because it's not const at all - but final. In Kotlin, this'd be val instead of var - but even then, this is a fixed binding, and not an invariant.

So you can cook the turkey, for sure, you just can't change which turkey you're cooking.

In C++, on the other hand, const Turkey turkey means an invariant Turkey. const Turkey * turkey means a pointer to a constant Turkey. In either case, you couldn't call Turkey::cook(), but you could call Turkey::price() const, since that's a const method. But in the latter case, you could assign (or "rebind") turkey to point at a different instance. To prevent that, we can say const Turkey * const turkey, which is getting to be a mouthful. C++ also has references, which are non-rebindable pointers with easier syntax: const Turkey & turkey is equivalent to that last double-const pointer example.

Collapse
 
dance2die profile image
Sung M. Kim

All these headaches might be a good reason to learn Functional Programming... ๐Ÿค”

Collapse
 
misterhtmlcss profile image
Roger K.

And now I'm reminded why I prefer to code in Python or JS. Listening to the C++ version hurts my brain. A fragile Front-End guy and I'm thankful to not be doing C++

Collapse
 
dance2die profile image
Sung M. Kim • Edited

Thanks Nick.

After reading your comment, I dug around and found this StackOverflow answer, which also explained using an example.

I wasn't aware that nested object could be modified even after being frozen.

Collapse
 
bgadrian profile image
Adrian B.G.

Not really, the "turkey" is a pointer to the turkey instance/value, so even if the turkey changes its state, the turkey pointer will remain constant, pointing to the same turkey.

Collapse
 
dance2die profile image
Sung M. Kim

I had this imagination that, the ๐Ÿฆƒ looks the same on the outside but cooked on the inside ๐Ÿ˜ƒ.

Collapse
 
dukemai profile image
dukemai

haha, it sounds reasonable :D

Collapse
 
adam_cyclones profile image
Adam Crockett ๐ŸŒ€

Still not edible, take it back for a re-rest ๐Ÿ˜‚

Collapse
 
tobiassn profile image
Tobias SN

You forgot a semicolon at the end.

Collapse
 
dance2die profile image
Sung M. Kim • Edited

I've been waiting for someone to point that out as well ๐Ÿคฃ

Collapse
 
adam_cyclones profile image
Adam Crockett ๐ŸŒ€

This is an interesting point. What if some of the groceries where constant, such as the old tins you'll have in your cupboard for years. Seriously though, you can only have all constant or all let.

Collapse
 
dance2die profile image
Sung M. Kim

Thanks Adam, you are right, I've realized that the syntax is for all || nothing

Collapse
 
thejoezack profile image
Joe Zack • Edited

Came for the fun, stayed for the conversation. Love all the comments!

Collapse
 
dance2die profile image
Sung M. Kim

Yupz, it's awesome how you learn from different perspectives and finding out faults so we could all learn ๐Ÿ˜€

Collapse
 
adam_cyclones profile image
Adam Crockett ๐ŸŒ€ • Edited

Oh another thing, your destructuring references could be alphabetical.

Collapse
 
adam_cyclones profile image
Adam Crockett ๐ŸŒ€

๐Ÿคฃ