Domanda

Diciamo che ho una casella di testo o qualunque altra forma di input che chiede un numero di previdenza sociale. Voglio sottolineare che lo SSN è un puro esempio ho semplicemente pensato che fin da oggi. Questo ingresso sarà naturalmente essere memorizzato come una stringa inizialmente.

string s = Console.ReadLine();

Diciamo che voglio avere un metodo che convalida uno SSN e potrebbe essere utilizzato in tutto il mio codice in tutti i tipi di luoghi. Heck, potrei anche chiamare il metodo su una variabile che non è stata determinata dalla scelta dall'utente.

E 'questo accettabile?

public bool IsValidSSN(Object SSN)
{
int mySSN;
    if(Int.Parse(SSN == false)
    {
    mySSN = Convert.toInt32(SSN);
    }
...
}

Se non sei ancora ragazzo insistere che io chiedo per un tipo di dati specifici, per esempio

public bool IsValidSSN(int SSN)
{
...
}

e per questo sono tenuto a convertire l'input per il tipo di dati corretto prima di chiamare il metodo su di esso.

A proposito: io non sto chiedendo come fare un codice IsValidSSN corretta :) Volevo solo dare un esempio di ciò che intendevo quando ho detto: Posso accettare il tipo di dati oggetto come un parametro o dovrei cercare di evitarlo?

È stato utile?

Soluzione

Se si deve accettare un oggetto Vorrei almeno avere overload del metodo che prende parametri fortemente tipizzati. Poi sono le varianti oggetto alimenteranno questi metodi.

public bool IsValidSSN(object ssn) {
  ...
  IsValidSSN(Convert.ToInt32(ssn));
  ...
}

public bool IsValidSSN(int ssn) {
  ...
}

Altri suggerimenti

Dipende completamente sul vostro disegno e dove volete che il vostro convalida a verificarsi. E 'in realtà dipende fondamentalmente dalla vostra architettura complessiva e la gerarchia di classe. Non è sbagliato farlo in entrambi i modi; tanto per essere sicuro che è il modo che si adatta con il vostro disegno architettonico.

Non vedo alcun valore ad accettare un oggetto in questo caso. Pensare a come ci si aspetta che la funzione di lavorare. (Chiaramente non avete, dato che il codice che hai postato non funziona). Penso che avete in programma qualcosa di simile:

if (SSN is string)
    SSN = Convert.toInt32(SSN);
else if (SSN is TextBox)
    SSN = Convert.toInt32(SSN.Value);
else /* etc */

Come è meglio di:

 bool isValidSSN(int SSN) { /* real valuation code */ }
 bool IsValidSSN(String SSN)  { return isValidSSN(Convert.toInt32(SSN)); }
 bool IsValidSSN(TextBox SSN)  { return isValidSSN(Convert.toInt32(SSN.Value)); }

I metodi di overload sono più semplici e più veloce, dal momento che più la decisione su cosa fare da runtime a tempo di compilazione.

Nel tuo esempio sopra è molto più facile creare un IsValidSSN digitato. In generale trovo che digitazione riduce bug e la flessibilità.

In circostanze in cui la flessibilità, se la Paramount quindi utilizzando oggetto è probabilmente la scelta migliore, ma si aspettano di affrontare alcune eccezioni fusione scontro nei registri.

Per tutti gli altri casi essere severi con la digitazione, o scrivere in python.

Personalmente, vorrei fare una classe SSN ed essere in grado di chiedere che SSN se era valido o meno. E 'importante avere classi che rappresentano presidi nella vostra logica di business. Questo è molto, per esempio, cosa si potrebbe fare con qualcosa che richiede più la convalida come una classe di carta di credito. Passare intorno agli oggetti non è il migliore se si può evitare e consegna intorno a qualcosa che è un principio nella vostra logica di business come un primitivo è male troppo (l'architettura rende SSN1 + SSN2 = SSn3 perfettamente valido, anche se in logica di business, è una sciocchezza ).

In questo caso, direi che era inaccettabile. Che cosa succede se l'ingresso ha trattini, o qualche altro personaggio di separazione (ad esempio: ### - ## - ####)? Lei, ovviamente, non sarebbe in grado di analizzare il valore come un intero, ma il valore sarebbe ancora valida. Come sull'utilizzo un'espressione regolare invece per garantire il valore è quello che hai desiderato.

In termini di utilizzo del "Oggetto" tipo come parametro, questo è completamente valida in molti casi. In realtà, è utilizzato in tutto il .NET Framework (guarda i delegati di evento):

public void Control_MouseOver(object sender, MouseEventArgs e){}

Si tratterebbe di un semplice caso di Pugilato / unboxing, che era davvero l'unico modo di eseguire operazioni di "generici" sulle variabili fino NET 2.0.

Si può anche usare Generics per risolvere questo problema senza la necessità di casting. Se si crea un'interfaccia che implementa qualcosa di simile INumeric (non so se questo è l'interfaccia reale) o IComparable si dovrebbe essere in grado di eseguire l'operazione in modo più elegante:

bool pubblico IsValidSNN (INumeric SSN) {}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top