4 ms·
I actually disagree - while sizeof(char) might always be 1, code isn't just to communicate to a compiler, it's to communicate to another developer. When I see "
by xpaulbettsx 16y ago
I actually disagree - while sizeof(char) might always be 1, code isn't just to communicate to a compiler, it's to communicate to another developer. When I see "sizeof(char) * strlen(foo)", I know that they want to allocate 'n' characters and that this is a string buffer: even though as a dev I certainly could've figured out, making code read like you think makes it far faster for others to interpret the intent of the code.
It's like when people define a 64MB buffer as something like:
#define BUFSIZE (64 * 1024 * 1024);
Even though you could've written 67108864, the former is far more comprehensible.
- CoreDumpling 16y agoIt bears repeating: "[P]rograms must be written for people to read, and only incidentally for machines to execute." -- Abelson & Sussman, Structure and Interpretation of Computer Programs [1], strangely misquoted by Paul Graham [2] [1] http://mitpress.mit.edu/sicp/full-text/sicp/book/node3.html http://mitpress.mit.edu/sicp/full-text/sicp/book/node3.html [2] http://www.paulgraham.com/hp.html http://www.paulgraham.com/hp.html
- yycom 16y agoThe best quote IMO is Knuth: programming is the art of telling a human what you want the computer to do.
- edanm 16y agoIt's also the main reason to use constants, even when magic numbers would do (e.g., use HOURS_IN_DAY instead of 24. It's not likely you'll ever have to change the number, but HOURS_IN_DAY is clearer for humans to parse). This also applies to the bit in the article about coercing return values, which I disagree with. Funnily enough, he mentions that K&R also recommend coercion, even though they have a small note that it's not necessary any more. Still makes for clearer programs.
- arethuza 16y agoAs with all rules like that they can be taken to DailyWTF levels of silliness. I remember working on a Java codebase years ago where every string literal was defined in a Constants class - fair enough I guess. However, it had entries that looked like this: public static String HTTP = "http"; public static String COLON = ":"; public static String SLASH = "/"; leading to code that looked like: url = Constants.HTTP + Constants.COLON + Constants.SLASH + Constants.SLASH +
- edanm 16y agoYep, I've seen similar monstrosities often. There's actually two problems with such code: one is that it doesn't actually make the code easier to read, but harder. The other is more subtle: using constants like this is working at the wrong level of abstraction. The correct way to write this kind of code is to use a wrapper function which knows how to put together URLs, since there are lots of special rules to how URLs are put together (encoding, etc.) But a lot of people don't bother, and instead simply concatenate strings with a SLASH between them, and think that because they define the slash in some constant that makes the code correct.
- arethuza 16y agoI have to admit that I would just make that line: url = "http://" + .... :-)
- tetha 16y agoI'd go even further with the issue. These constants do not offer _any_ abstraction or readability, and precisely this is the issue. Naturally, I like constants like POPCORN_PRICE = 12 or whatever. They add meaning to meaningless numbers. I am on the fence for HOUR_PER_DAY and MINUTE_PER_HOUR, because they never change, but they at least add a certain security if you chain them together. bar = lengthInSeconds * SECONDS_IN_MINUTE * MINUTES_IN_HOUR * DAYS_IN_YEAR. In this case you can simply match. Seconds - Seconds, fits. Minute - Minutes, fits. Hour - days... wait, doesn't fit. However, if you look at PROTOCOL + COLON + SLASH + SLASH versus "http:// http://, there is just nothing added.
- billforsternz 16y agoThe semicolon in your #define is evil and should be removed.