Какие принципы и практики применяются при разработке нового поддерживаемого кода?

«Какие принципы и практики применяются при разработке нового поддерживаемого кода?» — вопрос из категории Софт-скиллы, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Разработка нового кода с расчетом на долгосрочную поддержку строится на комбинации принципов проектирования, стандартов кода и инженерных практик.

1. Принципы проектирования (SOLID, DRY, YAGNI):

// Пример соблюдения SRP (Single Responsibility) и Dependency Injection
@Service
public class OrderService {
    private final PaymentProcessor paymentProcessor; // Зависимость через интерфейс
    private final NotificationService notificationService;

    // Внедрение зависимостей через конструктор
    public OrderService(PaymentProcessor processor, NotificationService notifier) {
        this.paymentProcessor = processor;
        this.notificationService = notifier;
    }

    public OrderResult placeOrder(OrderRequest request) {
        // Каждый сервис отвечает за одну зону ответственности
        validate(request);
        PaymentReceipt receipt = paymentProcessor.charge(request);
        notificationService.sendOrderConfirmation(request.getUserEmail(), receipt);
        return new OrderResult(receipt);
    }
}

2. Инженерные практики:

  • Test-Driven Development (TDD): Сначала пишется падающий тест, затем — минимальная реализация, потом рефакторинг.
  • Покрытие unit-тестами: Использование JUnit 5, Mockito для изоляции тестируемого модуля.

    @Test
    void placeOrder_ShouldChargePaymentAndSendNotification() {
    // Arrange
    PaymentProcessor mockProcessor = mock(PaymentProcessor.class);
    NotificationService mockNotifier = mock(NotificationService.class);
    OrderService service = new OrderService(mockProcessor, mockNotifier);
    OrderRequest testRequest = new OrderRequest("test@mail.com", 100.0);
    
    when(mockProcessor.charge(testRequest)).thenReturn(new PaymentReceipt("123"));
    
    // Act
    OrderResult result = service.placeOrder(testRequest);
    
    // Assert
    verify(mockProcessor).charge(testRequest);
    verify(mockNotifier).sendOrderConfirmation("test@mail.com", any());
    assertThat(result.getReceiptId()).isEqualTo("123");
    }
  • Согласованный стиль кода: Следование правилам именования, форматирования (используя Checkstyle, Spotless).
  • Ревью кода: Обязательный peer review перед мержем для обмена знаниями и контроля качества.