Libreria Organizzazione in .NET

3

Ho scritto una libreria di operazioni bitwise .NET come parte dei miei progetti (roba che va da get MSB set a trasformazioni bit a bit più complicate) e intendo rilasciarla come software libero. Tuttavia, sono un po 'confuso riguardo all'aspetto progettuale della biblioteca.

Molti dei metodi / trasformazioni nella libreria vengono forniti con endianness diversi. Un semplice esempio è un metodo getBitAt che considera l'indice 0 come il bit meno significativo o il bit più significativo, a seconda della versione utilizzata.

In pratica, ho scoperto che l'utilizzo di funzioni separate per endianness differenti comporta un codice molto più comprensibile e riusabile rispetto all'assunzione che tutte le operazioni siano little-endian o qualcosa del genere.

Sono davvero imbarazzato per quanto riguarda il modo migliore per impacchettare la libreria.

  • Devo avere metodi con versioni LE e BE che richiedono un enum parametro nella loro firma, ad es. Endianness.Little, Endianness.Big ?
  • Devo avere classi statiche diverse con metodi con nomi identici? come MSB.GetBit e LSB.GetBit

Su una nota molto più ampia, c'è uno standard che potrei usare in casi come questo? Qualche guida? Il mio problema di progettazione è banale? Ho un perfezionista piegato, e a volte mi blocco su problemi di progettazione difficili come questo ...

Nota: ho realizzato che sto usando endianness in qualche modo colloquiale per fare riferimento al valore dell'ordine / luogo delle parti del componente digitale (siano essi bit, byte o parole) in un insieme più grande, in qualsiasi ambiente. Non sto parlando di endianness livello macchina o endianness di trasmissione seriale. Quasi la semantica del valore del posto in generale. Quindi non esiste un contesto per il targeting di diverse macchine / tecniche di trasmissione o qualcosa del genere.

    
posta GregRos 22.10.2012 - 10:44
fonte

3 risposte

3

Come nella maggior parte dei casi di problemi di progettazione, la soluzione dovrebbe essere basata sull'uso e il contesto previsti, invece di qualsiasi presunto assoluto.

Devi stabilire i tuoi requisiti. A cosa serve la biblioteca? Qual è il tuo pubblico di destinazione per questa libreria?

Se l'uso previsto è quello di combinare la logica little-endian con la logica big-endian, allora è utile aggiungere un argomento extra per ogni metodo, come Endianness.Little , proprio come suggerito. Non suggerirei un clone per ogni metodo, in quanto sarebbe piuttosto rapido, e con gli IDE odierni e il completamento automatico sarebbe un disturbo visivo e avrebbe anche un impatto (probabilmente trascurabile) sul tempo di compilazione.

Tuttavia, se intendi utilizzare la libreria per piattaforme diverse, ma su ognuna scegli uno schema, probabilmente stai meglio passando una strategia Endianness al costruttore di una classe che ha metodi di livello superiore.

Se vuoi ottenere il meglio da entrambi i mondi, a spese della semplicità, puoi passare una strategia in un costruttore e accettare una strategia facoltativa in ogni metodo, che per impostazione predefinita è quella fornita nel costruttore.

    
risposta data 22.10.2012 - 10:55
fonte
0

Sono d'accordo Yam che dipende dal tuo utilizzo della libreria. Un altro arrangiamento interessante, se non stai andando per livelli folle di prestazioni potrebbe essere quello di creare una classe che contiene entrambe le risposte. GetBit restituirà quindi un'istanza di questa classe, con due proprietà che presentano i risultati.

public class BitWiseResult 
{
  public <type-goes-here> MSB { get; set; } 
  public <type-goes-here> LSB { get; set; } 
}

public BitWiseResult GetBit() ...

Questa disposizione verrà utilizzata al meglio se è necessario utilizzare entrambi i risultati in modo intercambiabile. Ha il vantaggio di darti il risultato giusto nel posto esatto in cui ne hai bisogno, invece di cambiare una chiamata di funzione possibilmente distante o un'istanza di classe.

    
risposta data 22.10.2012 - 12:08
fonte
0

Se gli utenti della tua biblioteca si attaccano a una Endianness nella loro applicazione, utilizzerei una fabbrica astratta.

// setup
var factory = new LittleEndiannessFactory();

// usage
var algo = factory.CreateSomeAlgo();

Altrimenti probabilmente vorrai che specificheranno l'endianness in ogni chiamata di metodo.

    
risposta data 22.10.2012 - 14:19
fonte

Leggi altre domande sui tag