Bene, penso che si riduca alla differenza tra buono e abbastanza buono .
Mentre nella maggior parte dei casi è possibile evitare l'uso di costanti implementando altri modelli (strategia o forse peso mosca), c'è qualcosa da dire per non aver bisogno di una mezza dozzina di altre classi per rappresentare un concetto. Penso che ciò a cui si riduce è quanto sia probabile che siano necessarie altre costanti. In altre parole, è necessario estendere l'ENUM fornito dalle costanti sull'interfaccia. Se puoi prevedere la necessità di espanderlo, scegli uno schema più formale. In caso contrario, potrebbe essere sufficiente (sarà abbastanza buono e quindi ci sarà meno codice da scrivere e testare). Ecco un esempio di abbastanza buono e cattivo uso:
Male:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
Abbastanza buono:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
Ora, il motivo per cui ho scelto questi esempi è semplice. L' User
interfaccia definisce un'enumerazione dei tipi di utente. È molto probabile che si espanda nel tempo e sarebbe più adatto a un altro modello. Ma HTTPRequest_1_1
è un caso d'uso decente, poiché l'enum è definito da RFC2616 e non cambierà per tutta la durata della classe.
In generale, non vedo il problema con le costanti e le costanti di classe come un problema globale . Lo vedo come un problema di dipendenza. È una distinzione stretta, ma definita. Vedo i problemi globali come in variabili globali che non vengono applicate, e come tali creano una dipendenza globale morbida. Ma una classe hardcoded crea una dipendenza forzata e come tale crea una dipendenza globale hard. Quindi entrambe sono dipendenze. Ma considero il globale di gran lunga peggiore poiché non è applicato ... motivo per cui non mi piace raggruppare le dipendenze di classe con le dipendenze globali sotto lo stesso banner ...
Se scrivi MyClass::FOO
, sei hard-coded per i dettagli di implementazione di MyClass
. Questo crea un hard-coupling, che rende il codice meno flessibile e come tale dovrebbe essere evitato. Tuttavia, esistono interfacce per consentire esattamente questo tipo di accoppiamento. Pertanto MyInterface::FOO
non presenta alcun accoppiamento concreto. Detto questo, non introdurrei un'interfaccia solo per aggiungere una costante ad essa.
Quindi, se stai usando interfacce e sei molto sicuro che tu (o chiunque altro per quella materia) non avrai bisogno di valori aggiuntivi, allora non vedo davvero un grosso problema con le costanti dell'interfaccia ... i progetti non includevano costanti o condizionali o numeri magici o stringhe magiche o qualcosa di hard-coded. Tuttavia, ciò aggiunge ulteriore tempo allo sviluppo, poiché è necessario considerare gli usi. La mia opinione è che la maggior parte delle volte vale assolutamente la pena dedicare del tempo aggiuntivo per costruire un ottimo design solido. Ma ci sono momenti in cui abbastanza buono è davvero accettabile (e ci vuole uno sviluppatore esperto per capire la differenza), e in quei casi va bene.
Di nuovo, questa è solo la mia opinione al riguardo ...