Sto scrivendo un wrapper per un'API REST e mi sono imbattuto in qualcosa che non avevo mai dovuto chiedermi prima.
Questa API è per le transazioni E-Commerce, ha endpoint SALE e RETURN (e alcuni altri endpoint che non sono fondamentali per questa discussione).
Le richieste SALE e RETURN sono quasi identiche, con l'eccezione che la richiesta SALE ha una proprietà aggiuntiva.
public class ReturnRequest
{
[JsonProperty("cashier_id")]
public string CashierId { get; set; }
[JsonProperty("amount")]
public decimal Amount { get; set; }
[JsonProperty("pos_id")]
public CustomClass PosId { get; set; }
}
public class SaleRequest
{
[JsonProperty("cashier_id")]
public string CashierId { get; set; }
[JsonProperty("amount")]
public decimal Amount { get; set; }
[JsonProperty("pos_id")]
public CustomClass PosId { get; set; }
[JsonProperty("zip_code")]
public string ZipCode { get; set; }
}
Originariamente avevo appena ricevuto la richiesta di vendita POCO che eredita la richiesta di ritorno POCO:
public class ReturnRequest
{
[JsonProperty("cashier_id")]
public string CashierId { get; set; }
[JsonProperty("amount")]
public decimal Amount { get; set; }
[JsonProperty("pos_id")]
public CustomClass PosId { get; set; }
}
public class SaleRequest : ReturnRequest
{
[JsonProperty("zip_code")]
public string ZipCode { get; set; }
}
Ma a me non sembra molto intuitivo o chiaro (SALE e RITORNO sono cose diverse, perché ne erediterebbe un altro?)
Ho quindi deciso di inserire le proprietà comuni in una classe astratta di base:
public abstract class BaseRequest
{
[JsonProperty("cashier_id")]
public string CashierId { get; set; }
[JsonProperty("amount")]
public decimal Amount { get; set; }
[JsonProperty("pos_id")]
public CustomClass PosId { get; set; }
}
public class ReturnRequest : BaseRequest
{
}
public class SaleRequest : BaseRequest
{
[JsonProperty("zip_code")]
public string ZipCode { get; set; }
}
Ma poi questo mi lascia con una classe che è essenzialmente la stessa cosa di BaseRequest.
All'inizio ho giustificato questo perché volevo che le classi fossero semplici e dettagliate. Crea una chiara differenza tra le classi e posso modificare SALE o RETURN senza preoccuparmi dell'altro (o anche delle classi base).
Tuttavia ora mi chiedo se sto pensando a questo torto, che sia essenzialmente una classe vuota una cattiva idea?
EDIT: ho modificato i nomi delle proprietà e digitato un po 'per rappresentare più da vicino alcuni tipi di proprietà.