Ho una relazione semplice in cui gli articoli di livello superiore ( Recipe
) hanno una relazione uno-a-molti con i bambini ( Ingredient
) e ogni elemento ha un identificativo univoco ( ID
).
Per le semplici operazioni CRUD il flusso è:
RecipeService -> RecipeManager -> Recipe
IngredientService -> IngredientManager -> Ingredient
Faccio fatica con due decisioni primarie durante la progettazione delle classi di servizio / gestore:
Primo: Modelli vs. Primitivi
Fornite valori primitivi, o oggetti modello, durante l'inserimento di un articolo che influenza una relazione? Ad esempio:
class IngredientService {
func addIngredientToRecipe(ID recipeID, String ingredientName, int ingredientAmount)
}
Versus:
class IngredientService {
func addIngredientToRecipe(Ingredient i, Recipe toRecipe)
}
Il primo richiede un elenco sempre crescente di argomenti, ma gestisce internamente le ricerche e la convalida (esiste la ricetta, come otteniamo, ecc.)
Il secondo è più pulito, ma richiede che i chiamanti abbiano già cercato una ricetta e creato un ingrediente.
C'è anche la permutazione:
class IngredientService {
func addIngredientToRecipe(ID recipeID, Ingredient ingredient)
}
Secondo: Service vs. Manager per un tipo ancillare
I servizi possono dipendere l'uno dall'altro o dovrebbero immergersi direttamente nei manager? Diciamo che implementiamo:
func addIngredientToRecipe(ID recipeID, String ingredientName, int ingredientAmount) {
...
}
Quando cerchi la ricetta esistente, dovremmo usare RecipeService
o RecipeManager
? È sicuro che entrambi avranno una ricerca basata su ID, anche se il servizio semplicemente ombreggia / inoltra al gestore.
Questi tipi di decisioni iniziali sono importanti per stabilire buoni modelli e stili, ma faccio fatica a identificare se ci sono insidie in un modo o nell'altro.