this post was submitted on 01 Sep 2023
338 points (96.2% liked)

Programming

18790 readers
835 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
[–] hellishharlot@programming.dev 30 points 2 years ago (10 children)

Using single character variable names is always bad practice

[–] 9point6@lemmy.world 12 points 2 years ago* (last edited 2 years ago) (3 children)

Except i right? Something like counter or index seems unconventional and unnecessarily verbose

[–] SolarMech@slrpnk.net 6 points 2 years ago

Yeah, but it's easy to overuse it. If your for loop is much longer. For a few lines I'd agree, don't bother using something longer.

Code should scream out it's intent for the reader to see. It's why you are doing something that needs to be communicated, not what you are doing. "i", "counter" or "index" all scream out what you are doing, not why. This is more important than the name being short (but for equal explanations of intent, go with the shorter name). The for loop does that already.

If you can't do that, be more precise. At the least make it "cardIndex", or "searchIndex". It makes it easier to connect the dots.

[–] hellishharlot@programming.dev 5 points 2 years ago (2 children)

Index can be useful but start looking for mapping and sorting functions. Or foreach. If you really must index, sure go use index or I if it's conventionally understood. But reading something like for I in e where p == r.status is really taxing to make sense of

[–] indepndnt@lemmy.world 2 points 2 years ago (3 children)

Honest question: is there a mapping function that handles the case where you need to loop through an iterable, and conditionally reference an item one or two steps ahead in the iterable?

[–] xigoi@lemmy.sdf.org 2 points 2 years ago* (last edited 2 years ago)

In Haskell, you could do something like map (\(thisItem, nextItem) -> …) (zip list (tail list))

[–] hellishharlot@programming.dev 2 points 2 years ago (1 children)

Not that I'm aware of but that's a condition where you're thinking with an index. What's the difference you're looking for?

[–] indepndnt@lemmy.world 1 points 2 years ago (1 children)

Something like parsing a string that could have command codes in it of varying length. So I guess the difference is, is this a 1-, 2-, or 3-character code?

I have something like this in a barcode generator and I keep trying to find a way to make it more elegant, but I keep coming back to index and offset as the simplest and most understandable approach.

[–] hellishharlot@programming.dev 1 points 2 years ago

So you could generate lists of 1, 2, and 3 character code items rather than looking at index +1 or something.

[–] drathvedro@lemm.ee 2 points 2 years ago

In js there's reduce. Something like

arr.reduce((result, currentValue, currentIndex, original) => {
if(currentIndex < original.length - 2
    && original[currentIndendex + 2] % 2 === 0 ) {
    result.push(currentValue / 2) 
} else { 
    result.push(currentValue);
}
return result;
}, []) 

This would map arr and return halved values for elements for which the element two steps ahead is even. This should be available in languages where map is present. And sorry for possible typos, writing this on mobile.

[–] 9point6@lemmy.world 2 points 2 years ago* (last edited 2 years ago) (1 children)

Oh yeah, I map, filter and reduce pretty much everywhere I can. But sometimes you need the index and i is so commonly understood to be that, I'd say it could even be less legible to deviate from that convention

[–] hellishharlot@programming.dev 2 points 2 years ago* (last edited 2 years ago) (1 children)

In what world is

for (int index = 0; index < objectToIterate; index++)
{
    // DO YO THANG
}

less coherent than

for (int i; i < objectToIterate; i++)
{
    // DO YO THANG
}
[–] 9point6@lemmy.world 1 points 2 years ago (1 children)

The world where the convention is i

[–] hellishharlot@programming.dev 1 points 2 years ago (1 children)

What's incoherent about the first one? Why is index bad beyond standards

[–] 9point6@lemmy.world 1 points 2 years ago

It's not incoherent, it just takes a tiny bit more effort to mentally parse as it's not a stereotypical for loop. Maybe it's just me, but let me try and explain

With the i example if you're familiar enough with a language, your brain will gloss over the unimportant syntax, you go straight to the comparison and then whether it's incrementing or decrementing.

With the other example, the first my brain did was notice it's not following convention, which then pushes me to read the line carefully as there is probably a reason it doesn't.

I'm not saying it's a huge difference or anything, but following code conventions like this makes things like code reviews much easier cumulatively.

[–] UnfortunateShort@lemmy.world 4 points 2 years ago

I'd say except indices in general. Just bloats every line where you need to use them. Imagine writing CUDA C++ where you regularly add and multiply stuff and every number is referenced via (usually) 1-3 indices. Horrible.

[–] anon_8675309@lemmy.world 9 points 2 years ago (1 children)

Always and never are always bad.

[–] DahGangalang@infosec.pub 2 points 2 years ago

Counter point:

Always and Never is never bad.

[–] Double_A@discuss.tchncs.de 8 points 2 years ago

Unless you are implementing some mathematical formula. Then link the paper and stick to its variables.

[–] verstra@programming.dev 7 points 2 years ago (1 children)

I have a convention to correlate the size of variable scope with its name length.

If a variable is used all over the program, it will be named "response". If it is <15 lines, then it can be "res". If it is less than 3 lines, it can be only "r".

This makes reading code a bit simpler, because it makes unimportant, local vars short and unnoticeable.

[–] hellishharlot@programming.dev 7 points 2 years ago (2 children)

Why though? Intellisense helps you write out the full name. And instead of response why not call it whatever the data you're expecting to be

[–] lemmyingly@lemm.ee 2 points 2 years ago

I agree because it makes the code easier to follow in 6 months time.

[–] JuneFall@hexbear.net 1 points 2 years ago

Could you comment a couple of examples? At best some that signifiy the importance with them as verstra wrote.

[–] Thoth19@lemmy.world 7 points 2 years ago (1 children)

Guess I'll have to name all of my iterators "it" instead of "I". That will fix things.

Definitely a hot take though. Bc there are definitely times when it is totally acceptable.

[–] hellishharlot@programming.dev 2 points 2 years ago (1 children)

Iter works better than I for clarity

[–] UnfortunateShort@lemmy.world 3 points 2 years ago

An iterator is commonly understood to be an object and thus something much more complex than a simple integer. This is the exact opposite of more clear.

[–] space_comrade@hexbear.net 7 points 2 years ago* (last edited 2 years ago)

Counterpoint: using anything other than 'i' as your index in a for loop in C or C++ is obnoxious as fuck.

At most I'll go with 'it' for C++ iterators.

[–] jvisick@programming.dev 6 points 2 years ago

Mostly agree. I’m ok with single characters in a one line / single expression lambda, but that’s the only time I’m ok with it.

[–] morrowind@lemmy.ml 4 points 2 years ago (1 children)

Sometimes you're just using it once and it's blindingly obvious what it is

[–] tryptaminev@feddit.de 4 points 2 years ago

To be fair everyone with poor documentation thinks the code is blindingly obvious when they write it.

[–] Chingzilla@lemmy.world 3 points 2 years ago (1 children)
[–] hellishharlot@programming.dev 1 points 2 years ago

JavaScript, TypeScript, and C# babyyyy