Aprender estructuras, conceptos...

B

Buenas.

Antes de nada, aclarar que programar 'ya sé'. Quiero decir, he hecho las tipicas aplicaciones CRUD en varios lenguajes (PHP, Python, C...). Que van con sus funciones basicas y medio estructurado. Cuando quieres meter algo mas, te sale codigo espagueti por un tubo (como es normal en gente sin idea), la cual no deja de ser 'programacion estructurada'.

Quiero dar un paso mas alla, pero no se por donde tirar, ya que cuando buscas, por ejemplo, programacion orientada a objetos empiezan a salir un monton de pdf's, webs, tutoriales, a lenguajes como Java, C++... en los cuales te ponen un ejemplo y a tirar millas. No explican el concepto en sí (bueno, miento, sí, pero en 3 lineas y buscate la vida).

Cabe destacar que el ingles no es mi fuerte (me defiendo, pero nada a grandes niveles). He visto el 'The Art of Computer Programming' pero me parece un poco tochazo para empezar por ahí, ¿no?.

No se si me he explicado correctamente o he vuelto a hacer la misma pregunta que formule en su dia en /feda xD.

Un saludo.

TeNSHi

Para C++ posiblemente te interese como programar en C/C++ de Deitel/Deitel

1
luzius

#1 Para Java hay un libro muy bueno que se llama head first design. Echale un ojo, creo que es justamente lo que buscas.

1
herre

#1 El TAOCP es muy jarcor para empezar.

Busca Design Patterns + <tu lenguaje favorito> y escoge el libro que más mejor te parezca.

Independientemente de que lenguage vayas a usar, merece la pena que cacharres un poco con programación funcional. No hace falta que aprendas Haskell, pero intenta juntar algo utilizando funciones puras, map, filter and reduce (lee sobre todo esto) en el lenguaje que puedas (python y C no se prestan mucho a esto; javascript, ruby o incluso ahora java son mejores opciones; racket o haskell si quieres ir all in).

Lee Buen Código (ejemplos de python) (Ejemplos de C: sqlite git) (Tip: bajate el repositorio y ve al primer commit para examinar una versión funcional pero más sencilla)

Si no has leido nada sobre estructuras de datos, hay una serie de temas que te van a poner las pilas: Intenta implementar una base de datos, una máquina virtual, un compilador, un mulador, un motor de expresiones regulares, un VCS, un motor gráfico 3D.

Puede parecerte que te pilla muy grande pero si escoges algo que te interese, lees sobre el funcionamiento e intentas implementar la versión absolutamente más simple posible seguro que es mucho más fácil de lo que te esperabas

2
p0stm4n

El TAPCP, es para aprender algoritmos, a nivel de super detalle en ensamblador, la mayoría de los algoritmos ya vienen implementados por defecto en la mayoría de lenguajes de alto nivel. tú lo que quieres es aprender a organizar tu código.

Primero y antes de nada creo que deberías aprender sobre patrones arquitectónicos (Architectural patterns) que digamos van a dar la estructura a tu aplicación. Según lo que estes haciendo hay que elegir entre uno y otro, por lo general, un tipo de arquitectura muy utilizado es de 3 capas (3-tier layer) compuesta de una capa de datos, una capa de lógica de negocio y una capa de presentación:

Derivados de esta arquitectura sirven para aplicaciones de escritorio o aplicaciones web (MVC, etc.)

Si por ejemplo, quieres hacer un chat, tendrás que elegir una arquitectura cliente-servidor separando el código entre uno y otro, aunque compartirán funcionalidad común, y tanto el cliente como el servidor utilizarán una arquitectura de 3 capas.

Un framework es una librería que además tiene incluido por defecto, uno o varios patrones arquitectónico. Pensemos por ejemplo, en Express de Node.js o Django de Python, ambos son frameworks web especificos, que te ayudan a estructurar bien el código.

Una vez que ya tienes planificado los patrones arquitectónicos que vas a utilizar, ya te vas a lo específico, y como ya te han comentado arriba, utilizando patrones de diseño (Design patterns), esto son abstracciones de mejores prácticas ya utilizadas anteriormente con éxito por muchas personas.

Supongamos que tenemos una aplicación gráfica de escritorio estándar con conexión a una base de datos, utilizaría arquitectura de 3 capas y para cada capa podría utilizar los siguientes patrones (aunque podrían ser otros):

Patrones de diseño para capa de datos:

  • Modelos: datos estructurados que se corresponderian con la base de datos

  • ORM: abstracción entre el modelo de la aplicación y la base de datos.

  • DAO: Clase de ayuda (fachada) que facilita la manipulación entre los modelos y el ORM

Patrones de diseño para capa de lógica de negocio:

  • Controller/Fachada: representa las acciones del usuario, 1 método por cada acción de usuario y estos métodos pueden ir en 1 o más controladores. Ejemplo: un usuario hace click en guardar cambios del contenido de una ventana, un método de un se encargaría de su tratamiento que enviaría los datos del modelo cambiados al DAO.

Patrones de diseño para capa de presentación:

  • Vista: Clases que son simplemente de representación de una ventana, 1 vista por cada ventana de la aplicación, los métodos de los botones irán en el controller.

Espero que con esto te halla podido ayudar :) .

4 1 respuesta
DarkSoldier

#5 has ayudado a muchas personas seguro, y me incluyo :-) un gran resumen que ayuda a clarificar cosas, +100

Gif

MIT 6.006 Introduction to Algorithms, Fall 2011

MIT 6.851 Advanced Data Structures, Spring 2012

Pon subtítulos si lo necesitas.

Libros:

Robert Sedgewick And Kevin Wayne - Algorithms 4th Ed
Thomas H. Cormen And Charles E. Leiserson - Introduction to Algorithms 3th Ed

Estos dos son de Machine Learning y AI:

Hal Daumé III- A Course in Machine Learning
Daniel Shiffman - The Nature of Code

1
DarkSoldier

mira acabo de verlo y esta bastante bien

1

Usuarios habituales