Programación estructurada versus programación OO

11

Estoy haciendo una presentación que muestra las diferencias entre la programación estructural y la orientada a objetos y quiero ilustrar por qué las personas necesitan OOP con un ejemplo en el que aplicar los conceptos de OOP facilitará la codificación para que la audiencia realmente sienta que necesita OOP.

Algunas ideas ??

Ahmed
fuente
2
Hacer esta pregunta en programmers.stackexchange.com le dará más respuestas.
Reggie
2
¿Cuál es tu audiencia? ¿Programadores con experiencia que no sean OO (cobol, etc.)? programadores de baja experiencia (estudiantes, etc.) ¿Ejecutivos (no programadores)?
No había oído hablar de eso antes, pero leí las preguntas frecuentes y creo que es mejor preguntar allí.
Ahmed
baja experiencia
Ahmed
44
Desearía que algunos programas de OO estuvieran mejor estructurados.
Scott Whitlock

Respuestas:

17

Es posible que desee ver este video blog rápido . El resultado es que la diferencia entre la programación estructurada y la programación OO es una cuestión de lo que quitan de la programación, no de lo que agregan. Las disciplinas de software como la programación estructurada y la programación orientada a objetos son limitantes, no habilitantes. Aquí hay algunas definiciones. Advertencia: no te van a gustar.

  • La programación estructurada es una disciplina impuesta al goto (transferencia directa de control)

  • La programación OO es una disciplina impuesta a los punteros a las funciones (transferencia indirecta de control)

  • La programación funcional es disciplina impuesta a la asignación.

    El primero no es demasiado difícil de entender. Dijkstra descubrió que era imposible crear pruebas generales de corrección cuando se permitía el goto en los algoritmos. Sin embargo, si las estructuras de control se limitaban a la secuencia, la selección y la iteración, entonces las pruebas de corrección eran posibles. Por supuesto, hoy en día ni siquiera intentamos demostrar que las cosas están correctas, pero sí nos gusta la simplicidad y la elegancia de la programación estructurada.

Es un poco más difícil de entender OO. A menudo definimos OO como encapsulación, herencia y polimorfismo. Lo que es menos conocido es que estos tres atributos son alcanzables, y con frecuencia se lograron en C. De hecho, C ++ comenzó como un preprocesador que se compiló en C. No es realmente difícil encapsular en C. Tampoco es difícil de construir estructuras de datos que son subconjuntos entre sí, simulando herencia. El polimorfismo, sin embargo, es un poco más difícil. Requiere punteros a funciones que, en C, son difíciles de manejar bien. Lo que nos dieron los lenguajes como C ++ fue la disciplina impuesta a esos punteros a las funciones. El compilador de C ++ construyó los vtables para nosotros e inicializó los punteros dentro de ellos de acuerdo con un estricto formalismo. Entonces, en un sentido muy real, OO es simplemente disciplina impuesta sobretransferencia indirecta de control, es decir, punteros a funciones.

La programación estructurada trata sobre cómo no usar goto. OO trata sobre cómo no usar punteros para las funciones. Y la programación funcional también se trata de lo que no se debe hacer. En la programación funcional no asignamos variables, excepto en los casos más estrictamente controlados.

Por lo tanto, al final, todas estas "tecnologías" de programación en realidad restringen las disciplinas en lugar de habilitar tecnologías. Nos dicen lo que no hay que hacer más de lo que nos dicen lo que hacer. Y eso significa que el desarrollo de software no ha crecido en los últimos 40 años. Más bien, se ha reducido. Se ha vuelto cada vez más limitado ya que hemos aprendido todas las cosas que no debemos hacer.

Aprender qué no hacer es bueno; Pero aquí está la inquietante pregunta: ¿Qué cosas nuevas hemos aprendido a hacer?

Tío Bob.
fuente
@Ahmed: +1 para "TL; DR, gracias por el video" - comentario sospechoso (broma)
n611x007
link rot ... dead link
slashdottir
7

Hay 3 formas básicas de programar una computadora:

  1. Programación no estructurada: con gotos, como en los viejos intérpretes BASIC, o en lenguaje ensamblador. Pocas personas programan de esta manera.
  2. Programación imperativa estructurada, como en C o PASCAL.
  3. Programación funcional estructurada, como en Haskell, ML o Lisp.

En mi opinión, la programación orientada a objetos es algo diferente. Se trata de cómo organizar su programa a mayor escala. No reemplaza ni es obsoleto ninguno de los 3 paradigmas que mencioné anteriormente: dentro de un cuerpo de método, aún debe elegir uno de los 3 paradigmas de la lista para escribir.

