Если вы хотите, чтобы ваш код был более разборчивым или чтобы ваши пулл-реквесты быстро утверждались, отформатируйте код!

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

Хороший разработчик должен ценить формат кода не меньше, чем бизнес-логику.

Форматирование кода — это все, что касается коммуникации, хорошо отформатированный код передаст мысли разработчика другим.

Я приведу несколько примеров, и, надеюсь, это даст вам представление о том, как форматировать код, и понять, насколько это важно.

  • Объявления переменных в функциях должны быть максимально приближены к их использованию, объявить переменную и использовать ее непосредственно в следующей строке кода.
public long getLikesCount(Tweet tweet) {
    TweetMetrics tweetMetrics = getTweetMetrics(tweet);
    long count = 0;
    if (tweetMetrics != null) {
        count = tweetMetrics.getLikes();
    }
    
    return count;
}
  • Объявления переменных экземпляра должны находиться в одном месте и предпочтительно в верхней части класса или, по крайней мере, в нижней части.
class UploadService {
    public String webUrl;
    
    public UploadService(String webUrl) {
        this.webUrl = webUrl;
    }
}
  • Кроме того, объявления статических переменных должны появляться вверху или внизу класса.
class AppConstants {
    public final static String CLIENT_ID = "XXXXXX";
    public final static String CLIENT_SECRET= "YYYYYY";
}
  • Зависимые функции должны быть близко друг к другу по вертикали, вызывающая функция должна быть выше вызываемой функции, где это возможно.
public void sendWeeklyNewsletter(NewsLetterMessageRequest request) {
 
   List<Recipient> recipients = fetchRecipientsForNewsLetter(request.getNewsLetterId());
   Message message = prepareNewsLetterMessage(request);
   EmailContent content = EmailContent.builder.
       .message(message)
       .recipients(recipients)
       .build();
   
   sendEmail(content);
}
public List<Recipient> fetchRecipientsForNewsLetter(String newsLetterId) {
}
public Message prepareNewsLetterMessage(NewsLetterMessageRequest request) {
}
public void sendEmail(EmailContent content) {
}
  • Вертикальное форматирование: длина файла в строках должна быть около 200–500 строк, это, конечно, не обязательно, но по возможности необходимо соблюдать.
  • Вертикальная открытость. Функции должны быть разделены пустыми строками, а также строки кода, которые различаются по функциональности, должны быть разделены пустыми строками (открытость разделяет понятия).
public User registerNewUser(String email) {
    User existing = fetchUserByEmail(email);
    if (existing != null) {
        throw new DuplicateUserRegistration();
    }
    
    User user = User.builder()
        .email(email)
        .activationToken(*****)
        .createdDate(new Date())
        .build();
    return userRepository.save(user);
}
public User activateUser(String activationToken) {
    User user = fetchUserByActivationToken(activationToken);
    if (user == null) {
        throw new UserNotFoundException();
    }
    user.setActivated(true);
    user.setModifiedDate(new Date());
    
    userRepository.save(user);
}
  • Горизонтальное форматирование. Длина строки не должна превышать 100–120 символов и 200 символов. Большинство приложений Integrated Development Environment (IDE) позволяют пользователю определять максимальную длину строки.
  • Горизонтальная открытость и плотность. Используйте горизонтальное пустое пространство, чтобы ассоциировать сильно связанные вещи и разъединять слабо связанные.
private void measureLine(String line) {
  lineCount++;
  int lineSize = line.length();
  totalChars += lineSize();
  lineWidthHistogram.addLine(lineSize, lineCount);
  recordWidestLine(lineSize);
}
  • Отступ должен показывать разные уровни иерархии в файле. Не нарушайте правило отступа, даже в случае коротких операторов if или функций.
// bad practice
public void isTopPriority(Ticket ticket) {
return ticket.equals(PRIORITY.HIGHT);
}
// good practice
public void isTopPriority(Ticket ticket) {
    return ticket.equals(PRIORITY.HIGHT);
}
// bad practice
public void allowUserToRead(Story story, User user) {
if (user.isSubscribed) return true;
if (limit <= FREE_LIMIT) return true;
return false; 
}
// good practice
public void allowUserToRead(Story story, User user) {
    if (user.isSubscribed || user.reads < FREE_LIMIT) {
        return true;
    }
    return false;
}

Надеюсь, эта история поможет вам понять форматирование кода и его важность.

Увидимся в моей следующей статье Важность комментариев в коде. Спасибо 😎