Sto progettando un set di API per alcune applicazioni su cui sto lavorando. Voglio mantenere lo stile del codice coerente in tutte le classi che scrivo, ma ho scoperto che ci sono alcune incoerenze che sto introducendo e non so quale sia il modo migliore per risolverle.
Il mio esempio qui è specifico per C # ma questo si applica a qualsiasi lingua con meccanismi simili.
Ci sono alcune classi di cui ho bisogno per scopi di implementazione che non voglio necessariamente esporre nell'API in modo da renderle internal
laddove necessario.
Generalmente ciò che farei è progettare la classe come farebbe normalmente (ad esempio, rendere membri public
/ protected
/ private
ove necessario) e modificare il livello di visibilità della classe stessa in internal
. Quindi potrei avere alcune classi che assomigliano a questo:
internal interface IMyItem
{
ItemSet AddTo(ItemSet set);
}
internal class _SmallItem : IMyItem
{
private readonly /* parameters */;
public _SmallItem(/* small item parameters */) { /* ... */ }
public ItemSet AddTo(ItemSet set) { /* ... */ }
}
internal abstract class _CompositeItem: IMyItem
{
private readonly /* parameters */;
public _CompositeItem(/* composite item parameters */) { /* ... */ }
public abstract object UsefulInformation { get; }
protected void HelperMethod(/* parameters */) { /* ... */ }
}
internal class _BigItem : _CompositeItem
{
private readonly /* parameters */;
public _BigItem(/* big item parameters */) { /* ... */ }
public override object UsefulInformation
{
get { /* ... */ }
}
public ItemSet AddTo(ItemSet set) { /* ... */ }
}
In un'altra classe generata (parte di un parser / scanner), esiste una struttura che contiene campi per tutti i possibili valori che può rappresentare. Anche la classe generata è internal
, ma ho il controllo sulla visibilità dei membri e ho deciso di renderli anche internal
.
internal partial struct ValueType
{
internal string String;
internal ItemSet ItemSet;
internal IMyItem MyItem;
}
internal class TokenValue
{
internal static int EQ(ItemSetScanner scanner) { /* ... */ }
internal static int NAME(ItemSetScanner scanner, string value) { /* ... */ }
internal static int VALUE(ItemSetScanner scanner, string value) { /* ... */ }
//...
}
Per me, questo sembra strano perché il primo insieme di classi, non ho necessariamente dovuto rendere alcuni membri public
, potrebbero essere stati fatti molto bene internal
. % membri diinternal
di un tipo internal
sono accessibili solo internamente comunque, quindi perché renderli public
? Non mi piace l'idea che il modo in cui scrivo le mie classi abbia di cambiare drasticamente (cioè modificare tutti gli usi di public
in internal
) solo perché la classe è internal
.
Qualche idea su cosa dovrei fare qui?
Ha senso per me che potrei voler rendere alcuni membri di una classe dichiarati public
, internal
. Ma per me è meno chiaro quando la classe è dichiarata internal
.