La digitazione anatra influirebbe sulle convenzioni di denominazione?

5

Sono uno sviluppatore C ++ / C # e recentemente ho iniziato a imparare Python. Penso di capire il concetto di digitazione anatra adesso eccetto per una cosa.

Quando sto codificando in C ++ o C # a volte creo classi completamente estranee che hanno metodi simili con firme simili, ad esempio: Create (), Open (), Close (), ProcessData (), ecc. Non è un un grosso problema in C ++ o C # (a meno che non vogliate scherzare con i modelli C ++), ma in lingue con digitazione anatra come Python questo potrebbe causare un disastro. Considera il seguente esempio:

class DbTransaction:
    def rollback(self):
        pass

class SourceControlChangeset:
    def rollback(self):
        pass

def rollback_transaction(transaction):
    transaction.rollback()

transaction = DbTransaction()
changeset = SourceControlChangeset()
rollback_transaction(transaction)
rollback_transaction(changeset) # Oops!

Forse essere un esempio è un po 'artificiale, ma penso che questo potrebbe accadere abbastanza facilmente in un grande progetto con molte classi.

Cosa dovrei fare in questa situazione? Penso che il controllo dei tipi non sia "pythonic", quindi la mia unica idea è di cambiare la convenzione di denominazione per i metodi di classe come questo:

class DbTransaction:
    def rollback_transaction(self):
        pass

class SourceControlChangeset:
    def rollback_changeset(self):
        pass

Qualche idea?

    
posta RX_DID_RX 03.05.2014 - 13:48
fonte

2 risposte

5

In Clean Code , Robert Martin sostiene che anche con la tipizzazione statica, si dovrebbe evitare quello che lui chiama "punning", cioè dare lo stesso nome a due metodi che non sono semanticamente simili. Ciò significa che se consideri transaction.rollback e changeset.rollback come semanticamente diversi, dovresti provare a scegliere un altro nome per uno di essi, indipendentemente dal fatto che tu stia scrivendo anatra o meno.

Nel tuo particolare esempio, il nome rende ovvia la semantica di ogni caso, anche se il contesto è diverso, quindi va bene lasciare il nome lo stesso. Sei principalmente preoccupato di evitare di passare accidentalmente un tipo di oggetto in un contesto destinato all'altro.

Per essere schietto, questo è il compromesso che fai quando scegli la digitazione anatra. Aumenta il rischio di usare il tipo sbagliato, che richiede un po 'più di test, ma in cambio ottieni una maggiore riusabilità con meno problemi. Se vuoi i benefici della tipizzazione statica strong, devi scegliere la lingua e l'architettura di conseguenza. Non puoi avere la tua torta e mangiarla anche tu.

    
risposta data 04.05.2014 - 03:30
fonte
1

Lo sfortunato effetto collaterale di Duck Typing è che a volte non è un'anatra, anche se cammina come un'anatra e fa la cacca come un'anatra. Duck Typing funziona solo in aree limitate di somiglianza.

Il tuo esempio, tuttavia, è di per sé un problema. Non dovresti mai rollback_transaction(transaction) , dovresti sempre transaction.rollback() . Se hai un valido motivo per racchiudere il comportamento di un metodo, dovresti farlo "oggettivamente", non proceduralmente, creando un oggetto wrapper il cui metodo avvolge il metodo dell'oggetto interno.

    
risposta data 03.05.2014 - 15:28
fonte

Leggi altre domande sui tag