Asociación de Desarrolladores de Videojuegos Argentina
Julio 30, 2010, 01:31:47 *
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: ADVA tiene nuevo foro!
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: 1 2 3 4 [5] 6 7 8 9
  Imprimir  
Autor Tema: Con respecto a C++  (Leído 8933 veces)
david
Moderador Global
Usuario
*****
Desconectado Desconectado

Mensajes: 1131



Ver Perfil WWW
« Respuesta #60 en: Mayo 18, 2008, 05:09:11 »

Sobre la performance, encontre un sitio donde comparan la performance de managed código en C# contra unmanaged en C++
http://www.csharphelp.com/archives2/archive458.html

Las velocidades son mas lentas con C#, como era de esperarse por usar una maquina virtual.

Saludos!
« Última modificación: Mayo 18, 2008, 05:10:50 por david » En línea

Nikko_Bertoa
Usuario
*
Desconectado Desconectado

Mensajes: 605



Ver Perfil WWW
« Respuesta #61 en: Mayo 18, 2008, 07:44:48 »

Tengo una duda de ignorante.
Porque dicen que la manera OOP de pensar los problemas a codificar es mala?
En línea

My Game Programming Portfolio:

https://sites.google.com/site/nicolasbertoa/
El Hombre Gris
Usuario
*
Desconectado Desconectado

Mensajes: 130


True Believer


Ver Perfil
« Respuesta #62 en: Mayo 18, 2008, 09:12:56 »

Porque dicen que la manera OOP de pensar los problemas a codificar es mala?

Me perdí la parte en que alguien dice que "la manera OOP de pensar los problemas a codificar es mala". Ocurrió todo lo contrario, pero ya me canse de repetir una y otra vez lo mismo, así que disculpame si soy brusco, ponete a estudiar más el tema, empezando por releer el libro de Stroustrup, o leerlo por primera vez, cual sea el caso.

Nuevamente te pido perdón por ser brusco pero no me gusta perder el tiempo. Mi interés por seguir respondiendo en este thread caduco más o menos a la altura en que confundiste "Literatura" por "Idiomas", y argumentaste algo así que por ser programación de videojuegos podes mandar a la mierda todo el resto y usar C++ porque todos los videojuegos grandes se hacen con C++, lo cual de por si es una argumento falaz además de una tradición estúpida.
En línea
Nikko_Bertoa
Usuario
*
Desconectado Desconectado

Mensajes: 605



Ver Perfil WWW
« Respuesta #63 en: Mayo 18, 2008, 09:23:18 »

Perdon hice la pregunta para atras.
Lo que no entendi y me parece interesante saber es porque el OOP es malo para la reusabilidad del codigo (basado en herencia y esas cosas).
En línea

My Game Programming Portfolio:

https://sites.google.com/site/nicolasbertoa/
Nikko_Bertoa
Usuario
*
Desconectado Desconectado

Mensajes: 605



Ver Perfil WWW
« Respuesta #64 en: Mayo 18, 2008, 09:26:13 »

Y nucna dije descartar  todo el resto, para nada. Lo que pasa que yo dije que segun lo que lei y los game jobs que vi piden programadores C++ en el campo de videojuegos, nunca dije que fuera en tooodos los campos ni tampoco que los demas campos de la programacion no servian.

En línea

My Game Programming Portfolio:

https://sites.google.com/site/nicolasbertoa/
david
Moderador Global
Usuario
*****
Desconectado Desconectado

Mensajes: 1131



Ver Perfil WWW
« Respuesta #65 en: Mayo 18, 2008, 11:07:09 »

Perdon hice la pregunta para atras.
Lo que no entendi y me parece interesante saber es porque el OOP es malo para la reusabilidad del codigo (basado en herencia y esas cosas).

No es malo hacer buen uso de OOP para poder reutilizar código. Creer que solamente porque usas OO tu código va a ser reutilizable es un error; y creo que es el error mas común que tiene la gente cuando empieza a aprender el paradigma de objetos. Creo que los profesores les gusta tirar ese tipo de cliches para que los alumnos se enganchen Lengua

El paradigma estructurado usado mal tampoco va a ayudar a la reutilización del código.

Hay un libro que me gusto mucho sobre Objetos que se llama Object Thinking, en ese libro te explica como tomar ventaja del paradigma de objetos desde un buen diseño de clases.

Saludos!
En línea

Pogacha
Usuario
*
Desconectado Desconectado

Mensajes: 562



Ver Perfil WWW
« Respuesta #66 en: Mayo 19, 2008, 12:03:57 »

Me divertí mucho leyendo este thread (por favor no lo corten)
En línea

El Hombre Gris
Usuario
*
Desconectado Desconectado

Mensajes: 130


True Believer


Ver Perfil
« Respuesta #67 en: Mayo 19, 2008, 12:17:45 »

Lo que no entendi y me parece interesante saber es porque el OOP es malo para la reusabilidad del codigo (basado en herencia y esas cosas).

Te lo explico con un ejemplo.

Pensemos como implementar la lógica del tetris mediante OOP.

