If your code is that deeply nested, surely something has gone horribly wrong, yes?
Problem is that Js kind of encourages this being single threaded and using callbacks for anything blocking. To be fair, the new async syntax sugar helps in modern Js, but nesting a bunch of callbacks or promises was basically the way you did stuff for the longest time.
Yes and no. Any programming language encourages nesting as in the end the computer does nest your code. So it is only normal and predictable that languages would reflect that. BUT! Nest logic can often be inverted and by doing so, reduce how much nesting you need to do.
If (data is not null) { If (data has field x) { Return data x } else return null } else return null
Can be
If (data is null) return null If (data hasn't field x) return null Return data x
I’m not arguing that avoiding deep nesting is a good idea, or that techniques foe doing that don’t exist. I’m just pointing out that Js style programming naturally leads you to nesting things because of the nature of callbacks. Notice how your example isn’t using callbacks.
Yeah and you can void nesting there just as easily and you have the same issues in any other programming language. You just need to create functions. Also JavaScript is not single threaded… you only have access to the dom on one thread, for obvious reasons.
Please explain to me how you do e.g. file downloads without a callback in your favorite language. If you solution involves having the main thread being stuck in a while loop, I am not sure if your complain about nested code can be taken seriously.
Sure, you end up passing higher order functions around, and my point is that complexity obviously goes up. There’s a reason callback hell is a well known thing in Js land. Meanwhile, Js is single threaded from user perspective. The fact that there is a background rendering thread in client side js is completely tangential to the discussion.
Finally, the problem with callbacks is generally seen in server-side Js runtimes. A great example is if you have an HTTP handler that needs to get data from a db. In a language with user accessible threads you just make a db operation synchronously and return the result. In Js, you have to do a callback. The reason you can do the operation synchronously when you have threads is due to the fact that HTTP handler thread can accept a request and then dispatch a new thread to handle it while waiting for other requests.
It is not really tangential to the discussion. You claimed it is because Js single threaded. Also it is not single threaded from the “users” perspective if you mean the developer. There are workers.
If your issue is asynchronous function calls, just call synchronous functions. You might be stuck in a while loop somewhere but if you prefer that, use it. There are sync functions for everything in Js and/or you can easily create them yourself.
Js is single threaded from user perspective. You have no access to the threading runtime as a user and cannot spawn a thread in Js to do some background work. Workers are a recent addition, but using them is quite different from what I’m talking about.
And being stuck in a while loop is precisely why people have to use callbacks and why all the APIs are async. This is literally the problem. If you’re dealing with any non trivial load, you are forced to use async mechanics.
Code aesthetic: If your code looks like a triangle, you’re seriously doing something wrong.
I prefer a bunch of
if (fucked_up) {return(error_code);}
for checking common errors.
I raise you this: https://imgs.xkcd.com/comics/lisp_cycles.png
Directly linking the file of an XKCD should be illegal
Linking to images should be illegal
I’ll let Randall Munroe decide that himself, considering the fact that he provides URLs for hotlinking below the comics
I don’t mean the act of embedding or direct linking in general, but in link aggregators these comics are well known for their alt text, which cannot be seen from the direct link.
I think a good practice might be embedding the comic directly in your comment along with a “source” link.
these comics are well known for their alt text
It’s
title
text, or in web comic circles, hover text. The linked comic’salt
is simply Lisp Cycles.deleted by creator
I know it’s not nearly as nested as this, but nesting in Rust annoys the hell out of me.
impl { fn { for { match { case => { } } } } }
is something I’ve run into a few times
Back when I was still in school, I ran a few tests on real world LISP and Java (the then dominant language, this was in the late days of Sun Microsystems succes).
Turns out most LISP programs had fewer parentheses then Java had braces, parens and brackets.
If your code looks like this, you seriously need to reconsider your code
I learned Lisp at uni and hated it. Thankfully that was long enough ago that I’ve forgotten everything I learned about it.
I’m sorry to hear you learned nothing.
Yeah - pure functions and immutable data aren’t always the right answer, but appreciating that they’re damn good most of the time is a good first step. Writing obvious code that does exactly what it appears to do at first glance and not one thing more? Your colleagues will thank you when they have to work with your stuff.
And metaprogramming and tail call optimization and and…. At least other languages are starting to catch up with this 60 year old language, by for instance implementing lambda expressions.