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

>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;

>  }

Отступы

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

Чтобы создать наглядное представление этой иерархии, мы снабжаем строки исходного кода отступами, размер которых соответствует их позиции в иерархии. Команды уровня файла (такие, как большинство объявлений классов) отступов не имеют. Методы в классах сдвигаются на один уровень вправо от уровня класса. Реализации этих методов сдвигаются на один уровень вправо от объявления класса. Реализации блоков сдвигаются на один уровень вправо от своих внишних блоков и т.д.

Программисты широко используют эту схему расстановки отступов в своей работе. Чтобы определить, к какой области видимости принадлежат строки кода, они визуально группируют строки по левому краю. Это позволяет им быстро пропускать области видимости, не относящиеся к текущей ситуации (например, реализации команд if и while). У левого края ищутся объявления новых методов, новые переменные и даже новые классы. Без отступов программа становится практически нечитаемой для людей. Следующие программы идентичны с синтаксической и семантической точки зрения:

>public class FitNesseServer implements SocketServer { private FitNesseContext

>context; public FitNesseServer(FitNesseContext context) { this.context =

>context; } public void serve(Socket s) { serve(s, 10000); } public void

>serve(Socket s, long requestTimeout) { try { FitNesseExpediter sender = new

>FitNesseExpediter(s, context);

>sender.setRequestParsingTimeLimit(requestTimeout); sender.start(); }

>catch(Exception e) { e.printStackTrace(); } } }


>-----


>public class FitNesseServer implements SocketServer {

>  private FitNesseContext context;