Davranış Odaklı Yazılım Geliştirme ve Data Abstraction Üzerine

Davranış Odaklı Yazılım Geliştirme ve Data Abstraction Üzerine

Örneğin aşağıdaki gibi bir servisimiz olduğunu düşünelim. Invoice entity’sinin “status” adında bir field’i var. Bu status bilgisine göre Invoice onaylı ya da iptal edilmiş duruma geçebiliyor. Kaydın durumunun onaylı/iptal olması son durum olarak kabul ediliyor. Bu şekilde ya da buna benzer kullanımlarda, bu servis içerisinde çeşitli durumlara göre yapılacak işlemler bu servisin soyutlaması gereken iş kurallarını bu metodu çağıran yerlere taşımaya sebep olmakta.

  private Address shipmentAddress;
  private Status status;
  public enum Status{ NEW, APPROVED, CANCELED}
}
@Service
public class InvoiceService {
  private final InvoiceRepository repository;
  public Invoice update(Invoice invoice){
    return repository.save(invoice);  
  }
  ...create
  ...delete
  ...get
}
Davranış odaklı yazılım geliştirme
@Service
public class InvoiceService {
private final InvoiceRepository repository;
public Invoice approveInvoice(final String invoiceId){
    ....business validations
    invoice.setStatus(APPROVED);
    return repository.save(invoice);  
  }
}
Data abstraction / Encapsulation
@Builder
public class InvoiceWriteDTO {
  private final String customerId;  
  private final String shipmentAddressId;
}

public class InvoiceReadDTO extends InvoiceWriteDTO {
  private String id;
  private String customerNameTitle;
  private String shipmentAddressId;
  private Status status;
}
@Service
public class InvoiceService {
private final InvoiceRepository repository;
public InvoiceReadDTO createANewInvoice(final InvoiceWriteDTO invoice){
    ....business validations
    final var invoice = new Invoice();
    invoice.setStatus(APPROVED);
    invoice.set...
    return mapToReadDTO(repository.save(invoice));  
  }
}
Side Effect / Immutability / Functional programming
@Service
public class InvoiceService {
private final InvoiceRepository repository;
public InvoiceReadDTO createANewInvoice(final InvoiceWriteDTO invoice){
    ....business validations
    final var invoice = new Invoice();
    invoice.setStatus(APPROVED);
    invoice.set...
    invoiceDetailService.caculateTotalAmount(invoide);
    return mapToReadDTO(repository.save(invoice));  
  }
}
@Service
public class InvoiceDetailService {
  public void calculateTotalAmount(Invoice invoice){
    invoice.setStatus(NEW)
  }
}

Yukarıda “invoiceDetailService.calculateTotalAmount” metodu içerisindeki status değişikliği bir side effect oluşturur ve davranışı manipüle eder. Mutable objeler ile yapılan işlemlerde bu tarz problemlerin oluşmamasına dikkat edilmelidir. Bu problemi aşağıdaki gibi çözebiliriz;

@Service
public class InvoiceDetailService {
  public BigDecimal calculateTotalAmount(Invoice invoice){
   ... 
   return totalAmount;  
  }
}
Sonuç olarak;

Dilaver DEMİREL

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir