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

>  }


>  public static double root2(int a, int b, int c) {

>    double determinant = determinant(a, b, c);

>    return (-b - Math.sqrt(determinant)) / (2*a);

>  }


>  private static double determinant(double a, double b, double c) {

>    return b*b - 4*a*c;

>  }

>}

Обратите внимание, как хорошо читаются формулы. Между множителями нет пробелов, потому что они обладают высоким приоритетом. Слагаемые разделяются пробелами, так как сложение и вычитание имеют более низкий приоритет.

К сожалению, в большинстве программ форматирования кода приоритет операторов не учитывается, и во всех случаях применяются одинаковые пропуски. Нетривиальные изменения расстояний, как в приведенном примере, теряются после переформатирования кода.

Горизонтальное выравнивание

Когда я был ассемблерным программистом[23], горизонтальное выравнивание использовалось для визуального выделения некоторых структур. Когда я перешел на C, C++, а в конце концов и на Java, я продолжал выравнивать все имена переменных в группах объявлений или все правосторонние значения в группах команд присваивания. Мой код выглядел примерно так:

>public class FitNesseExpediter implements ResponseSender

>{

>  private   Socket          socket;

>  private   InputStream     input;

>  private   OutputStream    output;

>  private   Request         request;

>  private   Response        response;

>  private   FitNesseContext context;

>  protected long            requestParsingTimeLimit;

>  private   long            requestProgress;

>  private   long            requestParsingDeadline;

>  private   boolean         hasError;


>  public FitNesseExpediter(Socket s,

>                           FitNesseContext context) throws Exception

>  {

>    this.context =            context;

>    socket =                  s;

>    input =                   s.getInputStream();

>    output =                  s.getOutputStream();

>    requestParsingTimeLimit = 10000;

>  }

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

Поэтому в итоге я отказался от этого стиля форматирования. Сейчас я отдаю предпочтение невыровненным объявлениям и присваиваниям, как в следующем фрагменте, потому что они помогают выявить один важный дефект. Если в программе встречаются длинные списки, нуждающиеся в выравнивании, то проблема кроется в длине списка, а не в отсутствии выравнивания. Длина списков объявлений в классе FitNesseExpediter наводит на мысль, что этот класс необходимо разделить.