330 likes | 499 Views
Style. About the book. This book is a team effort by many good programmers, not just one person’s opinions The rules have been widely distributed and commented upon The rules reflect widespread and accepted practices And no, I don’t agree with everything in the book!.
E N D
About the book • This book is a team effort by many good programmers, not just one person’s opinions • The rules have been widely distributed and commented upon • The rules reflect widespread and accepted practices • And no, I don’t agree with everything in the book!
Rule 1: Adhere to the style of the original • Consistent style is very important • Most times, you will enter an ongoing project, with established style rules • Follow them even if you don’t like them • Don’t try to establish “better” style rules • It won’t work anyway • There may be reasons you don’t know about • If a project has mixed styles with no consistency, you might try to get people to agree on one
Rule 3: Do it right the first time • You’re working on a large project, so you use good style... • ...but you need a tool to help you do one little job, so you slap it together quickly • Guess which program will be around longer and used by more people?
Rule 5: Indent nested code • Always indent statements that are nested inside (under the control of) another statement • if (itemCost <= bankBalance) { writeCheck(itemCost); bankBalance = bankBalance - itemCost;} • while (seconds > 0) { System.out.print(seconds + "..."); seconds = seconds - 1;} • Indentation should be consistent throughout the program • 4 spaces has become more-or-less standard
Rule 6: Break up long lines • Scrolling a window horizontally is a pain! • When you print on standard paper, long lines are either cut off or wrap in bad places • I have long used a 72 character limit • Some editors will show you a limit line • Various suggestions: • Break after, not before, operators • Line up parameters to a method • Don’t indent the second line of a control statement so that it lines up with the statements being controlled
Rule 8: Don’t use “hard” tabs • Once upon a time, you could depend on tab stops every eight character positions • Today, every editor has its own idea of where and how to set tab stops • If you change editors, your nice indentation gets ruined • It’s worse if you use both tabs and spaces • I have learned this one the hard way! • A hard tab is an actual tab character in your text • Good editors can be set to use soft tabs (your tab characters are replaced with spaces) • BlueJ uses only soft tabs; Eclipse can do either
Rule 9:Use meaningful names • Names should be chosen very carefully, to indicate the purpose of a variable or method • If the purpose changes, the variable or method should be renamed • It is worthwhile spending a little time choosing the best name • Long, multiword names are common in Java • Eclipse makes it very easy to rename things
Rule 10: Use familiar names • Where common terminology exists, use it; don’t make up your own • Example from the book: If your users refer to “customers,” your program should use the name Customer, not Client
Rule 11: Question excessivelylong names • Variables should be used for a single purpose • Methods should do one simple, clearly defined thing • If a descriptive name is overly long, maybe the variable or method is trying to serve too many purposes
Meaningful names: exceptions I • It is common practice to useias the index of a for-loop,jas the index of an inner loop, and k as the index of a third-level loop • This is almost always better than trying to come up with a meaningful name • Example: • for (int i = 1; i <= 10; i++) { for (int j = 1, j <= 10; j++) { System.out.println(" " + (i * j)); }}
Meaningful names: exceptions II • Method variables may be given short, simple names, if: • The purpose of the variable is obvious from context, and • The variable is used only briefly, in a small part of the program • But never use meaningless names for fields (class or instance variables)
Rule 28: Use standard names for “throwaway” variables • If variables have no special meaning, you can use names that reflect their types • For example, if you are writing a general method to work with any strings, you might name them string1, string2, etc. • Alternatively, you can use very short names • s,t, u, or s1, s2, etc. are often used for Strings • p, q, r, s are often used for booleans • w, x, y, z are often used for real numbers
Rule 12: Join the “vowel generation” • In more primitive languages, names were often limited to 8 or so characters • This led to names like maxVolum and lngPlyng • The usual rule was to leave out vowels, starting from the right • Such names are harder to read and to remember • Do not leave out vowels, or otherwise use unusual abbreviations, in Java!
Naming classes and interfaces • Rule 18: Capitalize the first letter of each word, including the first:PrintStream, Person, ExemptEmployee • Rule 19: Use nouns to name classes:ExemptEmployee, CustomerAccount • Classes are supposed to represent things • Rule 20: Use adjectives to name interfaces:Comparable, Printable • Interfaces are supposed to represent features
Naming variables • Rule 25: Capitalize the first letter of each word except the first:total, maxValue • Rule 26: Use nouns to name variables:balance, outputLine • Variables are supposed to represent values
Naming methods • Rule 22: Capitalize the first letter of each word except the first:display, displayImage • Methods are capitalized the same as variables • Rule 23: Use verbs when naming methods:displayImage, computeBalance • Methods are supposed to do something
Rule 13: Capitalize only the first letter in acronyms • In names, write acronyms such as GUI and API as Gui and Api • Examples:setDstOffset,, displayAsHtml,, loadXmlDocument • Since capital letters are used to separate names, this rule helps avoid confusion • Sun’s APIs don’t always follow this convention
Naming constants • A constant is an identifier whose value, once given, cannot be changed • Constants are written with the keyword final, for example: • final int FIVE = 5; • final float AVOGADROS_NUMBER = 6.022E23; • Rule 31: Constants are written in ALL_CAPITALS, with underscores between words • Exception: color names, such as Color.pink • Colors were defined before conventions were established • However, Java 1.4 adds properly capitalized names for colors, such as Color.PINK
Kinds of comments • “Standard” (C-style) comments: /* ... */ • One-line and end-line comments:// a one-line comment is on a line by itselfx = 0; // an end-line comment follows code • All of the above are “internal” comments, seen only by someone looking at your code • Don’t overcomment; not every line needs a comment! • Internal comments are only for maintainers • But avoid things that would embarrass you to a user! • Documentation (javadoc) comments: /** ... */ • These are meant to be seen by the entire world! • Documentation comments are not covered in this series of slides
Which kind of internal comment? • Rule 36:Use “standard” (/*...*/) comments to comment out code without removing it. • However, this assumes you are using a simple text editor, because it saves typing // over and over again • This is a bad rule if you are using a decent IDE • Standard comments cannot be nested, so it’s tricky commenting out code with comments • One-line comments don’t have this problem • Both BlueJ and Eclipse make it very easy to use one-line (//...) comments
Explaining the code I • Rule 59: Add internal comments only if they will aid in understanding your code. • Don’t repeat the javadoc comments • Don’t put in comments to explain things that are obvious from the code • Don’t put in irrelevant or useless comments • // Go Red Sox!!!! • Always put /* ... */ comments before the code they describe, never after the code
Explaining the code II • Rule 37: Use one-line comments to explain implementation details. • One-line comments are also good for writing reminders for yourself about things you still need to work on • // These assertions should be replaced by Exceptions • I like to use one-line comments to tell what the next several lines of code are going to do • // Put this Vehicle in a random location
End-line comments I • Rule 62: Explain local variable declarations with an end-line comment. • int edgeDistance; // distance to the nearest edge • But don’t let your lines get too long • And Rule 64 says: Label closing braces in highly nested control structures. • } // end switch } // end if } // end for j} // end for i • Better yet, avoid highly nested control structures
End-line comments II • I also find end-line comments useful for an else that is a long way from its if: • if (distance > 5) { ... a lot of code in between ...}else { // distance <= 5...} • But now that we have assert statements, this is even better: • ...else { assert distance <= 5;...}
Flagging unresolved issues • Rule 63: Establish and use a set of keywords to flag unresolved issues. • Eclipse uses these three (you can add more): • TODO for things you would like to do in the future • FIXME for things which are broken and you need to fix, but you aren’t working on at the moment • XXX for things that are arguably broken and you need to think about some more before you do anything
Intentionally missing break • Rule 65: Add a “fall-through” comment between two caselabels of aswitchstatement, if nobreakstatement separates those labels. • The switch statement is so badly designed that forgetting the break is a common error • To keep an intentionally missing break from being “corrected,” add a comment
Label empty statements • Sometimes you intentionally use a loop with an empty statement body • Rule 66: Label empty statements. • while ((c = reader.read()) == space) ;// Empty body • This is because the semicolon is small and easy to overlook • I prefer a different solution: use an empty block as the statement body • while ((c = reader.read()) == space) { }
Don’t repeat the code • Rule 60: Describe why the code is doing what it does, not what the code is doing. • Another way of saying this is:Comments should not echo code. • Here’s a typical example of a bad comment: • count = 0;// set count to zero • You should assume that anyone reading your internal comments knows some Java!
Use the active voice • Rule 34: Use the active voice, and omit needless words • // zero out the array • // each of the elements of the array is set to// zero by the following loop • Writing comments is still writing--all the rules for good writing apply to comments • Best reference: The Elements of Style, by Strunk and White
Debugging statements • We sometimes put in debugging statements that we plan to remove afterwards • Simple trick: start these “temporary” statements in the first column, so you can find them easily • boolean legalLocation(int row, int col) {System.out.println("In legalLocation: " + row + " " + col); return row >= 0 && row < numRows && column >= 0 && column < numCols; } • Another option: • final boolean debugging = true;...if (debugging) System.out.println(...)