Coding Guidelines. Introduction. General Points. Avoid redundant initialization/assignment

Similar documents
QueueBlock, ReversalADT, LinkedList,CustomerAccount, not MaintainCustomerData

Object oriented programming. Instructor: Masoud Asghari Web page: Ch: 3

Full file at

CSE 11 Style Guidelines

Index. Index. More information. block statements 66 y 107 Boolean 107 break 55, 68 built-in types 107

Weiss Chapter 1 terminology (parenthesized numbers are page numbers)

Makefiles Makefiles should begin with a comment section of the following form and with the following information filled in:

Index COPYRIGHTED MATERIAL

Documentation Requirements Computer Science 2334 Spring 2016

Classes, interfaces, & documentation. Review of basic building blocks

What does this program print?

AP COMPUTER SCIENCE JAVA CONCEPTS IV: RESERVED WORDS

Appendix G C/C++ Notes. C/C++ Coding Style Guidelines Ray Mitchell 475

Generating/Updating code from whole project

Pace University. Fundamental Concepts of CS121 1

LESSON 1. A C program is constructed as a sequence of characters. Among the characters that can be used in a program are:

Java Style Guide. 1.0 General. 2.0 Visual Layout. Dr Caffeine

The MaSH Programming Language At the Statements Level

1 Shyam sir JAVA Notes

CSCI 2101 Java Style Guide

Decaf Language Reference Manual

C Language Part 1 Digital Computer Concept and Practice Copyright 2012 by Jaejin Lee

1 Lexical Considerations

Expressions and Data Types CSC 121 Fall 2015 Howard Rosenthal

Lexical Considerations

Chapter 2 Basic Elements of C++

IT Web and Software Developer Software Development Standards

API Knowledge Coding Guide Version 7.2

Key Differences Between Python and Java

Objectives. Chapter 2: Basic Elements of C++ Introduction. Objectives (cont d.) A C++ Program (cont d.) A C++ Program

Chapter 2: Basic Elements of C++

Chapter 2: Basic Elements of C++ Objectives. Objectives (cont d.) A C++ Program. Introduction

IPCoreL. Phillip Duane Douglas, Jr. 11/3/2010

Expressions and Data Types CSC 121 Spring 2015 Howard Rosenthal

CSC Java Programming, Fall Java Data Types and Control Constructs

Javadoc. Computer Science and Engineering College of Engineering The Ohio State University. Lecture 7

CS260 Intro to Java & Android 03.Java Language Basics

User Interface Programming OOP/Java Primer. Step 3 - documentation

APPENDIX A : Example Standard <--Prev page Next page -->

Rule 1-3: Use white space to break a function into paragraphs. Rule 1-5: Avoid very long statements. Use multiple shorter statements instead.

Java: advanced object-oriented features

Typescript on LLVM Language Reference Manual

CS 351 Design of Large Programs Coding Standards

Appendix. Grammar. A.1 Introduction. A.2 Keywords. There is no worse danger for a teacher than to teach words instead of things.

Introduce C# as Object Oriented programming language. Explain, tokens,

Java Programming Style Guide

Points To Remember for SCJP

All code must follow best practices. Part (but not all) of this is adhering to the following guidelines:

Lexical Considerations

Documenting Java Code. Javadoc: The Tool and the Legend

Tokens, Expressions and Control Structures

CS 4240: Compilers and Interpreters Project Phase 1: Scanner and Parser Due Date: October 4 th 2015 (11:59 pm) (via T-square)

3. Java - Language Constructs I

UNIT- 3 Introduction to C++

Maintainability and Readability. What makes code readable? Understandable code. General Routine Structure. General Module Structure

WA1278 Introduction to Java Using Eclipse

Python I. Some material adapted from Upenn cmpe391 slides and other sources

11 Coding Standards CERTIFICATION OBJECTIVES. Use Sun Java Coding Standards

PHP-FIG Home Blog PSRs Personnel Bylaws FAQs Get Involved PSR-2: Coding Style Guide

Objectives for this class meeting. 1. Conduct review of core concepts concerning contracts and pre/post conditions

Java+- Language Reference Manual

