DEV Community

On code readability in object-oriented languages

Loicniragire on June 09, 2017

Writing code, as in many other forms of communication, comes with a challenge of clearly expressing thoughts and ideas into a limited set of word...
Collapse
 
mortoray profile image
edA‑qa mort‑ora‑y

I disagree with "Naming itself is not reliable enough to communicate our intent no matter how clever the name seems".

Combined with parameter/return types I believe the signature of a function can fully convey the intent of the function, at least to the point of it being used correctly.

At times I'd argue the name itself is sufficient. Consider a simple function like radiansToDegrees, it's hard to mistake the intent of this function.

Collapse
 
mindlace profile image
Ethan Fremen • Edited

One thing I've noticed over time is that 'simple' is extremely context dependent.

To take your example, if I didn't happen to know what 'radians' meant, I could interpret your function as having something to do with temperature.

Beyond that... I think "communicating our intent" is not the same as "communicating what the code does". E.g.

// radiansToDegrees because MyQuaternion only provides radians, and the UI Shows degrees 
func radiansToDegrees(radians float) degrees float { ...
Enter fullscreen mode Exit fullscreen mode

Captures intent (I need degrees for the ui) whereas the un-commented version just explains the 'function'.

Collapse
 
mortoray profile image
edA‑qa mort‑ora‑y

No, interpreting radians that way is just wrong. We have to assume that the people working on our project have at least taken a passing interest in the domain and would understand the commonly used, and perhaps uncommonly used terms. Trying to communicate to somebody that knows nothing about what's going on is a waste of time.

Your comment also causes confusion. Does this mean I can't use this function where it doesn't involve UI? Is this conversion somehow special to the values that a user might input. You've done the opposite of what a comment should do: you've added unclarity where before there was none.

Thread Thread
 
mindlace profile image
Ethan Fremen • Edited

"Assuming a passing interest in the domain" is good, assuming everyone in your team has a common set of vocabulary is more problematic. For the specific example you gave, I admit my interpretation as temperature was contrived.

I frequently work with people for whom english is not their first language, and I have found that describing even "obvious" function names has been very helpful.

Also agreed that the one liner I gave was not helpful by itself; to match the form of the article, my comment would have fit in the "Intent" line.

In reflecting on your feedback, I realized that I mostly use "why" comments inside function bodies whenever I'm doing something weird. So I guess unless your function is doing something weird, "why" comments matter less.

Collapse
 
loicniragire profile image
Loicniragire

There is certainly a reason why "Naming" remains one of the hardest problems in Computer Science. Absolutely better function signature are very helpful but not enough. Also, depending on the type of application you are developing, "sufficient" may not be the level of clarity to strive for.

Collapse
 
mortoray profile image
edA‑qa mort‑ora‑y

Saying something is "not enough" is unfortunately not a strong enough justification for adding comments to all functions. Though many functions do need comments, a large percentage (maybe not more than half), of the functions I've seen on projedts simply don't need to be commented.

Always keep in mind that comments interfere with refactoring. It's easy to break up and splity apart the code of a function, but it's time consuming and error prone to do the same for comments.

Collapse
 
ben profile image
Ben Halpern • Edited

Contrary to popular practice, for those who comment their code, I argue that less is more.

You definitely don't want to have too much verbosity regardless of intent here. There's a reason people read Twitter more willingly than books. We're all human and might glance past a wall of text. When possible, be concise...

Collapse
 
bousquetn profile image
Nicolas Bousquet • Edited

I would argue this depends what we speak of.

If we speak of some client code used only once, I would expect enough comments to guide me through the code structure, to explain the overall intent and explain the critical/strange code you may have to actually have.

Now would this code made reusable as a shared API I would expect a lot more. I would expect a clear facade as a design, witch each method, parameter etc fully explained. I would expect a guide on how to use the API, the common pitfalls and a few tutorials to show how to use it in practice... At least.

Comments are expensive to write and many people don't even read comments. But that's actually a problem, not a good thing. When I use a public API, same JDK or spring or whatever, I usually read what the API is saying. What are the exception cases, what are required on my parameters and also get lot of information on if it is thread safe, the performance, alternate methods in the API and so on.

I have seen that I can often be done with a non trivial problems very very fast this way because the code I read end up being both robust (being design to fit how the API is really working) and concise because I know when I need to test a null or not, when it make sense to catch an exception and when it is unecesary... And usually when other have to read it, it is quite clear for them.

Sometime they complain of the style used, I should use more inheritences, more class or less of something... But they find the code clear, understandable and maintenable. And that what we want, isn't it?

Fully commenting a code, including robust unit tests, including a few clear examples, relate to the overall design with other part of the code, refer to key concepts, key steps and maybe also explaining why it was done this way and what are the obvious extension points allows even a newcomer to understand what is happening much faster.

If we apply information theory on code, boilerplate, design pattern and so own are all noise and what we call incidental complexity. It may be obvious, may not require comments but the problem is also useless. A code should be meaningfull a so it would be expected to not have just noise. What is actually doing something would likely need some explanation and because the code is dry, the comment ratio would appear to be high.

But like we need to remove uncessary comments, we also really need to remove unecessary code.

Collapse
 
loicniragire profile image
Loicniragire

As always, thanks for the feedback. Will definitely keep that in mind😊

Collapse
 
ben profile image
Ben Halpern

🙌

Collapse
 
danilsalin profile image
Danil Salin

Great article Loicniragire!

I have one suggestion, if I may.
I believe this article will be much better if you include more examples.
Probably not an example per statement, but an example per important idea,
since it helps a lot while learning.

Thanks again.

Collapse
 
loicniragire profile image
Loicniragire

Thanks for your suggestion - I think it would've been helpful in this case.

Collapse
 
dima_rymar profile image
Dmitry Rymar

Nice post! Thank you, Loicniragire!