Acabo de leer uno de los artículos de Joel en el que dice:
En general, debo admitir que tengo un poco de miedo a las características del lenguaje que ocultan las cosas . Cuando veas el código
i = j * 5;
... en C sabes, al menos, que j se multiplica por cinco y los resultados se almacenan en i.
Pero si ves ese mismo fragmento de código en C ++, no sabes nada. Nada. La única forma de saber lo que realmente está sucediendo en C ++ es averiguar qué son los tipos i y j, algo que podría ser declarado en algún otro lugar. Eso es porque j podría ser de un tipo que tiene
operator*
sobrecargado y hace algo terriblemente ingenioso cuando intentas multiplicarlo.
(Enfatiza lo mío). ¿Te asustan las características del lenguaje que ocultan cosas? ¿Cómo puedes tener miedo de eso? ¿No es la ocultación de las cosas (también conocida como abstracción ) una de las ideas clave de la programación orientada a objetos? Cada vez que llama a un método a.foo(b)
, no tiene idea de lo que podría hacer. Tienes que averiguar qué tipos son a
y b
, algo que podría ser declarado en algún otro lugar. Entonces, ¿deberíamos eliminar la programación orientada a objetos, porque oculta demasiadas cosas del programador?
¿Y en qué se diferencia j * 5
de j.multiply(5)
, que podría tener que escribir en un idioma que no admita la sobrecarga de operadores? Una vez más, tendrías que encontrar el tipo de j
y mirar dentro del método multiply
, porque he aquí que j
podría ser de un tipo que tiene un método multiply
que hace algo muy ingenioso.
"Muahaha, soy un malvado programador que nombra un método multiply
, pero lo que realmente hace es totalmente oscuro y no intuitivo y no tiene absolutamente nada que ver con multiplicar las cosas". ¿Es ese un escenario que debemos tener en cuenta al diseñar un lenguaje de programación? ¡Entonces tenemos que abandonar los identificadores de los lenguajes de programación con el argumento de que pueden ser engañosos!
Si desea saber qué hace un método, puede echar un vistazo a la documentación o echar un vistazo dentro de la implementación. La sobrecarga del operador es solo azúcar sintáctica, y no veo cómo cambia el juego en absoluto.
Por favor, ilumíname.