Marcin Luckner Warsaw University of Technology Faculty of Mathematics and Information Science

Java Programming Tutorial 1

JOSE LUIS JUAREZ VIVEROS com) has a. non-transferable license to use this Student Guide

BIT Java Programming. Sem 1 Session 2011/12. Chapter 2 JAVA. basic

Advanced Object Oriented Programming EECS2030Z

d-file Language Reference Manual

Program Fundamentals

RTL Reference 1. JVM. 2. Lexical Conventions

Application Development in JAVA. Data Types, Variable, Comments & Operators. Part I: Core Java (J2SE) Getting Started

Assignment 5. Introduction

Brief Summary of Java

Short Notes of CS201

Programming Syntax and Style. David Greenstein Monta Vista High School

UMBC CMSC 331 Final Exam

Chapter 1 Summary. Chapter 2 Summary. end of a string, in which case the string can span multiple lines.

Java How to Program, 10/e. Copyright by Pearson Education, Inc. All Rights Reserved.

Chapter 9: Dealing with Errors

Language Fundamentals Summary

CS201 - Introduction to Programming Glossary By

COMP 202 Java in one week

Operators and Expressions

Coding Standards for Java

DaMPL. Language Reference Manual. Henrique Grando

x = 3 * y + 1; // x becomes 3 * y + 1 a = b = 0; // multiple assignment: a and b both get the value 0

JAVA PROGRAMMING LAB. ABSTRACT EXTRA LAB, In this Lab you will learn working with recursion, JRX, Java documentations

Chapter 2: Introduction to C++

Programming II (CS300)

C Formatting Guidelines

Java Notes. 10th ICSE. Saravanan Ganesh

Programming Language Basics

Chapter 2: Special Characters. Parts of a C++ Program. Introduction to C++ Displays output on the computer screen

Visual C# Instructor s Manual Table of Contents

Programming II (CS300)

CSCI 1060U Programming Workshop

MatchaScript: Language Reference Manual Programming Languages & Translators Spring 2017

PROGRAMMING III OOP. JAVA LANGUAGE COURSE

UEE1302 (1102) F10: Introduction to Computers and Programming

Java Coding style guide 1. Java. Coding Style Guide. (July 2015)

C++ Programming Style Guide

Transcription:

Coding Guidelines Introduction General Points Avoid redundant initialization/assignment Use of "!" instead of explicit "== true" and "== false" Anonymous inner classes. Members sort order Naming Abbreviations Braces and Identation Javadoc Comments Shorter one-line Javadoc Method Arguments Spacing Package Importing Semantic Units Whitespaces and empty lines Line Breaking String Output Java 5 Java 8 @Annotations Warning suppression Assertions and parameter validation tostring(), equals(), hashcode() Getters and setters TODOs Commented out code Appendices: A. Configure IntelliJ IDEA code style B. Broken tests Introduction This document describes formatting rules and guidelines for software source code. Note that this document does not cover best programming practices or techniques. It is solely concentrating on source code formatting and conventions. Java coding guidelines are largely based on SUN official Java coding conventions: http://java.sun.com/docs/codeconv/html/codeconventions. doc.html. Below are the only exceptions, clarifications and additions to this standard that are specific to Apache Ignite development process. Rationale Studies have shown that 80% of development time spent on software maintenance which involves software source code understanding, refactoring and support. Established and enforced code formatting rules and guidelines improve source code readability, promote team code ownership, allow engineers understand new code more quickly and thorough as well as simplify maintenance. Overview of TODOs Javadoc: Define indentation policy with multi-line parameter descriptions. Imports: Review the requirement that Javadoc references to classes not imported by source code must be resolved by an import rather than by citing the FQN in Javadoc. This does not play well with OSGi and messes up any dependency analysis efforts. General Points Avoid redundant initialization/assignment

