¿Se han entregado los objetos en términos de reutilización de código?

17

A menudo he oído decir que los objetos no se han entregado en términos de reutilización de código. ¿Estás de acuerdo? Si crees que no, ¿por qué no?

Casebash
fuente
44
Nunca he escuchado a nadie decir eso ...
TheLQ
2
@the No creo haber escuchado a nadie decirlo, pero lo he leído.
George Marian
La reutilización no es la única ventaja de OOP.
Nadie
2
"¿Se han entregado los objetos en términos de reutilización de código?" -> Solo si creíste a los vendedores de OOP de la época (¿eran los 60? Lo olvido)
Steven Evers
Mi respuesta a una pregunta similar: programmers.stackexchange.com/questions/53521/…
kevin cline

Respuestas:

18

No, no necesariamente

Los objetos ofrecen una mejor semántica, organización del código / funcionalidad y, posiblemente, facilidad de uso.

Las bibliotecas bien diseñadas cumplen la promesa de reutilizar el código, no los objetos per se.

George Marian
fuente
Bueno, sí. ¿Pero los objetos han ayudado a los diseñadores de bibliotecas proporcionándoles opciones que hacen que sus bibliotecas sean más fáciles de reutilizar? Yo diría que sí, y por lo tanto, los objetos han proporcionado una reutilización mejorada.
Julio
@Jules A mí también me gusta debatir solo por debatir. No diría que los objetos no han facilitado el diseño de bibliotecas. Estoy argumentando que el uso adecuado de sus herramientas es lo que conduce a resultados adecuados.
George Marian
7

Honestamente, no estoy seguro de si la "reutilización de código" es realmente lo que alguien está buscando (o al menos, debería ser después). Mi filosofía es "componentes de software", lo que significa una mejor capacidad de mantenimiento a través de buenas interfaces y evitar acoplamientos innecesarios. La "reutilización de código" es una de las cosas que a veces se cae de eso: el código innecesariamente duplicado es una señal de que ha organizado las cosas de manera incorrecta y, por supuesto, es difícil de mantener.

Para responder la pregunta un poco más directamente, hay una colección de herramientas bastante buenas para evitar repetirse: herencia, rasgos, delegación, funciones de orden superior, etc. De ellas, las personas tienden a confundir la herencia con OO en su conjunto, y También tienden a abusar un poco, si me preguntas. Tal vez de ahí proviene parte de la vibra "OO apesta": encontrar la herencia atascada donde no tiene derecho natural a estar :)

hobbs
fuente
La reutilización de código es definitivamente algo a lo que apuntar, cuando puede evitar sacrificar la calidad del código
Casebash el
1
Sin embargo, la reutilización de códigos no es un objetivo en sí mismo. Reutilizar es otra palabra para acoplar. Como tal, debe abordar la reutilización con cuidado. Parece que muchos desarrolladores olvidan esto. Quieren sistemas desacoplados, pero se dan la vuelta y tratan de usar clases existentes en todas partes.
Andy
5

No, los "objetos" no han hecho que la reutilización del código sea más fácil o más común. Las mismas preocupaciones que evitan que el código se reutilice en un programa modular (diseñar, probar y documentar una API de propósito general requiere un esfuerzo inicial considerablemente mayor que escribir una rutina única, y la razón de ser de todas las operaciones puede ser la maestro de ninguno: la lógica destinada a ser reutilizada puede no estar bien optimizada para los usos a los que realmente se aplica) se aplica a los programas OO, con la preocupación adicional de que un modelo de objeto mal diseñado puede obstaculizar la reutilización de lo que de otro modo sería reutilizable código.

OO es una abstracción útil para muchos problemas, pero tenga cuidado con las exageraciones de los años 80-90: no resuelve mágicamente los problemas fundamentales de nuestro comercio más de lo que hace gofres para usted mientras duerme.

Shog9
fuente
5

No espero que TODOS los objetos se reutilicen, pero tenemos muchos objetos que reutilizamos en muchos proyectos diferentes. También tenemos objetos que solo se reutilizan en un proyecto. A menudo consumiremos los mismos objetos de negocios (u objetos de transferencia de datos), así como objetos de lógica de negocios de una aplicación de escritorio Click-Once, una aplicación web y una aplicación de teléfono, todo para el mismo proyecto.

¿Dónde has oído que OO no cumple con la reutilización? ¿Y cuál fue el razonamiento? Quizás el diseño de sus objetos los obligó a esa situación ...

Walter
fuente
44
Varios articulos. Y por experiencia personal, hacer que un objeto sea reutilizable no es nada fácil
Casebash el
3

Algunos programadores copiarán y pegarán en cualquier idioma y estilo.

Los programadores realmente buenos pueden evitar la mayoría de copiar y pegar en casi cualquier idioma.

Encuentro que los patrones de OO tienden a fomentar la reutilización. He visto código Java que se escribió en un estilo que no es OO (donde los datos se separaron del código debido a un ORM malo) y la reutilización fue realmente miserable, pero en OO los mismos programadores hicieron un mejor trabajo en el diseño ( y reutilizar).

