Confuso sull'implementazione del Principio di Responsabilità Unica

1

Per favore portami se la domanda non è ben strutturata.

Per metterti nel contesto del mio problema:

Sto costruendo un'applicazione che fa fatturare ai veicoli la durata in un parcheggio. Oltre al servizio di soggiorno ci sono altri servizi. Ogni servizio ha una propria logica di calcolo.

Ecco un'illustrazione (correggimi se il disegno è sbagliato):

public abstract class Service
{
   public int Id { get; set; }
   public bool IsActivated { get; set; }
   public string Name { get; set }
   public decimal Price { get; set; }
}

public class VehicleService : Service
{   
   //MTM : many to many
   public virtual ICollection<MTMVehicleService> Vehicles { get; set; }
}

public class StayService : VehicleService
{

}

public class Vehicle
{
   public int Id { get; set; }
   public string ChassisNumber { get; set; }
   public DateTime? EntryDate { get; set; }
   public DateTime? DeliveryDate { get; set; }
   //...
   public virtual ICollection<MTMVehicleService> Services{ get; set; }
}

Ora, mi sto concentrando sul servizio di soggiorno come esempio:
Vorrei sapere al momento della fatturazione quale classe (i) sarebbe responsabile della generazione della fattura per il servizio e per ciascun veicolo? Questo dovrebbe calcolare il costo della durata sapendo che la durata potrebbe essere fatturata parzialmente, quindi la regola è la seguente: non ancora giorni di soggiorno fatturati * soggiorno prezzo al giorno.

In questo momento InvoiceItemsGenerator fa tutto ma sono consapevole che esiste un design migliore.

    
posta HichemSeeSharp 30.05.2014 - 16:56
fonte

1 risposta

1

I would like to know at invoicing time which class(es) would be responsible for generating the invoice item for the service and for each vehicle?

Sembra abbastanza ovvio che sarebbe la responsabilità della tua classe InvoiceItemsGenerator .

Il tuo problema è con la tua implementazione di InvoiceItemsGenerator , che tu dici contiene in bundle all'interno di essa tutta la logica di business per i vari tipi di attività e le loro fatture corrispondenti, ecc.

Forse provare a estirpare attraverso quella logica aziendale e scomporla in classi discrete che rappresentano i diversi tipi di logica e applicarla - forse una gerarchia di classi con un metodo di fabbrica - può essere utilizzata da InvoiceItemsGenerator e con ulteriori refactoring , forse anche da altre classi.

Molto semplificato e non compilabile:

class BaseServiceInvoiceProcessor
{
  Invoice generateInvoice(){...}
};

class VehicleServiceInvoiceProcessor:BaseServiceInvoiceProcessor{...}
class StayServiceInvoiceProcessor:BaseServiceInvoiceProcessor{...}

BaseServiceInvoiceProcessor getInvoiceProcessor(enumServiceTypes serviceType){...}

InvoiceItemsGenerator
  {
    ...
   Invoice GetInvoiceByServiceType(enumServiceTypes serviceType)
    {
       BaseServiceInvoiceProcessor iProc= getInvoiceProcessor(serviceType);
       return iProc.generateInvoice()
    } 

   };    

ecc.

    
risposta data 31.05.2014 - 03:36
fonte