Linee guida per la creazione di callables referentially trasparenti

3

In alcuni casi, voglio usare callables referentially trasparenti durante la codifica in Python. I miei obiettivi sono di aiutare a gestire la concorrenza, la memoizzazione, il test delle unità e la verifica della correttezza del codice.

Voglio scrivere regole chiare per me e altri sviluppatori da seguire che garantiscano la trasparenza referenziale. Non mi importa che Python non applicherà alcuna regola - ci fidiamo di seguirli. Tieni presente che non modifichiamo mai le funzioni oi metodi in vigore (ad esempio, eseguendo l'hacking nel bytecode).

Ciò che segue ha senso?

A callable object c of class C will be referentially transparent if:

  1. Whenever the returned value of c(...) depends on any instance attributes, global variables, or disk files, such attributes, variables, and files must not change for the duration of the program execution; the only exception is that instance attributes may be changed during instance initialization.

  2. When c(...) is executed, no modifications to the program state occur that may affect the behavior of any object accessed through its "public interface" (as defined by us).

Se non poniamo alcuna restrizione su cosa "interfaccia pubblica" include, la regola n. 2 diventa:

When c(...) is executed, no objects are modified that are visible outside the scope of c.__call__.

Nota: ho cercato invano di porre questa domanda su SO, ma spero che sia più appropriato per questo sito.

    
posta max 13.10.2012 - 15:23
fonte

1 risposta

2

L'obiettivo della enforcing trasparenza referenziale (RP) può essere un po 'ambizioso data la presenza di file IO e variabili globali. Invece, puoi renderlo una best practice, che in pratica sembra che tu voglia fare.

Le regole 1 e 2 ti spingeranno sicuramente nella direzione di RP, ma sono piuttosto problematiche. Prima di tutto, fare affidamento sul fatto che un file su disco non cambia è rischioso. È meglio isolare IO in parti ben definite del codice dell'applicazione. Lo stesso vale per le variabili globali. Se è vero, se le variabili globali utilizzate da una funzione non cambiano, ciò consentirebbe la RP, potrebbe essere troppo difficile da far rispettare. Invece, cerca di evitare le variabili globali. Inoltre, assicurati che gli attributi di istanza siano di sola lettura.

Dato che Python è un linguaggio multi-paradigma, puoi sfruttare i vantaggi della programmazione funzionale e di OOP. È possibile strutturare il codice in modo tale che ci siano parti puramente funzionali che aderiscono a RP e ci sono parti imperative che incollano tutto insieme. Si può dire OOP per strutturare i programmi incapsulando parti mobili, mentre si può dire che FP può ridurre le parti mobili - usa entrambi i paradigmi.

    
risposta data 13.10.2012 - 22:47
fonte

Leggi altre domande sui tag