DEV Community

Cover image for What's wrong with this code?
Sung M. Kim
Sung M. Kim

Posted on

What's wrong with this code?

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-sensical/fun question)


const { flour, eggs, turkey } = groceries

Enter fullscreen mode Exit fullscreen mode

Answer

.
.
.
.
.
.
.
.

You can't cook ingredients (as they are constant thus can't cook them) and have to eat'em raw ๐Ÿ˜›.

Background Story.

I was chatting with other developers and wanted to make sure if he understood JavaScript Object Destructuring concept correctly.

let { flour, eggs, turkey } = groceries
Enter fullscreen mode Exit fullscreen mode

Someone suggested const instead of let promoting a better coding style.

And the first thing popped in my mind was that you can't eat a raw ๐Ÿฆƒ.

๐Ÿ‘‹ Parting Words

Hope it funny enough ๐Ÿ˜Ž.

Discussion (26)

Collapse
joelnet profile image
JavaScript Joel • Edited on

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 Author

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 Author

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 Author • Edited on

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 Author

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 Author • Edited on

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 Author

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

Collapse
thejoezack profile image
Joe Zack • Edited on

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

Collapse
dance2die profile image
Sung M. Kim Author

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 on

Oh another thing, your destructuring references could be alphabetical.

Collapse
adam_cyclones profile image
Adam Crockett

๐Ÿคฃ

Collapse
joeyd008 profile image
Comment marked as low quality/non-constructive by the community. View Code of Conduct
joeyd008

what's wrong with

ball=sphere(pos=vec(-.1,-L0+.1,0), radius=0.02, color = color.red, make_trail=true)