Acabo de leer uno de los artículos de Joel en el que dice:
En general, tengo que admitir que tengo un poco de miedo a las características del lenguaje que ocultan 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 ve el mismo fragmento de código en C ++, no sabe nada. Nada. La única forma de saber lo que realmente está sucediendo en C ++ es averiguar qué tipos son i y j, algo que podría declararse en otro lugar. Esto se debe a que j puede ser de un tipo que se ha
operator*
sobrecargado y hace algo terriblemente ingenioso cuando intentas multiplicarlo.
(El énfasis es mío). ¿Te asustan las características del lenguaje que ocultan cosas? ¿Cómo puedes tener miedo de eso? ¿No es ocultar cosas (también conocido 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 a
y qué b
son, algo que podría declararse en otro lugar. Entonces, ¿deberíamos eliminar la programación orientada a objetos, porque oculta demasiadas cosas del programador?
¿Y en qué se j * 5
diferencia de j.multiply(5)
lo que podría tener que escribir en un idioma que no sea compatible con la sobrecarga del operador? Una vez más, tendrías que averiguar el tipo j
y echar un vistazo dentro del multiply
método, porque he aquí, j
podría ser de un tipo que tiene un multiply
método que hace algo terriblemente ingenioso.
"Muahaha, soy un programador malvado 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 porque 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 iluminame.