String s = null; Bad s = "GridGain"; String s = "GridGain"; Good Use of "!" instead of explicit "== true" and "== false" Use shortened form of boolean expression where it does not compromise the readability. Anonymous inner classes. Use shorter form of "callbacks" are allowed now where it does not compromise the readability: collection.add(new A() { @Override public void m() { // Do something. ); Members sort order Same as described at Oracle's Java Code Conventions. Naming Except for types ( classes, interfaces, enumerations and annotations) and semantic constants names all other names should start with low-case letter. Types names should start with an upper-case letter. In the both cases a camel style should be used. Symbol '_' (underscore) should be used only to separate upper-case letters in the names. Constants ( final class attributes that have constant semantic and not just made final because of inner class access or performance considerations) should all be upper-case. For example (class comments ommitted):

class Window implements ScreenObject { /** private static final int MAX_INDEX = 10; /** private int currindex; /** private int serialuid; /** * @param uid UID. * @return Class name. public String classnamebyuid(long uid) {... Abbreviations Types and methods names are NOT abbreviated except for well-known cases such as EOF, Fifo, etc. See Abbreviation Rules for list of currently accepted abbreviations. Braces and Identation K&R bracing and indentation style should be used. { starts on the same line as the opening block statement. For example: while (true) { if (false) body(); else if (true) { foo(); bar(); else abc(); Braces are required in all cases, even if not required by syntax, except for the cases when next statement is one-liner. For the latter, braces must not be used, e.g.: if (somecondition) a = b + c; else a = b - c;

4-space characters should be used for both tabulation and indentation. When multi-line operator (try-catch, anonymous class instantiation, etc) goes after some condition it is required to use braces: if (somecondition) { try { invocation(); catch (Exception e) { e.printstacktrace(); Javadoc Comments All javadoc commetns should be approximately 80 characters long. Always keep in mind that we create Javadoc for people to read - it should be easy to consume and easy to understand. When you need to insert Java code snippet: 1. 2. Use http://www.java2html.de/applet.html Put into <blockquote class="snippet"></blockquote> to convert Java into colored HTML 1. Target XHTML 1.0 Transitional (inlined fonts) 2. Style: Kawa 3. Tab-space: 4 4. Alignment: left 5. Line numbers: ON 6. Table border: OFF 3. Copy <font...> tags into <blockquote> (make sure to remove <code> from both ends) When you need to insert any non-java code snippet: 1. Put into <pre class="snippet"></pre> When creating table: 1. Use <table class="doctable"> 2. Use <th> for header columns. 3. No other styles on <th>, <tr> or <td>. To mark important text used <strong> HTML element. For paragraph titles user <h1 class="header">. Every type should start with at least minimal Javadoc comments including description in the following form: /** * Type description. Every method, field or initializer public, private or protected in top-level, inner or anonymous type should have at least minimal Javadoc comments including description and description of parameters using @param, @return and @throws Javadoc tags, where applicable. For example:

/** * Description. * * @param i Integer parameter. * @param f Float parameter. Long comment, foo * bar, foo bar, foo bar. * @return Double value. public double foo(int i, float f) { /** * Some meaningful comment. static { NOTE: multiline comments in Javadoc tags should be indented by 4 or 5 characters depending on configuration of IDE. In most IDEs the single TAB click will produce only 1 character identation which is not enough for readability. Second click on TAB will shift it to (1+4) 5 characters. This is the only exception from 4-characters tabulation rule. It is ok to have empty (/* /) or auto-generated Javadoc comments for code elements that are "work in progress". However, it is not allowed to not have a Javadoc comment at all, i.e. every field, method, initializer or type regardless of visibility scope should have at least empty Javadoc with minimally required Javadoc tags (see above). Description must be separated by one blank line from Javadoc tags. / / or // comments should be avoided in between methods, fields or types. Such comments in most cases should be used within the methods. All comments should follow English grammar and punctuation including starting with upper-case letter and ending with '.'. No technical jargon is allowed in the comments. All identifiers in the Javadoc comments must be placed within <tt></tt> or linked to, if possible, using {@link ClassName or {@link ClassName#method constructs. Shorter one-line Javadoc Method's javadoc should be equals to /** {@inheritdoc in case it overrides or implements method without changing contracts declared at parent's javadoc. Use a shorter version of {@inheritdoc. /** * {@inheritdoc @Owerride public void m() {... Bad

/** {@inheritdoc @Override public void m() {... Good One-line Javadoc comments allowed and preferred for fields. /** Array index. One-line comment is only allowed for fields. private int index; TODO Define indentation policy with multi-line parameter descriptions. Method Arguments Two styles of method parameter declaration are allowed. First style is preferred when all arguments can fit in a single line before the page delimiter (120 char limit). public void foo(object obj1, Object obj2, Object obj3,..., Object objn) If arguments can't fit to single line, arguments are splitted by 120 char limit to several lines. Second style requires new line for every argument. public void foo( Object obj1, Object obj2,..., Object objn ) Mixing declartaion styles is not allowed. Spacing Source code has special spacing rules (mostly inherited from Sun's Java source code guidelines and mentioned here for better clarity). In comma-separated enumerations there is always a space between comma and the next element in the list. For example, foo(p1, p2, p3) Notice spaces between comma ',' and the next parameter. There is always a space in between operands and binary operation itself. For example: a += b; b = a; a * (c + b) / d There should be no space between unary operation and its operand. For example:

!a, ~b, -b, b++ Notice also that all assignments by this rule should have space around '=' symbol: int a = b Comments should be separated by space from "// ", "/, "/** "* or " ". For example, / Notice the space. / Package Importing Use per-class importing. In case of the naming conflict - use fully qualified names (FQN). Use imports instead of FQNs in Javadoc links. Import should be ordered alphabetically, but packages starting with 'java.' should be declared prior to others. Static imports should follow same rules as regular imports and be separeted by a new line. import java.util.arraylist; import java.util.collection; import org.apache.ignite.lang.igniteuuid; import org.apache.ignite.thread.ignitethread; import org.jsr166.concurrenthashmap8; import static java.util.concurrent.timeunit.milliseconds; import static org.apache.ignite.events.eventtype.evt_node_failed; import static org.apache.ignite.events.eventtype.evt_node_joined; import static org.apache.ignite.events.eventtype.evt_node_left; Semantic Units The source code should be broken into minimal semantic units and all such units must be separated by one empty line. To simplify the recognition of semantic units, the every line of the source code should be separated by one empty line except for the following cases: Between lines in continues comments (/ /' or //) that span more then one line. Between import statements. After { and brackets. Between Javadocs tags in the comment. Between code comment and corresponding code line. Between Javadocs comment /* / and corresponding element (type, method, initializer, or variable). Between one-line case statements in switch operator. Between identical (similar) language constructs, i.e. identical (similar) method calls or operations, e.g. multiple setter or getter calls can be grouped together without empty lines between them. Whitespaces and empty lines Source code line should not be longer then 120 characters (to be visible on most conventional monitors). 4 space characters should be used for tabulation and indentation. IDE should be configured to replace tabulation with spaces (to properly see source code on the platforms with different tabulation sizes). Empty lines should be used according to following rules: Where Number of empty lines required Before package statement 0 Before imports 1

Between imports and static imports 1 Before class header 1 After class header 0 Between class definition and EOF 1 Between class members (filelds, methods, initializers) 1 Between minimal semantic units in the method or initializer body 1 Note that single blank line SHOULD NOT be used for the mere decoration of the source code. Avoid using double empty lines. Blanks space (1 space character) should be used before opening ( or {. { and should always be the last tokens in the line (except for the possible comments). However, blank space should not be used between method name and opening (. Example: /** * Class definition example. * * @author @java.author * @version @java.version class Foo { /** * Example method. * * @param i Example parameter. * @throws MyException Thrown in case of any error. public void method(int i) throws MyException { if (i > 0) { // Do recursion. try { for (int j = 0; j < 10; j++) method(i--); catch (MyException e) { e.printstacktrace(); switch (i) { case 10: return i - 1; case 11: i += 2; i /= 10; break; default: assert false;

// No javadoc for anonymous classes. MyInterface itf = new MyInterface() { @Override public int mymethod(int p) { return p++; ; if (i < 0) { // Exit now. System.out.println("Woo-hoo"); System.out.println("One more Woo-hoo"); return; Line Breaking If source code lines and/or Javadoc lines get longer than 120 characters it should be broken. The rule is to start consequent line 4 spaces to the right relatively to first line. All other lines 3rds, 4th, etc. (if overall line gets longer than 120x2) should start on the same indentation as 2nd line. No other decorative rules are allowed. In other words, the current line should never be indented more then 4 spaces to the right from the previous line. The line should be broken on the last '.' or ',' character that fits into 120 character margin. String Output All output debug/logging output including tostring() methods and exception messages should follow the next BNF: output: prefix prefix ": " postfix prefix '[' nv-pairs ']' ; nv-pairs: pair pair ", " pair ; pair: name '=' value ; prefix, postfix, name, value: java.lang.string ; For example: throw new CacheException("Invalid type [type=" + type + ", xid=" + tx. getxid() + ']'); throw new WorkflowException("Invalid rule: " + rule.getname()); Note that all prefix, postfix, name, value should follow English grammar, in particular, start with upper case and end with the dot '.'. If it is necessary to output error message (e.g. from exception) as name-value pair it should have err name. For example:

throw new GridException("Failed to instantiate bean [type=" + GridConfiguration.class + ", err=" + e.getmessage() + ']', e); Do not use error, errmsg, etc. Java 5 Java 5 added many additional useful features that significantly improve quality of code. @Override When overriding methods from parent class always use @Override annotation. Generics Allways use generics when types of classes are known in advance. Use foreach loops whenever possible. for (String s : list) {... Java 8 Java 8 added lambda expressions and Stream API. While lambda expressions are more expressive and concise, good old anonymous classes are still preferred in Apache Ignite code base. Stream API is convenient means of data processing but usages of this API should be avoided in most cases because it can lead to unpredictable and uncontrolled creation of class instances and therefore create additional pressure on GC. @Annotations All annotations must be placed on a separate line, except for @Nullable and @Override, as in the following example: /** {@inheritdoc @SuppressWarning("foobar") @Nullable @Override public String tostring() { return "something"; @Nullable and @Override annotations should be in the same sequence as shown in the example. We do not use @NotNull annotation. Warning suppression Don't use statement warning suppression. Bad public static <T> T[] newarray(class<t> type, int length) { //noinspection unchecked return (T[])Array.newInstance(type, length);

Good @SuppressWarnings({"unchecked") public static <T> T[] newarray(class<t> type, int length) { return (T[])Array.newInstance(type, length); Assertions and parameter validation When correctness of code depends on some preconditions or expectations (including values of the call arguments) they should be expressed explicitly using assert statements. In public API methods functions from GridArgumentCheck class should be used for argument check instead of assert. Capsule(State state) { assert state!= null; Good this.state = state; Good public SomePublicConstructor(int max) { A.ensure(max > 0, "max > 0"); this.max = max; tostring(), equals(), hashcode() If a class overrides tostring() method, this method goes last. If a class overrides equals() and hashcode() methods, they should go before tostring(), if it is present, or last. Getters and setters Getters and setters should be implemented without get/set prefixes in internal APIs. TODOs Use next format for TODOs. // TODO: IGNITE-xxx, <description of what should be done>. It's mandatory to use related JIRA ticket number.

Commented out code We try not using commented out code. If there is no another option and code have to be commented then TODOs (with related JIRA ticket) have to be added before commented out code. Appendices: A. Configure IntelliJ IDEA code style In order to configure IntelliJ IDEA for Ignite code style follow these steps: copy ignite\idea\ignite_codestyle.xml to <user_home>\.ideaic14\config\codestyles (or to ~/Library /Preferences/IntelliJIdea14/codestyles on Mac) select ignite in IDE Settings -> Code Style Configure IDEA to stripe trailing spaces and add blank line to the end of file. B. Broken tests We try to not use commented code. So, in case if test(s) is broken the test should be muted on TeamCity with a related to JIRA ticket comment which describe a reason of fail.

If test hangs or works too long then fail("https://issues.apache.org/jira/browse/ignite-1113"); method should be added as first line of the test. To disable all tests in *Test class use /** {@inheritdoc @Override protected void beforetest() throws Exception { fail("https://issues.apache.org/jira/browse/ignite-1113");