Esiste un buon modo per comunicare l'intento che una classe contiene solo metodi referenzialmente trasparenti?

1

Il mio posto di lavoro utilizza principalmente C # per scrivere codice. Sto cercando di capire un buon modo per indicare che una classe con metodi referentially trasparenti è destinata ad essere referenzialmente trasparente (vale a dire, dato lo stesso insieme di argomenti, si otterrà sempre lo stesso valore di ritorno) per i manutentori futuri. Ho preso in considerazione solo l'uso di classi statiche per classi destinate a contenere solo metodi referentially trasparenti, ma ha ricevuto il pushback dai miei colleghi in quanto preferiscono un approccio al test delle unità in cui tutte le classi dipendono dall'uso del costruttore DI da eseguire. Non vedo uno svantaggio per non sopprimere le funzioni referentially trasparenti per le prove di unità in quanto sono quasi sempre in-memory comunque, ma non sono riuscito a convincere i miei colleghi di quello.

I nostri nomi di classe usano nomi di modelli OO tipici come DTO o Factory o Controller e modelli per gli spazi dei nomi. Non sono a conoscenza di nomi di pattern in OO che indichino il tipo di intenzione che sto cercando (ovvero, non introdurre operazioni di effetto collaterale o a seconda di cose che vengono letti dal db o dal filesystem).

    
posta jeff charles 06.05.2014 - 17:46
fonte

4 risposte

3

Il modo migliore che posso immaginare per fare ciò è usare uno spazio dei nomi di nome puro o stateless o referentially-transparent (che probabilmente confonderà di più, quindi attenersi a un nome più semplice rispetto al referenziale trasparente). Con questo tutto ciò che serve per comunicare ai tuoi colleghi è che "Namespace X contiene solo codice referentially trasparente" così ogni volta che qualcuno usa quel namespace, potrebbe ottenere il clic nel loro intendimento.

    
risposta data 06.05.2014 - 17:56
fonte
5

Inserisci un commento nell'intestazione XML della classe, con l'effetto di "Questa classe statica contiene solo metodi referentially trasparenti, come quelli nella classe statica System.Math. Non mettere le funzioni che causano effetti qui. "

I metodi referential-transparent sono i più facili di tutti i metodi da testare: consegnagli un valore ed esamina il valore restituito. Questo è tutto.

Naturalmente, il pushback sarà "come faccio a sapere che questo metodo 'referentially-transparent' non chiama altri metodi?" La risposta è che hai testato questi altri metodi e sai già che funzionano, vero?

Ulteriori letture
È statico universalmente" malvagio "per il test delle unità e, in caso affermativo, perché il resharper lo consiglia?

    
risposta data 06.05.2014 - 17:57
fonte
0

Questo è davvero un salto tra i circuiti, ma che dire creare una classe base chiamata ReferentiallyTransparentBase il cui costruttore lancia un'eccezione? Quindi, quando la persona inizia a eseguire il debug dell'eccezione, vedrà il commento // I METODI DI QUESTA CLASSE SOSTITUIRANNO SE SI CREANO ISTANZE DI ESSO. COSÌ NON FARLO. Spero che otterranno l'immagine.

    
risposta data 06.05.2014 - 22:06
fonte
-1

Non sviluppo molto C # ma mi sembra che tu possa definire un attributo e applicarlo a tutte queste classi. Potresti quindi fornire una descrizione approfondita delle restrizioni che impongono alle classi all'interno della documentazione dell'attributo. In questo modo il tuo intento è ancora documentato, ma non devi copiare e incollare alcuno schema di trasparenza referenziale nella documentazione per tutte le classi.

    
risposta data 06.05.2014 - 17:55
fonte