Personal tools
You are here: Home Members ylitvinov's Home Стайлгайд для Java

Стайлгайд для Java

Программы обычно пишутся прежде всего для человека, а уж потом для компьютера. Поэтому на читабельность программы и на то, чтобы она была понятной, надо обращать особое внимание. Неправильная, но понятная программа лучше правильной, но непонятной - в первой легко найти ошибку и поправить, а во вторую сложно вносить изменения. Поэтому существуют стили кодирования - некие соглашения между программистами, если не следовать которым, можно быть непонятым. Например, если написать:
for (int i = 0; i < 10; ++i);
    System.out.println("Ъ");
все подумают, что Ъ будет напечатан 10 раз, а на самом деле - 1. Есть официальный стайлгайд от Sun. Обязательные к исполнению правила (данный список может меняться, следите за обновлениями):

  1. Программа должна собираться без предупреждений компилятора.
  2. Вложенные операторы должны выделяться отступом, операторы одного уровня вложенности должны быть на одном уровне отступов. Отступы должны быть 4 пробела или 1 табуляция (но что-то одно во всей программе!). Используйте пустые строки, чтобы выделять логически связные куски кода.
  3. В описании класса должны идти открытые конструкторы, затем static и public методы, затем public поля (которых быть на самом деле не должно, см. правило 7), затем private конструкторы и методы, затем private поля
  4. На одной строке должно быть только одно определение. Неправильно писать
    int a, b;
    правильно:
    int a; 
    int b;
  5. Нельзя объявлять переменные, совпадающие по имени с переменными, объявленными в объемлющем блоке (избегайте скрытия переменных). Допустимо, чтобы имена параметров метода и полей совпадали.
  6. Не должно быть раскопированного кода. Выделяйте общие куски в отдельные методы.
  7. Не должно быть public-полей.
  8. Не следует писать несколько операторов на одной строке, например,
    if (k < 0) fail = true;
    
    следует писать как
    if (k < 0)
      fail = true;
    
  9. Открывающая "{" должна быть на той же строке, что и предшествующий текст, закрывающая "}" - на отдельной строке.
  10. Методы разделяются пустой строкой. Пример:
    class Sample extends Object {
        int var1;
        int var2;
    
        Sample(int i, int j) {
            var1 = i;
            var2 = j;
        }
    
        int emptyMethod() {}
    }
    
  11. По возможности сужайте области видимости переменных, набор допустимых операций и т.д. (например, пишите final везде, где только можно). Тогда если что-то пошло не так, вы сможете узнать об этом уже на этапе компиляции.
  12. Не используйте goto. Вообще, старайтесь, чтобы поток выполнения программы был прост и понятен.
  13. Одна сущность должна отвечать за одно действие и играть одну роль по всей программе. Один метод должен делать что-то одно, если метод делает что-то и что-то ещё, его надо разбить на два. То же касается классов - у них должна быть чётко очерченная область ответственности. Одну и ту же переменную нельзя использовать в двух различных ролях.
  14. Не пишите методов размером больше экрана, разбивайте их на мелкие методы.
  15. Выбирайте подходящие имена для переменных, методов и классов. Называйте переменные и методы с маленькой буквы, а свои типы (в т.ч. классы и интерфейсы) с большой. Если в имени переменной или метода содержится несколько слов, то все, кроме первого, должны начинаться с заглавной буквы (без каких-либо символов подчеркивания). Имена переменных (за исключением счетчиков циклов), функций и типов данных не должны быть короче 4 символов. Например:
    class ListNode {
        int value;
        ListNode nextNode;
    }
    
  16. Не используйте "магические константы".
    Неправильно:
      for (i = 0; i < 10; i++) 
    
    Правильно:
    final int dimension = 10; 
    ...
    for (i = 0; i < dimension; i++)
  17. Выделяйте пробелами арифметические операции, оператор присваивания и т.д.
  18. Не отделяйте пробелами скобки. Например, не "System.out.println ("Hello!")" или "System.out.println( "Hello!" )", а "System.out.println("Hello!")"
  19. Ставьте пробел после ключевого слова: между if и (, for и ( и т.д. Например, правильно оформленный for:
    for (int i = 0; i < maxN; ++i) {         
        System.out.println("Hello, world!\n");
    }
  20. Предложения case в операторе switch должны оформляться следующим образом:
    case '2':
        ...
        break;
    
  21. if-else оформляется так:
    if (condition) {
        statements;
    }
    
    if (condition) {
        statements;
    } else {
        statements;
    }
    
    if (condition) {
        statements;
    } else if (condition) {
        statements;
    } else {
        statements;
    }
    
  22. Методы-предикаты (возвращающие булево значение) следует именовать следующим образом:
    [глагол][предикат]
    где "глагол" - глагол бытия (to be) или обладания (to have) в сооветствующей форме, а "предикат" - проверяемое свойство. Например:
    boolean isPrime(int n) 
    boolean hasColor()
  23. При вызове функций-предикатов запрещается сравнивать результат с логическими константами.
    if (isPrime(n) == true) - плохой код.
  24. Не используйте транслит, пишите все либо по-русски в читабельной в компьютерном классе кодировке, либо по-английски. Например, vstavka() - неудачное название для функции, реализующей алгоритм сортировки вставками.
  25. Если вы выделяете системные ресурсы (файловые дескрипторы, etc), то вы обязательно должны их освободить, как только в них отпадает нужда.
  26. Каждый вывод данных на экран должен сопровождаться сообщением с пояснением того, что именно выводится. Вообще, пользовательский интерфейс должен быть понятен человеку, ни разу не видевшему программу
  27. Каждый ввод пользовательских данных должен сопровождаться приглашением к вводу, объясняющим пользователю, ввод данных какого рода и в каком объеме от него ожидается.
Document Actions