Quale livello di dettaglio utilizzare nelle descrizioni dei membri dell'interfaccia?

4

Sto estraendo interfacce da alcune classi in .NET e non sono completamente sicuro sul livello di dettaglio della descrizione da utilizzare per alcuni membri dell'interfaccia (proprietà, metodi).

Un esempio:

interface ISomeInterface
{
    /// <summary>
    /// Checks if the object is checked out.
    /// </summary>
    /// <returns>
    /// Returns true if the object is checked out, or if the object locking is not enabled,
    /// otherwise returns false.
    /// </returns>
    bool IsObjectCheckedOut();
}

class SomeImplementation : ISomeInterface
{
    public bool IsObjectCheckedOut()
    {
        // An implementation of the method that returns true if the object is checked out,
        // or if the object locking is not enabled
    }
}

La parte in questione è la sezione <returns>...</returns> della descrizione di IsObjectCheckedOut nell'interfaccia.

Va bene includere un tale dettaglio sul valore di ritorno nell'interfaccia stessa, poiché il codice che funzionerà con l'interfaccia dovrebbe sapere esattamente cosa farà quel metodo? Tutte le attuali implementazioni del metodo faranno proprio questo. Ma va bene limitare le possibili altre implementazioni future / dalla descrizione in questo modo?

O questo non dovrebbe essere incluso nella descrizione dell'interfaccia, in quanto non vi è alcun modo per assicurarsi che le implementazioni future / future facciano esattamente questo? È meglio essere il più generale possibile riguardo all'interfaccia in tali circostanze?

Attualmente sono propenso a quest'ultima opzione.

    
posta famousgarkin 30.08.2012 - 12:14
fonte

3 risposte

6

Consiglierei di fare un passo indietro e di guardare a ciò che stai cercando di ottenere.

Che cosa ti dà la documentazione XML? Documentazione XDoc? Pensa a ciò che vuoi vedere in quel documento. Intellisense? Pensa a cosa vuoi vedere quando qualcuno usa quel metodo dall'interfaccia. O lo stai facendo solo perché pensi che dovresti? Se è così allora fermati, stai perdendo tempo prezioso.

Già posso vedere che il nome del metodo non corrisponde a quello che fa il metodo. E questo è probabilmente il motivo per cui devi fare questa domanda.

Il metodo dovrebbe davvero essere denominato IsObjectCheckedOutOrNonLockable ()? O IsObjectNonLockable () include implicitamente "estratto" sugli oggetti attualmente implementati? O c'è una descrizione migliore che copre tutte quelle condizioni?

Rinominare il metodo rende più ovvio ciò che dovresti mettere nella documentazione XML e più ovvio di quanto ci si aspetti da future implementazioni?

    
risposta data 30.08.2012 - 12:43
fonte
3

Sii specifico come puoi descrivere come le interfacce dovrebbero apparire e comportarsi. Non c'è bisogno di avere un metodo di interfaccia il cui valore di ritorno è ambiguo - rompe l'intera nozione di interfacce. Solo perché poche lingue offrono la capacità di far rispettare tutti i requisiti e le intenzioni dell'interfaccia, come ad esempio il supporto di condizionamento e postcondizionamento di Eiffel, non dovrebbe impedirti di comunicare le aspettative sia ai chiamanti che agli implementatori.

    
risposta data 30.08.2012 - 13:00
fonte
1

Un'interfaccia definisce un'API e un protocollo. Ad esempio, due interfacce possono avere la stessa API, ma hanno protocolli diversi. Il metodo A in Interface 1 può fare una cosa e il metodo A nell'interfaccia 2 può fare una cosa completamente diversa.

Un'interfaccia dovrebbe applicare solo un'API (dal compilatore) e un protocollo (dallo sviluppatore); non dovrebbe far rispettare o persino suggerire eventuali dettagli di implementazione.

Il tuo problema sta nell'approccio di "estrapolare l'interfaccia" da una classe concreta. Tu (e il tuo codice) già conosci (e possibilmente cura) l'effettiva implementazione.

Invece di farlo, prova a rifattorizzare il codice client per utilizzare un'interfaccia ipotetica che sembra giusta e il suo obiettivo è auto-esplicativo dal suo utilizzo. Quindi, e solo dopo, modifica la tua classe concreta per implementare quell'interfaccia.

    
risposta data 30.08.2012 - 13:06
fonte

Leggi altre domande sui tag