> }
> 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 наводит на мысль, что этот класс необходимо разделить.