Sto imparando Ruby e sto avendo un grosso problema concettuale relativo alla digitazione. Consentitemi di spiegare perché non capisco con il paradigma.Come lavorare con Ruby Duck Typing
Dire che il metodo concatena per il codice conciso come si fa in Ruby. Devo sapere con precisione quale sia il tipo di ritorno di ciascun metodo chiamato nella catena, altrimenti non posso sapere quali metodi sono disponibili sul prossimo collegamento. Devo controllare la documentazione del metodo ogni volta ?? Mi sto imbattendo in questi esercizi tutorial costantemente in esecuzione. Sembra che io sia bloccato con un processo di riferimento, inferire, eseguire, fallire, correggere, ripetere per ottenere il codice in esecuzione piuttosto che sapere con precisione con cosa sto lavorando durante la codifica. Questo vola di fronte alla promessa di intuito di Ruby.
Dire che sto usando una libreria di terze parti, ancora una volta ho bisogno di sapere quali tipi sono autorizzati a passare i parametri altrimenti ho un fallimento. Posso guardare il codice ma possono o non possono esserci commenti o dichiarazioni di quale tipo il metodo si aspetta. Capisco che il codice basato sui metodi sia disponibile su un oggetto, non sul tipo. Ma poi devo essere sicuro che qualunque cosa io passi come parametro ha tutti i metodi che la libreria si aspetta, quindi devo ancora fare il controllo del tipo. Devo sperare e pregare che tutto sia documentato correttamente su un'interfaccia, quindi so se mi dovrei dare una stringa, un hash, una classe, ecc.
Se guardo la fonte di un metodo che posso ottenere un elenco di metodi che vengono chiamati e inferire il tipo previsto, ma devo eseguire analisi.
Ruby and duck typing: design by contract impossible?
Le discussioni in seno al precedente StackOverflow questione in realtà non rispondere altro che "non ci sono processi dovete seguire" e quei processi non sembrano essere standard, ognuno di noi ha un'opinione diversa su quale processo seguire e il linguaggio ha zero imposizione. Convalida del metodo? Design guidato dal test? API documentata? Convenzioni di denominazione del metodo rigoroso? Qual è lo standard e chi lo detta? Cosa seguo? Queste linee guida risolveranno questa preoccupazione https://stackoverflow.com/questions/616037/ruby-coding-style-guidelines? Ci sono editori che aiutano?
Concettualmente non ho nemmeno il vantaggio. Devi sapere quali sono i metodi necessari per qualsiasi metodo chiamato, quindi indipendentemente dal fatto che tu stia scrivendo quando codifichi qualcosa. Non stai semplicemente informando la lingua o chiunque altro esplicitamente, a meno che tu non decida di documentarlo. Quindi sei bloccato a eseguire tutti i controlli di tipo in fase di esecuzione anziché durante la codifica. Ho fatto programmazione in PHP e Python e non riesco nemmeno a capirlo.
Cosa mi manca o non capisco? Per favore aiutami a capire questo paradigma.
Ci sono sicuramente dei vantaggi nell'annotare la digitazione, ma ovviamente ci sono anche degli svantaggi. Posso passare * qualsiasi * oggetto a un metodo 'foo (a)' che chiama 'a.bar' finchè' a.responds_to? (: Bar) '. Bello. Nessuna interfaccia, niente generici, basta aggiungere un metodo 'bar' e via. Naturalmente, la tipizzazione statica ha anche molti vantaggi. Sembra che tu abbia solo bisogno di un po 'di esperienza con il modo Ruby per apprezzare entrambi. Sembra anche che tu possa essere stato un po 'viziato da intellisense (o caratteristiche simili). Molti (* molti *) di noi devono controllare la documentazione in anticipo e spesso. –
L'intuizione è il risultato dell'allenamento, quindi nulla è intuitivo finché non ti sei allenato a usarlo. –
Questa domanda presenta "TL; DR". Sarebbe utile per te riassumere e buttare via il resto altrimenti è troppo ampio. "Questo vola di fronte alla promessa di intuito di Ruby." Intuitività a chi? Matz dice che è progettato per essere intuitivo per lui, e che crede che diventerà intuitivo per gli altri che lo hanno usato a sufficienza. È impossibile creare un linguaggio immediatamente intuitivo per tutti, quindi il suo obiettivo è azzeccato. –