Devo inserire i metodi di estensione di un'interfaccia nel file interface.cs?

7

Immagina questa configurazione:

public interface IMass{
    double Mass {get;}
}

public static class IMassExtension {
    public static double ToKg(this IMass massObject) {
        return massObject.Mass / 1000.0;
    }

    public static double CalculateInteractiveGravity(this IMass massObject, IMass otherMassObject)          
    {
         return blah;
    }
}

Va bene inserire la classe di estensione nello stesso file dell'interfaccia (ad esempio IMass.cs) o dovrebbe trovarsi in un file separato (IMassExtension.cs)?

Una classe base non è possibile qui. Immaginate

public class Person : Animal, IMass {}

e

public class House : Building, IMass {}
    
posta Moop 05.08.2014 - 17:52
fonte

4 risposte

11

Sì, è assolutamente soddisfacente. Inoltre, ti incoraggerei a farlo, poiché rende la funzionalità disponibile nell'interfaccia più facilmente individuabile, riducendo al contempo il rumore nella "funzionalità di cui si dispone in questo csproj". visualizza in Visual Studio.

Gli unici argomenti che ho sentito contro questo sono:

  • "ma poi hai 2 tipi per file!" : le linee guida sono lì per aiutarti, non per legare le mani. Puoi farlo solo con un tipo, se possibile.
  • "ma quell'estensione usa XYZ!" - sì, se non si includesse il metodo se fosse una classe astratta, allora non dovresti collegarlo anche all'interfaccia. Questo non è un problema con questa pratica, ma con il tuo design.
risposta data 05.08.2014 - 19:34
fonte
2

In breve: Avere i metodi di estensione in un file separato sarebbe l'approccio da seguire. È anche molto importante denominare le estensioni in modo appropriato, in quanto ciò garantirà sicuramente un periodo di tempo sicuro durante la manutenzione.

Preferirei decisamente il nome MassExtensions su IMassExtensions . Il motivo è che per la maggior parte dei programmatori un prefisso I su un tipo implica che si tratta di un'interfaccia. Questo è uno schema molto comune e parte delle Linee guida sulla progettazione .NET.

L'aggiunta di un prefisso I per il metodo di estensione interrompe sia le ipotesi sia le linee guida stabilite.

C'è anche la precedenza per questo nella libreria di classi base. La maggior parte dei metodi di estensione disponibili per IEnumerable sono contenuti nel tipo Enumerable .

I seguenti post correlati potrebbero essere utili:

risposta data 05.08.2014 - 19:08
fonte
1

Normalmente, non inserirò i metodi di estensione nello stesso file dell'interfaccia. Stessa libreria / pacchetto? Certo.

In questo esempio, sicuramente non lo farei. E se qualcuno implementasse la messa in unità imperiali (lumache)? Il toKg () dovrebbe essere nell'interfaccia (e forse anche come toSlug (), ma tecnicamente sarebbe derivabile da toKg ()), ei metodi di estensione sarebbero metodi come toG (), toMcg (), ecc., Che potrebbe essere implementato usando i metodi dell'interfaccia.

    
risposta data 05.08.2014 - 19:06
fonte
0

Lo inserisco in un file separato, e gli darei un nome più descrittivo di "IMassExtension.cs". Forse qualcosa come "MassConversions.cs", dal momento che è quello che fa effettivamente la classe.

Non dimenticare, i metodi di estensione possono ancora essere chiamati come se fossero semplici metodi statici (ad esempio MassConversions.ToKg(massObject) ), quindi la classe dovrebbe essere chiamata con questo in mente. Inoltre, la tua classe di estensione non è un'interfaccia, quindi potrebbe essere fuorviante chiamarla con la "I" iniziale.

    
risposta data 05.08.2014 - 19:13
fonte

Leggi altre domande sui tag