Alguien que piensa la reusabilidad por herencia llegaría a la conclusión que las piezas comparten casi todo salvo la forma, luego si hacemos una clase base que haga todo salvo definir la forma de la pieza, cada pieza tendría únicamente que completar una matriz que indique la forma y listo.

Un poco de pseudocódigo:

Código:
class FallingPiece {
  fall() { ... }
  moveLeft() { ... }
  moveRight() { ... }
  rotateLeft() { ... }
  rotateRight() { ... }
  occupies(x, y) { ... }
}

class TPiece : FallingPiece {
  TPiece() {
    this.shape[0][0] = FallingPiece.FILL;
    this.shape[1][0] = FallingPiece.FILL;
    this.shape[2][0] = FallingPiece.FILL;
    this.shape[1][1] = FallingPiece.FILL;
  }
}

A simple vista la clase base parece satisfacer un cierto grado de reusabilidad, ya que podriamos continuar usandola para cualquier tipo de pieza que se nos ocurra.

PERO

¿Qué pasa si ahora viene el game designer con una nueva propuesta de un juego que sigue una mecánica muy parecida a la del tetris pero donde las piezas estas compuestas por elementos de diferentes colores, y el objetivo es formar filas de tres o más elementos del mismo color (puzzle pirates)?

¿Podrías reusar el código anterior sin que este deje de funcionar también para la lógica del tetris original?

Acá es cuando la herencia viene y te dice "ah! gotcha sucker!" mientras realiza movimientos pelvicos oscilatorios (en el hipotético caso que un concepto pudiera hablar y tuviera una forma corpórea).

----

¿Cuál es el error en la implementación anterior?

La clase base está cumpliendo más funciones de las que debería. Al darle la responsabilidad de manejar la forma de las piezas rompimos la generalización de este objeto. En el momento en que cambio ligeramente la composición de esta forma, esta clase base dejo de ser utilizable.

Veamos ahora como hubiera sido lo mismo pensado desde la reusabilidad por interfase. En este caso buscamos cual es la interfaz común para todas las "piezas que caen". Tenemos que poder hacerlas caer un espacio a la vez, rotarlas y moverlas horizontalmente (lo mismo que contemplamos en el ejemplo anterior). No sabemos nada sobre la forma, eso lo sabe el objeto concreto para cada tipo de pieza, pero sabemos que ocupa cierto espacio. Necesitamos saber si la pieza ocupa o no cierta casilla del espacio de juego, pero la responsabilidad de responder a esto se la tenemos que pasar al objeto concreto (porque no conocemos la forma de la pieza). Sin embargo si sabemos un dato, que el objeto concreto necesita saber, el centro de la pieza, o sea, la posición central de la pieza (centro de rotación/traslación).

Luego veamos el pseudocódigo:

Código:
class FallingPiece {
  protected x, y, angle;
// las acciones estas las puede manejar la clase base ajustando los valores de posición
// y observando los cambios para detectar colisiones
// pero no le hace falta saber a priori la forma
  fall() { ... }
  moveLeft() { ... }
  moveRight() { ... }
  rotateLeft() { ... }
  rotateRight() { ... }
// esto se lo tenemos que dejar al objeto concreto
  virtual occupies(x, y);
}

class TPiece : FallingPiece {
  occupies(x, y) { ... }
}

Ahora, viene de nuevo el game-designer con su rip-off del tetris. ¿Qué hacemos?

Código:
class FallingColoredPiece : FallingPiece {
  virtual getColor(x, y);
}

class TwoColorsPiece : FallingColoredPiece {
  occupies(x, y) { ... }
  getColor(x, y) { ... }
}

----

Es un ejemplo medio burdo pero no sé me ocurrió nada mejor para explicar el tema.

OOP no es malo para la reusabilidad, solo requiere un cuidado extra en el diseño. Lo que sucede es que muchas veces genera la falsa sensación de reusabilidad, y es difícil extirpar estas malas prácticas (en especial cuando hay profesores que las enseñan como buenas).

----

El paradigma estructurado usado mal tampoco va a ayudar a la reutilización del código.

(Psst... ojo que el paradigma estructurado es el de "quememos al GOTO en la hoguera y usemos estructuras de control", no tiene nada que ver con el paradigma procedural. Tanto paradigma confunde mucho Giñar )
« Última modificación: Mayo 19, 2008, 12:23:55 por El Hombre Gris » En línea
Ni7ram
Usuario
*
Desconectado Desconectado

Mensajes: 341


watá!


Ver Perfil WWW
« Respuesta #68 en: Mayo 19, 2008, 01:30:13 »

Muy interesante todo la verdad..

Ya estoy comprando todos los libros que pusieron.
En línea

Martín Cardozo
Game Developer
Blog de Desarrollo
YouTube Channel
Nikko_Bertoa
Usuario
*
Desconectado Desconectado

Mensajes: 605



Ver Perfil WWW
« Respuesta #69 en: Mayo 19, 2008, 02:00:04 »

Creo que entendi, estuvo bueno el ejemplo.
La conclusion que saque es q si se generaliza de mas, tas chau
En línea

