Qual è il miglior design del software nella creazione di metodi?

2

Avevo creato un metodo di estensione che estendeva il tipo di stringa in C #.

// actually checks if the string is empty or null and then looks up the default
// promotion code which is set in the backend admin system. 
promocode.HasPromode(); 

Ho pensato che fosse bello e dandy, ma un altro collega ha pensato che dovrei iniettare il metodo attraverso l'iniezione del costruttore, che dovrebbe implementare un'interfaccia. Penso che questo sia eccessivo per avere una semplice funzione di ricerca per farlo.

Un altro collega pensava che estendere il tipo di stringa rendesse più semplice l'uso sbagliato e lo esponesse a scopi errati.

Quale è giusto? Tutte le soluzioni funzionano bene; ma alcune di queste soluzioni dovrebbero essere la migliore, o importa davvero? Dovrebbe essere importante, perché stiamo avendo quelle discussioni e stiamo cercando di rendere il codice migliore.

    
posta marko 10.02.2014 - 20:16
fonte

2 risposte

7

Il problema che ho con il tuo metodo è che lega un metodo alla classe string che non ha nulla a che fare con le stringhe in generale.

Avrebbe più senso se il tuo metodo di estensione avesse qualcosa a che fare con le stringhe in generale, non con un campo particolare. IsPalindrome() avrebbe più senso come metodo di estensione su string rispetto a HasPromode() [sic], perché IsPalindrome() è applicabile a qualsiasi stringa.

Ora, poi ...

Another colleague thought I should inject the method through constructor injection, which should implement a interface.

Er, cosa?

Questo individuo suona come un astronauta di architettura. Mentre il suo suggerimento potrebbe avere senso in alcuni contesto, sarebbe sufficiente una semplice chiamata Enum.TryParse() .

PromoCode outValue;
if (Enum.TryParse(promoCode, out outValue))
{
    // string contains valid promo code.
}
    
risposta data 10.02.2014 - 20:41
fonte
3

Sono d'accordo con Robert Harvey su tutto tranne la soluzione. Ciò è principalmente dovuto al fatto che, più probabilmente, i codici promozionali sono memorizzati nel database e potrebbero cambiare. In questo caso, non opterei per un enum semplicemente perché eventuali aggiunte / modifiche all'elenco di codici promozionali disponibili richiederebbero una build per aggiornare l'enumerazione con i valori corretti.

Invece, opterei per una soluzione come questa:

public class PromotionCodeManager //or some other meaningful name
{
    public bool IsPromotionCode(string value)
    {
        //TODO Attempt to lookup the promotion code in the backend system 
        //and return true if it's a valid promotion code that hasn't expired.
    }
}

E, se vuoi essere davvero fantasioso e soddisfare i desideri dell'astronauta dell'architettura, potresti usare dependency injection nel costruttore di questa classe che richiederebbe un IPromotionCodeRepository che la classe userebbe per cercare i codici promozionali validi e determinare se il valore trasmesso è valido.

Quindi, il codice cliente potrebbe essere simile a questo:

if (new PromotionCodeManager(promotionCodeRepository).IsPromotionCode(myValue))
{
    //Valid promotion code
}
else
{
    //Invalid promotion code
}
    
risposta data 10.02.2014 - 21:06
fonte

Leggi altre domande sui tag