Quali sono i pro e i contro di avere un tipo CaseInsensitiveString in Java? [chiuso]

8

Sono tentato di creare un final class CaseInsensitiveString implements CharSequence .

Questo ci permetterebbe di definire variabili e campi di questo tipo, invece di usare un normale String . Possiamo anche avere ad es. a Map<CaseInsensitiveString, ?> , a Set<CaseInsensitiveString> , ecc.

Quali sono alcuni dei pro e contro di questo approccio?

    
posta polygenelubricants 06.07.2011 - 07:31
fonte

6 risposte

26

L'insensibilità alle maiuscole / minuscole è una proprietà del confronto, non dell'oggetto (*). Ti consigliamo di confrontare la stessa stringa indipendentemente dal caso o meno a seconda del contesto.

(E tu hai un intero tipo di vermi come quello che è un confronto tra maiuscole e minuscole dipende dalla lingua - io è superiore come İ in turco - e anche il contesto - a seconda della parola e del dialetto ß can essere uppercased come SS o SZ in tedesco.)

(*) Può essere una proprietà dell'oggetto contenente la stringa, ma in qualche modo è diversa dall'essere una proprietà della stringa stessa. E puoi avere una classe che non ha uno stato eccetto una stringa, e confrontando due istanze di quella classe userai un confronto senza distinzione tra maiuscole e minuscole della stringa. Ma quella classe non sarà una stringa di uso generale in quanto non fornirà i metodi previsti per le stringhe di uso generale e fornirà metodi che non lo sono. Questa classe non si chiamerà CaseInsensitiveString ma PascalIdentifier o qualunque cosa sia pertinente per descriverlo. E BTW, l'algoritmo di confronto indipendente dal caso verrà probabilmente fornito dal suo scopo e sarà indipendente dalla localizzazione.

    
risposta data 06.07.2011 - 08:47
fonte
7

Appena in cima alla mia testa:

Pro:

  • Rende un sacco di codice auto-documentante, ad esempio:
    • bool UserIsRegistered(CaseInsensitiveString Username)
  • Può semplificare i confronti
  • Può rimuovere il potenziale per i bug di confronto

Contro:

  • Potrebbe essere una perdita di tempo
    • le persone possono semplicemente convertire le stringhe normali in lettere minuscole se hanno bisogno di confronti senza distinzione tra maiuscole e minuscole
  • Usarlo per il codice front-end causerà problemi di capitalizzazione
    • Ad esempio, se si utilizza CaseInsensitiveString per memorizzare un nome utente, anche se ha senso avere confronti back-end insensibili alle maiuscole e minuscole, il codice di front-end mostrerà il nome dell'utente come "bob smith" o "BOB SMITH "
  • Se il tuo codice base utilizza già stringhe regolari, dovrai tornare indietro e modificarle o vivere con incoerenza
risposta data 06.07.2011 - 07:48
fonte
4

CaseInsensitiveString non è una cattiva idea, dipende dal tuo utilizzo, a patto che non ti aspetti che funzioni insieme a String.

Puoi convertire CaseInsensitiveString in String, o viceversa, e questo è tutto ciò che dovresti fare.

Il problema si verificherà se proverai a fare qualcosa di simile

class CaseInsensitiveString {
  private String value;

  public boolean equals(Object o) {
    // .....
    if (o instanceof String) {
      return value.equalsIgnoreCase((String) o);
    }
  }
}

Sei destinato a fallire se intendi rendere CaseInsensitiveString aziendale con String normale, perché violerai simmetria e transitive per equals () (e altri contratti)

Tuttavia, chiediti a te stesso, in tal caso hai davvero bisogno di questo CaseInsensitiveString che non è adatto per utilizzare String.CASE_INSENSITIVE_ORDER? Scommetto che non molti casi. Sono certo che ci sarà un caso che merita di avere questa classe speciale, ma prima chiediti.

    
risposta data 11.07.2011 - 09:52
fonte
2

La creazione esplicita di tipi nel tuo dominio / modello è un'ottima pratica. Come ha detto Maxpm, è autodidatta. Un altro grande vantaggio: le persone non possono (per caso) utilizzare un input sbagliato. L'unica cosa negativa sarebbe che spaventerebbe i programmatori junior (e anche alcuni mediori).

    
risposta data 11.07.2011 - 08:38
fonte
1

Una classe CaseInsensitiveString e i suoi aiutanti aggiungono un sacco di codice e renderanno tutto meno leggibile rispetto al metodo String.toLoweCase ().

CaseInsensitiveString vaName1 = new CaseInsensitiveString('HeLLo');
//... a lot of lines here
CaseInsensitiveString vaName2 = new CaseInsensitiveString('Hello');
//... a lot of lines here
if (varName1.equals(varName2)) ...

è più complesso, meno auto-documentante e meno flessibile di

String vaName1 = 'HeLLo';
//... a lot of lines here
String vaName2 = 'Hello';
//... a lot of lines here
if (varName1.toLowerCase().equals(varName2.toLowerCase())) ...
    
risposta data 12.07.2011 - 00:56
fonte
0

Le implementazioni più utilizzate sul web sono case sensitive: XML, JavaScript. In termini di prestazioni, è sempre meglio utilizzare la funzione / proprietà / oggetto più appropriata per ciascun caso.

Se hai a che fare con strutture - XML o JS o simili, la distinzione tra maiuscole e minuscole è importante. È molto più veloce con le librerie di sistema.

Se hai a che fare con dati in un database, come menzionato sopra, l'indicizzazione del database deve essere utilizzata per le stringhe maiuscole / minuscole insensibili.

Se gestisci i dati in tempo reale, è importante eseguire il calcolo del costo di conversione necessario per ogni stringa. È probabile che le stringhe vengano confrontate o ordinate in qualche modo.

    
risposta data 12.07.2011 - 17:27
fonte

Leggi altre domande sui tag