My Game Programming Portfolio:

https://sites.google.com/site/nicolasbertoa/
Nightwish
Visitante
« Respuesta #70 en: Mayo 19, 2008, 02:34:35 »

Me divertí mucho leyendo este thread (por favor no lo corten)

somos 2 ^^
En línea
El Hombre Gris
Usuario
*
Desconectado Desconectado

Mensajes: 130


True Believer


Ver Perfil
« Respuesta #71 en: Mayo 19, 2008, 03:34:08 »

Creo que entendi, estuvo bueno el ejemplo.
La conclusion que saque es q si se generaliza de mas, tas chau

Es al revés, cuando especializas más de la cuenta viene el problema. La clase base tiene que cumplir solo las condiciones genéricas del objeto modelado. En el caso anterior el programador puede caer en la tentación de colocar la implementación de aquello que define la forma en la clase base, rompiendo la generalización. Esta forma de "reusabilidad" se la llama a caja abierta, ya que las piezas que extiendan a la clase base conocen como es la implementación usada en la clase base.

Cuando se habla de reusabilidad a caja cerrada, los objetos que extienden la clase base desconocen la implementación, solo conocen la interfase que esta presenta. El problema que surge con esto es que muchas veces te obliga a repetir código, o a utilizar complejos mecanismos de herencia múltiple. Para solucionar esto se propuso usar patrones de diseño, que son soluciones genéricas a este tipo de problemas. Por ejemplo, en el caso planteado antes, se podría usar el patrón Bridge, que desacopla la abstracción del objeto de su implementación.

Yendo más a concreto, para implementar el patrón Bridge en el ejemplo del tetris, deberíamos modelar la implementación de la forma de las piezas por separado. Creamos una clase abstracta PieceShape, y asignamos un atributo a FallingPiece que sea de este tipo, y dejamos la responsabilidad de dar una instancia concreta para este objeto a la pieza especializada (que es la que conoce como se debe implementar la forma).

En este último caso no estamos rompiendo la generalización de la clase base, ya que en efecto las piezas tienen una forma, pero visto desde la clase base es algo abstracto del que desconocemos su implementación.
« Última modificación: Mayo 19, 2008, 08:55:37 por El Hombre Gris » En línea
El Hombre Gris
Usuario
*
Desconectado Desconectado

Mensajes: 130


True Believer


Ver Perfil
« Respuesta #72 en: Mayo 19, 2008, 04:46:29 »

Ya estoy comprando todos los libros que pusieron.

Agrega a la lista el GoF:

http://www.mnlibros.com.ar/DespLibro.asp?Libro=8478290591

No es fácil conseguirlo. Lo traen poco y se agota rápido.

Igual es como todo en el desarrollo de software, siempre se tiende al abuso, y del abuso de los patrones de diseño surgen los antipatrones. El caso más ejemplar del momento es el abuso del MVC, donde muchos programadores están basando la arquitectura entera en un patrón de diseño, tratando de encajar toda la lógica en el mismo. Pero, bueno, eso da para una discusión más larga y flameada.
En línea
Nikko_Bertoa
Usuario
*
Desconectado Desconectado

Mensajes: 605



Ver Perfil WWW
« Respuesta #73 en: Mayo 19, 2008, 07:29:48 »

Justamente eso no seria que si generalizas de mas, es decir, si metes algun atributo que esta de mas en la generalizacion, despues se te arma lio ?
En línea

My Game Programming Portfolio:

https://sites.google.com/site/nicolasbertoa/
El Hombre Gris
Usuario
*
Desconectado Desconectado

Mensajes: 130


True Believer


Ver Perfil
« Respuesta #74 en: Mayo 19, 2008, 09:12:58 »

Fe de erratas

El proceso opuesto a la generalización se denomina especialización, no especificación.

Perdón por el error.

Justamente eso no seria que si generalizas de mas, es decir, si metes algun atributo que esta de mas en la generalizacion, despues se te arma lio ?

No, en el modelado tenés dos procesos básicos para modelar la herencia, la generalización y la especialización. En la generalización buscas un modelo común a todos los objetos, de modo que descartas atributos hasta solo quedarte con los que son comunes a todos. El proceso inverso es la especialización, en donde añadís atributos que enfoquen más el modelo en un conjunto menor de objetos.

La generalización resulta en clases más abstractas, la especialización resulta en clases más concretas.

El problema surge cuando especializas una clase abstracta con el propósito de "reutilizar" código.

Un ejemplo bien simple de esto es, en una clase que modela un Conjunto implementas internamente el conjunto como un array redimensionable. "Conjunto" es un concepto abstracto que lo único que implica es que el mismo contiene elementos sin ningún orden. "Conjunto implementado mediante arrays" es una especialización. Al desacoplar la clase abstracta Conjunto de su implementación concreta vas a poder reutilizar todas las funciones que hayas creado con conjuntos, aún si después decidís implementar conjuntos mediante listas enlazadas.
En línea
Páginas: 1 2 3 4 [5] 6 7 8 9
  Imprimir  
 
Ir a:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!