Nel codice, la denominazione delle variabili dovrebbe esprimere ciò che stai cercando di fare. Nel contesto dell'utilizzo di tre linee per verificare se creano un triangolo, lo si vorrebbe trasmettere nella denominazione delle variabili.
Le opzioni 1 e 2 sono esattamente le stesse, trasmettono la stessa cosa. Li chiamerei lineLengthA
, lineLengthB
, lineLengthC
, perché:
-
len
è ambiguo
- non stiamo parlando solo di lunghezze arbitrarie
- stiamo comunicando stiamo parlando di costrutti geometrici, in questo caso segmenti di linea
- sostituendo 1,2,3 con A, B, C convogliamo che non ci interessa l'ordine dei parametri.
- i nomi di auto-documentazione, la gente saprà immediatamente cosa rappresentano questi parametri.
In alternativa puoi chiamare questi lineSegmentLengthX
, segmentLengthX
o edgeLengthX
per ragioni simili.
Questo sembra così:
...
public boolean canCreateValidTriangle(float lineLengthA, float lineLengthB, float lineLengthC){
...
}
...
Come per l'opzione del terzo array, questa opzione è preferibile se si ha una lingua in cui è possibile definire i tipi di array a dimensione fissa (come C ++ con std::array<type, size>
), tuttavia non sono consapevole che una tale funzione sia possibile in java, come primitiva i tipi generici non esistono nella lingua AFAIK. Senza questa funzionalità, l'utente del tuo programma non sa come passare correttamente un array alla funzione senza una congettura istruita, guardando all'implementazione o commentando effettivamente che questo è il modo in cui la funzione deve essere utilizzata (che potrebbe cambiare) .
Quindi per java, non avrei passato un array di 3 elementi, a meno che non lo avessi avvolto in un'altra classe (diciamo, " ThreeElementArray<T>
"), che solleva altri problemi.
Altre persone hanno suggerito di inserire i tre parametri nella propria classe. Secondo me questo non è un buon modo per fare le cose in questo caso. Se crei una classe POD solo per questa istanza probabilmente non sarai in grado di trovare abbastanza metodi da creare per giustificare la sua esistenza oltre a essere una classe di dati . Quando si crea una classe dati, si finisce per scrivere codice procedurale e non si ottiene alcun beneficio dall'astrazione.
Con un ThreeElementArray<T>
potresti essere ingannato nel pensare di non avere una classe Data dato che probabilmente fornirai metodi per l'indicizzazione e le normali operazioni di lunghezza e array, ma quello che stai facendo è solo delegare la stessa funzionalità che esiste già nell'oggetto di matrice incapsulato che contiene per fare la stessa cosa ma direttamente sulla classe come una chiamata di funzione. Non è diverso dal fare Myclass.mymember.mymemberfunction();
. Questo non vuol dire che non dovrebbe fare questo durante la creazione di una classe, ma che dovresti avere altre funzioni che giustificano l'esistenza della classe in primo luogo.
Altri hanno suggerito di usare una "classe Triangolo", ovviamente una classe triangolo avrà funzioni che esulano dall'ambito di un array di tre elementi, quindi è giusto? Il problema con questo metodo è il passaggio di lunghezze della linea non un triangolo . Stai testando se quelle lunghezze di linea potrebbero essere un triangolo, il fatto di passare in un triangolo non ha già senso. Quelle linee non possono formare un triangolo valido e quindi il tuo oggetto triangolo non dovrebbe esistere. Se stai semplicemente usando la classe triangolo per contenere quelle lunghezze di linea che sono estremamente fuorvianti, stai dicendo al programmatore "questo è un triangolo" quando chiaramente non lo è, e potrebbe anche non formarne uno valido. Passare come un triangolo ti impedisce anche di essere in grado di passare a lunghezze di linea arbitrarie, e ricorda, non ci interessa l'ordine delle lunghezze delle linee o da dove provengono.