[HN Gopher] Overzealous Destructuring ___________________________________________________________________ Overzealous Destructuring Author : bentobean Score : 45 points Date : 2022-10-07 18:48 UTC (4 hours ago) (HTM) web link (www.aleksandrhovhannisyan.com) (TXT) w3m dump (www.aleksandrhovhannisyan.com) | [deleted] | ramesh31 wrote: | Nah. Destructure all the things. The alternative is writing | unsafe code or using a library in place of standard language | features. | klyrs wrote: | That's funny, a good portion of the article is about the | unsafety of destructuring... | fredrikholm wrote: | Jesus that loaded quickly. Hats off to the author for creating | such a snappy site. | [deleted] | danielvaughn wrote: | I probably wouldn't have even noticed had you not said | anything. But yeah you're right, that was instant. Very nice | work. | Arrath wrote: | I'm almost taken aback at how quick that loaded. It reminds me | of finally upgrading from dialup. | | The modern web experience really is subpar. | RedShift1 wrote: | A quick look at the network tab in the dev tools: the page is | less than 10 KB (fits in TCP fast start window), little | external resources (10 in total: 1 HTML, 1 CSS, 4 fonts, 2 | images and 2 JS files), tiny amount of JS code which doesn't | add extra requests, all served by Google's CDN which probably | has a mirror geographically close to you. | username_exists wrote: | I definitely get the point. I often have the urge to use | destructuring for saving space, but want to kick myself when | revisiting the code a month or two later. I like your rules, | thanks for sharing. | moogly wrote: | I definitely agree with the spirit of the article: you can take | this too far. | | The real benefit of destructuring isn't really brevity, per se, | IMO, but easy extensibility. You all of a sudden need two or | three properties from the same object at the same level? You | just reference the additional properties on the left side | without any fuss. | myhf wrote: | the curly braces in that font are TOO CURLY | bluepnume wrote: | > it's important to remember that TypeScript does not provide any | assurances about a variable's runtime type, especially if the | data is coming from an external source (like an API). In those | cases, you often need to use type assertions or guards anyway to | assert the returned type because TypeScript can't infer the type | of dynamically fetched data. So destructuring the data is more | dangerous than defensive coding (like using the optional chaining | operator or good-old if statements). | | Optional chaining or null checks should not be used | "defensively". They should just be used whenever TypeScript tells | you to. Otherwise you just exacerbate the problem and end up with | more unanticipated null values. | | If you're dealing with an API with untrustworthy types or lots of | null values, the solution is to: | | a) Write mostly optional type definitions for that API, and/or | | b) Use zod to verify the API data before you use it, to make sure | it matches your expectations. | | https://github.com/colinhacks/zod | capableweb wrote: | If you're like me (and many others) and can't get enough of | destructuring, Clojure has it on steroids compared to JS and is | everywhere in a normal/average Clojure codebase: | https://clojure.org/guides/destructuring | | Destructuring in Clojure doesn't suffer from the same problems as | JavaScript, so lot of the things in the article doesn't apply. I | was always slightly disappointed when destructuring finally came | to JavaScript but it was so neutered compared to what it could | have been. | | But on the other hand, I'm happy JavaScript is not becoming more | complicated just for the sake of new features. But on the other | foot, we already got `class` and a bunch of other complicated, | syntactic sugar, so why not another? | __ryan__ wrote: | I'm not super familiar with Clojure, but I tried to read | through the link you shared. I certainly could be missing | something, what can Clojure's destructuring do that JavaScript | cannot? | joshlemer wrote: | I'm not sure what are all the differences but one I have come | across that you can't do in JS is to simultaneously | destructure an object/array, and at the same time bind a name | to the entire object/array. For instance here in Clojure we | can extract the a,b,c keys from the passed map, and at the | same time bind the whole map to the variable bar. | (defn foo [{:keys [a b c] :as bar}] [bar a b c]) | (foo {:a 1 :b 2 :c 3}) ;; => [{:a 1, :b 2, :c 3} 1 2 3] | | in JS you can do const f = ({a,b,c}) => | [???, a, b, c] | | but how do you bind to the whole object as well? | joshlemer wrote: | Oh I thought of an other one. In Clojure "objects" are | actually maps, which can have non-string keys as well. That | means you can destructure maps which have non-string (or, | technically, keyword) keys as well: (defn | foo [{a 1 b 2 :as bar}] [bar | a b]) (foo {1 "hi" 2 "world" 3 "!"}) ;; => [{1 | "hi", 2 "world", 3 "!"} "hi" "world"] | | In JS of course you can have Maps with non-string keys, but | destructuring doesn't work on them. Plus you have other | issues like arrays in JS having equality defined by | reference rather than value, making maps less useful | overall. | [deleted] | jakub_g wrote: | Semi-related: "there-must-be-an-eslint-rule"-fetishism. | | Some developers seemingly can't live in a world where certain | constructs can be used sometimes in the code, and others at other | times, depending what is more appropriate in a given context. If | they think construct B is superior over A, they will put in place | an eslint rule that forbids A and always forces you to use B. | | In some cases it happens that B is clearly superior because A is | known to be broken for reasons x,y,z, then I'm okay with this. | | But sometimes those kind of rules are taken out of nowhere for no | good reason, just a personal preference, or with a fake reason | like this blog shows (certain construct is only better at certain | times, but not always). | dexwiz wrote: | Ugh tell me about it. My large enterprise company has been | piling these on lately. You also get blocked from checking in | any ignore eslint statements unless you ask some review board | that meets once a week with a month long waiting list. I know | all jobs are balance of productivity and bookkeeping, but all | these CI checks are really starting to make me consider | switching jobs. | hinkley wrote: | I got a lot more relaxed about hard and fast rules around the | same time I really started having some success growing plants. | I couldn't tell you which order it happened in. Organic systems | can't be controlled, they can only be guided. And at the end of | the day, while the software itself is inorganic, it is and | continues to be created by a bunch of meat sacks, flapping | their meat at each other to communicate. If you have an | evolving system created by organic creatures, it is going to | behave organically itself. | | I will say it's a little weird the ways in which some people | think they've found a 'gotcha' and instead what's happened is | that they're thinking 3 moves ahead and you're thinking 6. | deckard1 wrote: | been there. Worst offender I've seen is an eslint rule that | forces you to not mutate the object you're creating with | reduce() because mutation is bad. So now you're doing object | spreading and went from an O(n) algorithm to an O(n^2) | algorithm. Wonderful. | | There is a lot of unquestioned dogma going around in this | industry. | cercatrova wrote: | Why not just use a for loop? | LAC-Tech wrote: | is that an airbnb eslint rule? | | no wonder their website is so slow! | jvalencia wrote: | lol, and then you add an exception for spreading: /* eslint- | disable react/jsx-props-no-spreading */ ___________________________________________________________________ (page generated 2022-10-07 23:00 UTC)