.net - tipos - structure class c#
¿Dónde puedo encontrar ejemplos de código de procedimiento convertido en código de objeto? (4)
El problema que los programadores de procedimientos suelen tener cuando inician la programación orientada a objetos es que siguen diseñando procedimientos y tratan de organizarlos como objetos . Eso no funciona.
La programación orientada a objetos es una metodología de diseño diferente ; una forma diferente de pensar acerca de los roles y responsabilidades que distribuye a lo largo de su código, no solo una metodología de codificación diferente.
Cuando superas las metáforas de "el perro es un mamífero" (que nunca se traducen en aplicaciones reales), recomendaría este libro: Diseño de objetos: roles, responsabilidades y colaboraciones . Fue el primer libro que leí donde finalmente obtuve por qué tuve que dejar de ver (en mi caso) C ++ como "C con clases lanzadas".
Estoy tratando de envolver mi cabeza en torno a la programación orientada a objetos. Pero estoy teniendo algunos problemas. Yo (creo) comprendo los conceptos generales y los argumentos de por qué la POO es un diseño "bueno". Mi problema viene cuando me siento e intento escribir código que es OOP.
Tiendo a terminar con programas que son muy procedimentales pero que tienen objetos ocasionales que se lanzan en buena medida ... o programas que parecen ridículamente largos y complejos por lo que están haciendo ... todo es un objeto; pero hay muchos, muchos objetos y los árboles de herencia se vuelven largos y feos.
Lo que he estado tratando de encontrar son algunos ejemplos no triviales (he visto un montón de códigos de desecho / pseudo con gatos, perros y animales ... pero no parecen ayudar cuando realmente intento) para codificar algo que necesita hacer algo) de código fuente OOP realmente bien diseñado. Idealmente, estoy buscando algo que me guíe a través del proceso de pensamiento. Me gusta: ''Bueno, aquí hay un código de procedimiento que hace XYZ. Ahora, aquí hay un código OOP realmente genial que hace lo mismo! ''.
Gracias
La realidad es que tales conversiones generalmente no serían un buen código orientado a objetos. ¿Por qué? Porque el código orientado a objetos no se limita a mover funciones a métodos y datos a miembros.
En su lugar, un buen objeto debe ser responsable de todos sus datos y solo tomar los parámetros del método donde esos parámetros están definiendo los datos que serán operados.
Esto significa que no hay una asignación 1: 1 de funciones de procedimiento y estructuras de datos de procedimiento a las orientadas a objetos.
Al echar un vistazo no encontré ningún ejemplo que me importara en línea, así que simplemente daré mis reglas de refactorización para convertir el código de procedimiento a OOP.
El primer paso es simplemente empaquetar cada módulo como un objeto. En otras palabras, simplemente cree un objeto que contenga los datos y las funciones. Esto es horrible para un purista, pero tienes que empezar en alguna parte. Por ejemplo, si tenía un módulo de BankAccount, ahora tendrá un objeto de BankAccount.
Obviamente, a las funciones les estaban pasando los datos desde llamadas externas. Aquí está buscando cómo internalizar esos datos y hacerlos lo más privados posible. El objetivo debe ser que obtenga sus datos en su constructor (al menos el punto de partida) y elimine los parámetros que solían recibir los datos manualmente y sustitúyalos por referencias a los datos que ahora son privados. Al usar el objeto BankAccount, todo el acceso a la cuenta ahora se realiza a través de métodos en el objeto y los datos reales de la cuenta se han internalizado.
Muchas de sus funciones probablemente devolvieron versiones modificadas de las estructuras de datos: deje de devolver esos datos directamente y haga que estas modificaciones permanezcan dentro de las estructuras privadas. Cree propiedades de acceso que devuelvan sus datos privados cuando sea necesario y márquelos como "obsoletos" (su objetivo es hacer que el objeto sea el maestro de sus datos y solo devolver los resultados, no los datos internos). Con el objeto BankAccount, ya no devolvemos los datos reales de la cuenta, pero tenemos propiedades para CurrentBalance y métodos como AverageBalance (días int) para ver la cuenta.
Eventualmente, tendrá un conjunto de objetos independientes que aún se parecerán poco a lo que habría hecho si comenzara con objetos en su diseño, pero al menos puede continuar su refactorización con sus nuevos objetos. Mi siguiente paso generalmente es descubrir que los objetos creados a partir de dicha refactorización tienen muchas responsabilidades. En este punto, probablemente se hayan detectado algunos hilos comunes y debe crear objetos para refactorizar estas ideas comunes. Si tenemos BankAccount, probablemente tengamos otros tipos de cuentas y si alineamos los métodos de todos estos tipos de cuentas, podemos hacer que Account sea una clase base que implemente todas las funciones compartidas, mientras que BackAccount, SavingsAccount y otros implementan los detalles.
Una vez que la estructura de la clase comienza a tomar forma, es hora de sentirse mejor acerca de la conversión. La refactorización es un proceso, no un punto final, por lo que generalmente encuentro que la estructura de mi clase continúa evolucionando. Una de las cosas buenas de haber llegado hasta aquí es que sus datos son privados y manipulados a través de métodos, de modo que puede refactorizar los elementos internos cada vez más libremente a medida que avanza.
Una cosa que hace que esto sea plausible es tener buenas pruebas unitarias. Cuando realizo conversiones de procedimiento a OOP, a menudo mantengo el código antiguo como la "línea de base" para poder probar contra él. Es decir, la prueba puede verificar los resultados del sistema procesal anterior. Si no coinciden, es una buena idea averiguar por qué. Encuentro que a menudo hay un error ... pero a veces su nuevo código de limpiador está haciendo algo bien que estaba mal en el pasado.
Con respecto a la creación "demasiado profunda" de árboles de objetos: esto puede ser el resultado de volverse demasiado obsesivo con la herencia. Encuentro que los compuestos a menudo son una mejor idea, donde implementó las interfaces para múltiples objetos en lugar de tratar de obtener todas esas características en un solo objeto principal. Si se encuentra creando objetos principales que simplemente son mezclas de conjuntos de características, considere la posibilidad de simplificarlos creando una interfaz para cada conjunto de características e implementando esas interfaces.
Sé que esto está etiquetado como .net, pero un buen ejemplo provendría de PHP. Antes de PHP5, PHP solo estaba parcialmente orientado a objetos. Muchos desarrolladores de PHP tuvieron el mismo problema de captar la POO.
Zend tiene un artículo bastante bueno here . Debería ser bastante fácil de seguir.
Si siente que necesita una mejor dirección con el proceso de diseño orientado a objetos, puede consultar el Open CourseWare de MIT, específicamente Fundamentos de Ingeniería de Software (Lecture Notes # 2) o algo similar.
Una transición muy intuitiva de una API de C a una API de C ++ ocurre mucho en las bases de datos; así que para este ejemplo, echaremos un vistazo rápido a la diferencia en el uso de las API de MySQL.
No estoy seguro de poder copiar el código de estos sitios (no tengo idea de qué licencia es), pero consulte la sección "Crear una base de datos" para una demostración de C y la Muestra # 1 para una demostración de C ++; Ambos pasos a través de la creación de una base de datos MySQL mediante programación.
En la API de C, el primer argumento de cada función es un "identificador" de la base de datos. En la API de C ++, trabajamos con un objeto de conexión de base de datos que llama implícitamente a la API de C con su manejador privado.
Para ver un ejemplo muy específico, para ejecutar la consulta una vez que se ha generado, tenemos en C:
mysql_query(conn, "create database testdb")
y en C ++:
query.execute();
La gran diferencia aquí es que el enlace de C ++ solo te muestra todo lo que necesitas ver, mientras que en C debes ser muy explícito sobre cada pequeño detalle.
Creo que las API de la base de datos son una buena manera de aprender algunos principios de OOP, por lo que espero que también puedan ayudarlo.