Ci sono diverse opzioni qui per affrontare la situazione:
Supponiamo di avere un prodotto con i seguenti attributi:
- nome
- Descrizione
- id
- color
- size
- di peso
- prezzo
- categorie
- brand_id
- Codice
0) impostandoli tramite gli argomenti del costruttore
Indipendentemente da ciò che si potrebbe dire sul numero di argomenti per un costruttore, qui il caso è chiaro: abbiamo un oggetto dati con i suoi attributi e dobbiamo affrontarlo. Quindi usare 10 argomenti in un costruttore è assolutamente soddisfacente.
1) alcune lingue consentono oltre ai tipici parametri posizionali parametri denominati . Quindi in Python, potresti scrivere Product(name="A shirt", color="red" ...)
che si traduce in un costruttore leggibile. E con indentazione non sembra troppo travolgente:
Product(name="A shirt",
description="A cool shirt",
id=1,
color="red",
size="XXL",
weight=200,
price="1000",
categories=["shirt","clothes", "male"],
brand_id="0987654321",
sku="1234567890"
)
2) Uso di Dictionary
/ Associative array
/ HashMap
Si prelavella un dizionario con coppie chiave-valore come product["name"]="A shirt"
e quando si inizializza l'istanza, si passa il dizionario al costruttore. Quindi è chiaro come viene impostato ciascun attributo. Il problema di ottenere gli argomenti posizionali nell'ordine corretto viene aggirato.
Possibile svantaggio:
Quando al tuo dizionario mancano informazioni importanti, l'errore verrà generato durante il runtime, che potrebbe essere tardivo. Se stai usando un linguaggio tipizzato staticamente, questo tipo di errore potrebbe essere omesso, se hai usato il sistema di tipi invece del costrutto del dizionario debole.
3) utilizzando un'interfaccia fluente insieme a modello di builder
Riceverai qualcosa del tipo:
Product(sku)
.name("A Name")
.description("Desc")
...
.build();
Specialmente, quando non tutti gli attributi sono necessari al momento della creazione, potresti avere gli attributi necessari impostati tramite gli argomenti del costruttore e quelli opzionali tramite interfacce fluenti.
4) A volte è possibile avere gruppi semantici:
Supponiamo che tu stia memorizzando i dati dei clienti, potresti avere una sottoclasse address
, che verrebbe incapsulata ( street
, zip
, city
) o contactinformation
( phone
, mail
) che aiutano spezzando il costruttore a parte: Person(firstname, lastname, address, contactinformation)
è più leggibile di Person(firstname, lastname, street, zip, city, phone, mail)
e a causa di parametri minori, anche se si è vincolati a parametri posizionali più facile ottenere l'ordine giusto.
Ma con attributi di prodotto come sopra, devo ammettere che è difficile trovare un gruppo.
Ai tuoi punti:
In this case, do you prefer to define all string attributes one by one in one under another format or a string array with seven elements ?
Preferisco avere nomi significativi per i parametri. Oltre a ottenere la posizione sbagliata, non sai nemmeno quale posizione nell'array è cosa.
I think taking 10 different attributes with constructor and assigning them into the attributes one by one seem very bad
Non di per sé. Ma se ci sono altre possibilità, potresti volerle usare.
we can perform assign operation with only one for loop, which seems more readable.
Dal punto di vista di "cosa sta succedendo" non si ha troppa ridondanza in corso e il codice risultante potrebbe essere più breve. Concordato. Ma come ho detto, se qualcuno (o forse tu in un anno) ha a che fare con questo codice, si deve investire del tempo per colmare le lacune. E più il tuo codice è ridondante, meno devi compilare, più è facile, lavorare con questo codice.