Quando la flessibilità della tipizzazione strutturale offre un vantaggio rispetto alla digitazione nominale?

3

Sto cercando di capire le implicazioni di tipizzazione strutturale vs. nominale digitando . Dalla lettura, sono riuscito a capire che uno dei vantaggi chiave della digitazione nominale è la possibilità di dichiarare un'interfaccia che può essere utilizzata con librerie di terze parti in cui non è possibile modificare una dichiarazione di classe per aggiungere un'interfaccia. Sfortunatamente, nessuno degli articoli che ho letto sembra fornire un caso d'uso convincente per la creazione di tali interfacce. In che tipo di circostanze potrebbe essere utile e i tipi strutturali offrono altri vantaggi rispetto ai tipi nominali?

    
posta Casebash 24.02.2018 - 08:23
fonte

1 risposta

3

Lascia che ti dia un esempio reale di questo; nomi cambiati per proteggere gli innocenti.

Stavamo integrando un Hardware Widget piuttosto costoso da un fornitore. Hanno fornito in modo utile una classe C # per l'interfaccia con il widget:

class VendorWidget
{
    public void Start() { ... }
    public void Turn() { ... }
    public int GetPosition() { ... }
    public void Stop() { ... }

    ... a load of other functions ...
}

Nota che questa classe ha non implementato un'interfaccia. Oltre a questo, abbiamo creato un controller per incapsulare la logica aziendale di cui avevamo bisogno. A questo punto, volevamo almeno tre diverse implementazioni del codice del widget:

  1. Il vero VendorWidget da utilizzare con l'hardware attuale.
  2. Un SimulatedWidget che abbiamo scritto in modo che gli sviluppatori che non disponevano dell'hardware effettivo potessero eseguire il maggior numero di sistemi possibile.
  3. Mazzi del widget per unità che testano il controller.

Con la tipizzazione strutturale, potremmo aver appena creato SimulatedWidget e i mock per avere le stesse funzioni di VendorWidget e portati avanti come prima. Ma poiché C # è tipicamente tipizzato, dovevamo prima creare un IWidget con tutte le funzioni di cui avevamo bisogno:

interface IWidget
{
    void Start();
    void Turn();
    int GetPosition();
    void Stop();

    ... all the other functions ...
}

Quindi avvolgi una facciata banale ma noiosa intorno a VendorWidget :

class VendorWidgetFacade : IWidget
{
    private VendorWidget _underlying;

    public void Start()
    {
        _underlying.Start();
    }

    public void Turn()
    {
        _underlying.Turn();
    }

    ... repeat for all the other functions ...
}

e solo allora potremmo fare in modo che il controller prenda un IWidget piuttosto che un VendorWidget e codifichi il widget simulato e il mock.

    
risposta data 24.02.2018 - 10:29
fonte

Leggi altre domande sui tag