c # naming - Quali sono le convenzioni comuni per un suffisso per distinguere tra le interfacce di sola lettura e quelle scrivibili [closed]

1

Assumi un'interfaccia che permetta le query su un albero spaziale

public ISpatialTree
{
    int FindChildIndex(Vector point);
    bool IsLeaf { get; }
    ICollection<ISpatialTree> Children { get; }
}

e un altro che consente di cambiare l'albero:

public ISpatialTreeWriter : ISpatialTree
{
    void Add(Vector point);
    bool Remove(Vector point);
    void Clear();
}

Sto cercando un nome per denotare l'interfaccia scrivibile. Idealmente sarebbe una parola ragionevolmente breve e leggibile. Non è solo per questo esempio, ma mi piacerebbe usare una convenzione per tutto il codice nel progetto perché questo è un caso comune.

Qualcuno sa di una buona convenzione per questo problema? Quali convenzioni sono usate in altri progetti?

Le parole che sono state discusse includono Writer (ambiguo, spesso usato in altri contesti), Mutator (confuso), Rw (illeggibile, non una parola).

Una buona soluzione sarebbe una singola parola, non più lunga di 6-8 lettere e questo rende ovvio che questa è l'interfaccia di scrittura.

    
posta Wilbert 14.05.2014 - 11:09
fonte

2 risposte

7

Writer e Mutator sono una scelta sbagliata perché implicano la mutazione di qualcos'altro. Se modifichi l'oggetto stesso, i moduli appropriati sono Writable e Mutable .

Se si dispone di un'interfaccia readonly ma l'oggetto sottostante può essere modificato tramite un'altra interfaccia, tale oggetto non è immutable . Ciò implica che mutabilità contro immutabilità non è la distinzione che vuoi fare qui.

Quindi rimangono solo ReadOnly , ReadWrite o Writable . Dato che non hai affatto accesso WriteOnly non devi distinguere ReadWrite da WriteOnly . ReadWrite non è una parola corretta, quindi preferirei andare con il Writable più semplice

.

Seguendo la convenzione delle raccolte esistenti in .NET, le scelte appropriate sarebbero IReadOnlySpatialTree e ISpatialTree , dove quest'ultimo è scrivibile.

Se la maggior parte del tuo codice è solo di lettura e accesso in scrittura è l'eccezione, potresti discostarti da questa convenzione e usare ISpacialTree come interfaccia di sola lettura e IWritableSpacialTree come interfaccia scrivibile.

    
risposta data 14.05.2014 - 12:47
fonte
0

Suggerisco di specificare uno stile di interfaccia di sola lettura, ad esempio:

interface IReadOnlySpatialTree
{
}

e quindi l'interfaccia scrivibile estende questo solo con il suo nome, cioè.:

interface ISpatialTree : IReadOnlySpatialTree
{
}

Utilizzerai raramente un'interfaccia scrivibile senza bisogno anche della parte readonly. Se non stai attento finirai con almeno 3 interfacce per ogni tipo (readonly / writeonly e readwrite), che non è particolarmente utile ed è uno spreco di energia da mantenere.

Avere un'interfaccia di sola lettura è utile, poiché questi metodi sono presumibilmente puri, il che semplifica il caching e altri aspetti. Significa anche che si può garantire che le scritture non avvengano involontariamente. Tuttavia, per un'interfaccia scrivibile, anche la lettura non ha molta importanza - l'interfaccia di sola lettura non ha effetti collaterali.

C'è il metodo piuttosto strano Elenco < T > .AsReadOnly nel framework .NET, in quanto MS non considerava in sola lettura in primo luogo.

    
risposta data 14.05.2014 - 12:09
fonte

Leggi altre domande sui tag