| > the lack of comments is simply not an issue I'm looking at the code and just cannot agree. If I look at a command like "TRotateFloatCommand.DoIt" in URotate.p, it's 200 lines long without a single comment. I look at a section like this and there's nothing literate about it. I have no idea what it's doing or why at a glance: pt.h := BSR (r.left + ORD4 (r.right), 1);
pt.v := BSR (r.top + ORD4 (r.bottom), 1);
pt.h := pt.h - BSR (width, 1);
pt.v := pt.v - BSR (height, 1);
pt.h := Max (0, Min (pt.h, fDoc.fCols - width));
pt.v := Max (0, Min (pt.v, fDoc.fRows - height));
IF width > fDoc.fCols THEN
pt.h := pt.h - BSR (width - fDoc.fCols - 1, 1);
IF height > fDoc.fRows THEN
pt.v := pt.v - BSR (height - fDoc.fRows - 1, 1);
Just breaking up the function with comments delineating its four main sections and what they do would be a start. As would simple things like commenting e.g. what purpose 'pt' serves -- the code block above is where it is first defined, but you can't guess what its purpose is until later when it's used to define something else.Good code does not make comments unnecessary or redundant or harmful. This is a myth that needs to die. Comments help you understand code much faster, understand the purpose of variables before they get used, understand the purpose of functions and parameters before reading the code that defines them, etc. They vastly aid in comprehension. And those are just "what" comments I'm talking about -- the additional necessity of "why" comments (why the code uses x approach instead of seemingly more obvious approach y or z, which were tried and failed) is a whole other subject. |
| |
| ▲ | exsf0859 42 minutes ago | parent | next [-] | | That particular code is idiomatic to anyone who worked with 2D bitmap graphics in that era. pt == point, r == rect, h, v == horizontal, vertical, BSR(...,1) is a fast integer divide by 2, ORD4 promotes an expression to an unsigned 4 byte integer The algorithms are extremely common for 2D graphics programming. The first is to find the center of a 2D rectangle, the second offsets a point by half the size, the third clips a point to be in the range of a rectangle, and so on. Converting the idiomatic math into non-idiomatic words would not be an improvement in clarity in this case. (Mac Pascal didn't have macros or inline expressions, so inline expressions like this were the way to go for performance.) It's like using i,j,k for loop indexes, or x,y,z for graphics axis. | | |
| ▲ | DanHulton 21 minutes ago | parent [-] | | Xyz makes sense because that is what those axes are literally labeled, but ijk I will rail against until I die. There's no context in those names to help you understand them, you have to look at the code surrounding it. And even the most well-intentioned, small loops with obvious context right next to it can over time grow and add additional index counters until your obvious little index counter is utterly opaque without reading a dozen extra lines to understand it. (And i and j? Which look so similar at a glance? Never. Never!) | | |
| ▲ | kaibee 12 minutes ago | parent [-] | | ijk are standard in linear algebra for vector components. > (And i and j? Which look so similar at a glance? Never. Never!) This I agree with. |
|
| |
| ▲ | tgtweak an hour ago | parent | prev | next [-] | | This actually looks surprisingly straightforward for what the function is doing - certainly if you have domain context of image editing or document placement. You'll find it in a lot of UI code - this one uses bit shifts for efficiency but what it's doing is pretty straightforward. For clarity and to demonstrate, this is basically what this function is doing, but in css: .container { position: relative;
}.obj { position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
| |
| ▲ | j16sdiz 44 minutes ago | parent | prev | next [-] | | BSR = bitwise right-shift ORD4 = cast as 32bit integer. BSR(x,1) simply meant x divided by 2. This is very comment coding idom back in those days when Compiler don't do any optimization and bitwise-shift is much faster than division. The snippet in C would be: pt.h = (r.left + (int32_t)r.right) / 2;
pt.v = (r.top + (int32_t)r.bottom) / 2;
pt.h -= (width / 2);
pt.v -= (height / 2);
pt.h = max(0, min(pt.h, fDoc.fCols - width));
pt.v = max(0, min(pt.v, fDoc.fRows - height));
if (width > fDoc.fCols) {
pt.h -= (width - fDoc.fCols - 1) / 2;
}
if (height > fDoc.fRows) {
pt.v -= (height - fDoc.fRows - 1) / 2;
}
| | | |
| ▲ | yearolinuxdsktp an hour ago | parent | prev | next [-] | | It’s not a myth, it’s a sound software engineering principle. Every comment is a line of code, and every line of code is a liability, and, worse, comments are a liability waiting to rot, to be missed in a refactor, and waiting to become a source of confusion. It’s an excuse to name things poorly, because “good comment.” The purpose of variables should be in their name, including units if it’s a measurement. Parameters and return values should only be documented when not obvious from the name or type—for example, if you’re returning something like a generic Pair, especially if left and right have the same type. We’d been living with decades of autocomplete, you don’t need to make variables be short to type. The problem with AI-generated code is that the myth that good code is thoroughly commented code is so pervasive, that the default output mode for generated code is to comment every darn line it generates. After all, in software education, they don’t deduct points for needless comments, and students think their code is now better w/ the comments, because they almost never teach writing good code. Usually you get kudos for extensive comments. And then you throw away your work. Computer science field is littered with math-formula-influenced space-saving one or two letter identifiers, barely with any recognizable semantic meaning. | |
| ▲ | DoneWithAllThat an hour ago | parent | prev [-] | | Man I just don’t know who to believe, you or the Chief Scientist for Software Engineering at IBM research Almaden. |
|