En mi humilde opinión, la ventaja de la mecanografía de pato se magnifica cuando se cumplen algunas convenciones, como nombrar variables y métodos de manera consistente. Tomando el ejemplo de Ken G, creo que sería leer mejor:
class SimpleResults {
def mapOfListResults
def total
def categories
}
Digamos que se define un contrato en alguna operación denominada 'calculateRating (A, B)' donde A y B se adhieren a otro contrato. En pseudocódigo, se leería:
Long calculateRating(A someObj, B, otherObj) {
//some fake algorithm here:
if(someObj.doStuff('foo') > otherObj.doStuff('bar')) return someObj.calcRating());
else return otherObj.calcRating();
}
Si desea implementar esto en Java, tanto A como B deben implementar algún tipo de interfaz que dice algo como esto:
public interface MyService {
public int doStuff(String input);
}
Además, si quiera que generalizar el contrato para el cálculo de puntuaciones (digamos que usted tiene otro algoritmo para el cálculo de calificación), también se tiene que crear una interfaz:
public long calculateRating(MyService A, MyServiceB);
con la tipificación de pato, se puede d Pica tus interfaces y solo confía en que en tiempo de ejecución, tanto A como B responderán correctamente a tus llamadas doStuff()
. No hay necesidad de una definición de contrato específica. Esto puede funcionar para usted, pero también puede funcionar en su contra.
El inconveniente es que debe tener mucho cuidado para garantizar que su código no se rompa cuando otras personas lo cambian (es decir, la otra persona debe conocer el contrato implícito sobre el nombre y los argumentos del método) .
Tenga en cuenta que esto se agrava especialmente en Java, donde la sintaxis no es tan estricta como podría ser (en comparación con Scala, por ejemplo). Un contraejemplo de esto es el Lift framework, donde dicen que el recuento SLOC del marco es similar a Rails, pero el código de prueba tiene menos líneas porque no necesitan implementar verificaciones de tipo dentro de las pruebas.
escribiendo pato y tipos estáticos son conceptos ortogonales. –