Чистый код. Создание, анализ и рефакторинг (Мартин) - страница 68

>    getPreferences().load(is);

>  } catch (IOException e) {

>    try {

>      if (is != null)

>        is.close();

>      } catch (IOException e1) {

>    }

>  }

>}

Управляющие переменные циклов обычно объявляются внутри конструкции цикла, как в следующей симпатичной маленькой функции из того же источника.

>public int countTestCases() {

>  int count= 0;

>  for (Test each : tests)

>    count += each.countTestCases();

>  return count;

>}

В отдельных случаях переменная может объявляться в начале блока или непосредственно перед циклом в длинной функции. Пример такого объявления представлен в следующем фрагменте очень длинной функции из TestNG.

>...

>for (XmlTest test : m_suite.getTests()) {

>      TestRunner tr = m_runnerFactory.newTestRunner(this, test);

>      tr.addListener(m_textReporter);

>      m_testRunners.add(tr);


>      invoker = tr.getInvoker();


>      for (ITestNGMethod m : tr.getBeforeSuiteMethods()) {

>        beforeSuiteMethods.put(m.getMethod(), m);

>      }


>      for (ITestNGMethod m : tr.getAfterSuiteMethods()) {

>        afterSuiteMethods.put(m.getMethod(), m);

>      }

>    }

>...

Переменные экземпляров, напротив, должны объявляться в начале класса. Это не увеличивает вертикальное расстояние между переменными, потому что в хорошо спроектированном классе они используются многими, если не всеми, методами класса.

Размещение переменных экземпляров становилось причиной ожесточенных споров. В C++ обычно применялось так называемое правило ножниц, при котором все переменные экземпляров размещаются внизу. С другой стороны, в Java они обычно размещаются в начале класса. Я не вижу причин для использования каких-либо других конвенций. Здесь важно то, что переменные экземпляров должны объявляться в одном хорошо известном месте. Все должны знать, где следует искать объявления.

Для примера рассмотрим странный класс TestSuite из JUnit 4.3.1. Я основательно сократил этот класс, чтобы лучше выразить свою мысль. Где-то в середине листинга вдруг обнаруживаются объявления двух переменных экземпляров. Если бы автор сознательно хотел спрятать их, трудно найти более подходящее место. Читатель кода может наткнуться на эти объявления только случайно (как я).

>public class TestSuite implements Test {

>  static public Test createTest(Class theClass,

>                                String name) {

>     ...

>  }

>  public static Constructor

>    getTestConstructor(Class theClass)

>    throws NoSuchMethodException {

>  ...

>  }

>  public static Test warning(final String message) {

>  ...

>  }

>  private static String exceptionToString(Throwable t) {