Ken Bloom
fuente
No te entiendo bien! ¿Quiere decir que debemos estar usando uno de los 3 paradigmas pero NOSOTROS no lo sabemos ... y OOP es solo sobre más organización?
Ahmed
No puede programar sin aprender programación imperativa estructurada o programación funcional estructurada. Esos dos paradigmas son sobre hacer las cosas. OOP, por otro lado, se trata de la modularización del programa que solo entra en juego una vez que su programa haya alcanzado un cierto tamaño. Aunque definitivamente aparece en las bibliotecas que usa al programar todo el tiempo, se puede tener una biblioteca de clases perfectamente buena sin características OO como herencia, por ejemplo, las bibliotecas de clases de Haskell, LISP o Standard ML.
Ken Bloom
4

Se trata de cómo anticipa el cambio.

Ambos conceptos se prestan a la reutilización, pero OOP abre la puerta a cambios más fáciles. OOP tiene toda la capacidad de reutilización que tiene la programación estructural, pero también puede usarla para crear nuevas funciones con menos esfuerzo.

¡Se podría decir que OOP hereda toda la funcionalidad de la programación estructural con la funcionalidad adicional de herencia! :-RE

corsiKa
fuente
No soy muy aficionado a la herencia en este momento.
44
Yo tampoco, pero eso se debe a que el gobierno eliminó a mi abuelo de su pensión. Sin embargo, en términos de POO, ¡la herencia me ha servido bastante bien!
corsiKa
En mi experiencia, la herencia se evita mejor en OOP. ¿Con qué frecuencia construyes una superclase en lugar de una interfaz? Favorecer la composición como regla general.
Janx
1
@ Janx: "¿Con qué frecuencia construyes una superclase en lugar de una interfaz?" ¿Eh? No "construyes superclases"; se toma clases existentes y construir subclasss de ellos, y que hace que todo el tiempo. Si no está utilizando la herencia, no está obteniendo los beneficios de la sustitución de Liskov y el polimorfismo, entonces, ¿qué está haciendo en la programación orientada a objetos en primer lugar? La composición es una herramienta diferente con un caso de uso diferente, no un reemplazo para la herencia. No debes "favorecer" uno sobre el otro; debes usar ambos, cada uno para lo que son útiles.
Mason Wheeler
1
@Mason: vale la pena señalar que Barbara Liskov (del Principio de sustitución de Liskov) en realidad dijo (video largo) que no le gusta particularmente la herencia.
Aidan Cully
2

Los conceptos son ortogonales. La programación estructurada se trata de estructurar código dentro de procedimientos / funciones / métodos. Es perfectamente posible (y deseable) seguir los principios de la programación estructurada dentro de los métodos de clase cuando se hace POO.

Nemanja Trifunovic
fuente
1

Esa es una redacción subjetiva: la programación estructurada y la OOP son estilos de resolución de problemas, y uno no siempre es mejor que el otro. Escribir una biblioteca de métodos numéricos tiene mucho sentido si se realiza en un estilo estructurado, donde realiza transformaciones en los datos de entrada. Sin embargo, un agente simple controlado por una máquina de estados se puede expresar fácilmente como una clase autónoma en Java o C ++. OOP puede ser una forma natural de expresar contenedores de almacenamiento para estructuras de datos.

Hablar sobre la ocultación de la información y la modularidad es una buena manera de motivar naturalmente a OOP como un estilo.

Steve Yegge redactó una versión interesante de este tema: de alguna manera, una de las mejores descripciones de las diferencias en los enfoques entre los dos estilos.

usuario18014
fuente
0

OOP es más fácil de entender cuando haces un modelo de negocio. Cuando piensa en los elementos de la aplicación, utiliza algunos OBJETOS y RELACIONES entre ellos, por ejemplo, el Libro tiene Autor (es), Título, ISBN. El libro es para dejarlo en la Biblioteca y el estudiante podría pedirlo prestado. La programación estructural obliga a pensar en procesos específicos, implementaciones que no están en abstracción.

OOP está diseñado para cambios fáciles. El cambio en el programa estructural es posible pero debe describirse por código. El cambio en el programa OO podría describirse mediante un cambio de modelo abstracto.


fuente
0

Alcance variable:

Creo que un principio de los lenguajes para garantizar una buena programación es restringir el alcance de las variables. En lenguajes estructurados como C, el alcance es principalmente de dos tipos:

  • Alcance global
  • Alcance local / función / método

Todos sabemos que el alcance global es perjudicial. Pero a veces los ámbitos locales no son suficientes para ejecutar el programa. Evitar los alcances globales tiende a un uso más amplio de punteros, que permiten el uso de variables fuera del alcance. Pero los punteros son difíciles de entender y usar.

Los lenguajes OOP como C ++ agrega un nuevo tipo de alcance: alcance de clase / objeto a través de la encapsulación. Este alcance se ve reforzado por las variaciones privadas / públicas. Y esto resuelve muchos problemas de alcance variable. Los ámbitos están más definidos en OOP. Y los punteros son menos necesarios.

Esta es una de las grandes características de OOP.

Gulshan
fuente