Dovremmo archiviare le stringhe di formato nelle risorse?

Per il progetto in cui sono attualmente attivo, devo consegnare stringhe appositamente formattate a un servizio di terze parti per l’elaborazione. E così sto costruendo le corde in questo modo:

string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number); 

Piuttosto che hardcode la stringa, stavo pensando di spostarlo nelle risorse del progetto:

 string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 

Secondo me, la seconda opzione non è così leggibile come la prima, cioè la persona che legge il codice dovrebbe tirare su le risorse della stringa per capire quale dovrebbe essere il risultato finale.

Come faccio a evitare questo? La stringa di formato hardcoded è un male necessario in questo caso?

Penso che questo sia un male necessario, uno che ho usato frequentemente. Qualcosa maleodorante che faccio, è:

 // "{0}{1}{2}: Some message. Some percentage: {3}%" string someString = string.Format(Properties.Resources.SomeString ,token1, token2, token3, number); 

… almeno fino a quando il codice non sarà abbastanza stabile da poter essere imbarazzato dal fatto che sia visto dagli altri.

Ci sono diversi motivi per cui vorresti farlo, ma l’unica grande ragione è se hai intenzione di localizzare la tua applicazione in un’altra lingua.

Se stai usando le stringhe di risorse ci sono un paio di cose da tenere a mente.

  1. Includi le stringhe di formattazione quando ansible nel set di stringhe di risorse che desideri localizzate. Ciò consentirà al traduttore di riordinare la posizione degli elementi formattati per adattarli meglio al contesto del testo tradotto.

  2. Evita di avere stringhe nei token di formato che sono nella tua lingua. È meglio usare questi per i numeri. Ad esempio, il messaggio:

    “Il valore specificato deve essere compreso tra {0} e {1}”

    è ottimo se {0} e {1} sono numeri come 5 e 10. Se si sta formattando in stringhe come “cinque” e “dieci”, ciò renderà difficile la localizzazione.

  3. Puoi trovare il problema di leggibilità di cui stai parlando semplicemente nominando bene le tue risorse.

    string someString = string.Format (Properties.Resources.IntegerRangeError, minValue, maxValue);

  4. Valuta se stai generando stringhe visibili all’utente al giusto livello di astrazione nel tuo codice. In generale tendo a raggruppare tutte le stringhe visibili dell’utente nel codice più vicino all’interfaccia utente ansible. Se alcuni codici di I / O di file di basso livello devono fornire errori, è opportuno farlo con le eccezioni gestite dall’applicazione e i messaggi di errore coerenti per. Ciò consentirà inoltre di consolidare tutte le stringhe che richiedono la localizzazione invece di averle disseminate nel codice.

Una cosa che puoi fare per aggiungere stringhe hard codificate o anche accelerare l’aggiunta di stringhe a un file di risorse è usare CodeRush Xpress che puoi scaricare gratuitamente qui: http://www.devexpress.com/Products/Visual_Studio_Add-in/ CodeRushX /

Dopo aver scritto la stringa, puoi accedere al menu CodeRush ed estrarre in un file di risorse in un unico passaggio. Molto bella.

Il resharper ha funzionalità simili .

Non vedo perché includere la stringa di formato nel programma sia una cosa negativa. A differenza dei tradizionali numeri magici non documentati, è abbastanza ovvio ciò che fa a prima vista. Ovviamente, se si utilizza la stringa di formato in più punti, è necessario memorizzarla in una variabile di sola lettura appropriata per evitare la ridondanza.

Sono d’accordo sul fatto che tenerlo nelle risorse non sia indirettamente indiretto qui. Una ansible eccezione potrebbe essere se il tuo programma deve essere localizzato e tu stai localizzando attraverso i file di risorse.

si, puoi inserisci la descrizione dell'immagine qui

nuovo lascia vedere come

 String.Format(Resource_en.PhoneNumberForEmployeeAlreadyExist,letterForm.EmployeeName[i]) 

questo mi darà ogni volta un messaggio dinamico

dal modo in cui sto usando ResXManager