También en los casos en que usamos patrones que no son oo o antipatrones oo, como establecedores / captadores, declaraciones de cambio, clases internas anónimas, funciones enormes y similares, he visto que la reutilización de códigos baja y la repetitiva sube ... significativamente.

PD. Sé que la gente tendrá problemas con el párrafo anterior, así que lo explicaré un poco.

Los setters y getters causan problemas OO porque le permiten operar en los miembros de un objeto (un objeto debe manipular sus propios miembros) Esto distribuye el código que opera en su clase a través de otras clases que requieren que copie la funcionalidad alrededor del setter / getter . Esto también se aplica a las Propiedades, solo porque las Propiedades son más fáciles no las hace "Buenas" en todas las situaciones.

El código en las clases internas anónimas no se puede reutilizar en absoluto y la gente olvida que muchas cosas (como los oyentes) pueden y deben ser clases completas, ¡esto también se aplica a los cierres! Si ha utilizado una clase interna anónima para implementar algo como un oyente, es mucho más probable que simplemente copie y pegue su implementación que extraer el código en un método o su propia clase y llamarlo en su lugar. Los cierres también pueden mejorar la reutilización, solo depende de cómo los use.

En muchos casos, las funciones disponibles le dan forma a cómo estructura su código. OO es aún más poderoso cuando se trata de ayudarlo a visualizar todo su código y cómo interactúa, pero esa es otra pregunta.

Bill K
fuente
2

Los objetos no tienen más capacidad para entregar la reutilización del código que una escaladora u otro equipo de acondicionamiento físico para perder peso. Los desarrolladores tienen que estar motivados para usar las herramientas adecuadamente.

Una vez que los equipos de software otorguen un mayor valor a la reutilización del código probado que a mantener todos los detalles en su cabeza, verá objetos y métodos mucho más precisos y, por lo tanto, más reutilización del código.

Huperniketes
fuente
2

si

OOP te brinda más formas de reutilizar el código

No

No hay bala de plata

Depende

en lo que pones en él, y lo que esperabas a cambio!

Steven A. Lowe
fuente
1

Si. Una buena programación orientada a objetos promueve la separación de preocupaciones, bajo acoplamiento, alta cohesión y ocultación de información. Estas cosas son críticas para el código reutilizable.

Yo diría que el principal beneficio de OOP es la modularidad y la modificabilidad, en lugar de la reutilización, pero esa es otra cuestión.

Fishtoaster
fuente
44
Estoy de acuerdo en que los objetos hacen que el código sea más agradable, pero desafortunadamente una proporción tan grande de mis objetos no son reutilizables. Para menudo, haciendo un objeto significa reutilizables simplificar la situación
Casebash
2
@casebase +1 Sin embargo, diría que hacer que los objetos sean reutilizables significa complicar demasiado la situación (objeto).
George Marian
No todo va a ser reutilizable. La mayoría de las cosas no lo harán. Sin embargo, el bajo acoplamiento, la ocultación de información, etc., son requisitos previos para la reutilización, y el objeto lo promueve.
Fishtoaster
2
@Fishtoaster: también podría decir que su automóvil en movimiento es un requisito previo para llegar al trabajo, y una entrada inclinada lo promueve. Es técnicamente cierto, pero es poco probable que marque la diferencia fuera de los casos límite: si necesita y desea reutilizar, lo obtendrá, OO o no; si no lo hace, entonces tener los requisitos previos no hará que suceda accidentalmente.
Shog9
@Señor. C- No estoy seguro de seguir tu punto. Simplemente estaba afirmando que las cosas que fomenta OOP (modularidad, etc.) facilitan la creación de cosas como bibliotecas. Hay muchas maneras de hacer que el código sea reutilizable separando las preocupaciones, etc. OOP es uno, el buen diseño del método es otro, la descomposición adecuada del problema es otra.
Fishtoaster
1

Los objetos permiten volver a demandar código, pero como tal no es la mejor técnica para eso. Creo que la reutilización del código se promueve a través de técnicas relacionadas con objetos como la herencia, el polimorfismo, la sobrecarga y las plantillas.

Gaurav
fuente
1

Sí, lo hacen, la capacidad de extender (heredar) de una clase súper clara contribuye a la reutilización del código, no estoy seguro de cómo alguien podría argumentar lo contrario. Simplemente puede extender una clase y anular un método, mientras usa el resto de la superclase, si esto no ayuda a la reutilización del código, entonces no sé qué es

programamx10
fuente
0

Si es así, ¿han cumplido su promesa de reutilización de código hasta ahora? Sí, si los programas escritos con OOP en mente aplican los patrones de diseño sabiamente. De lo contrario, en su mayoría no. Pero mirando la popularidad de los programas no triviales a gran escala que los sistemas Adobe, Google y similares escriben con C ++ o Java u otros lenguajes OOP, diría que OOP tiene un largo camino por recorrer antes de que se elimine gradualmente. Ese tiempo será mucho más adecuado para hacer esta pregunta y podría ayudar a proporcionar un terreno para un nuevo paradigma.

vpit3833
fuente