Ir al contenido


Foto

¿Estoy usando mal el tema de las clases?


  • Por favor identifícate para responder
5 respuestas en este tema

#1 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 19 marzo 2011 - 09:10

El problema es el siguiente , al crear un formulario y arrastrar por ejemplo 3 edits en el cual, 1 es nombre, otro es apellido, otro id, etc. Aumáticamente se le crean 3 atributos,entonces estoy algo complicado con el tema, ya que yo creo una clase diferente para administrar las diversas entidades del programa. como cliente, clase sistema, etc y bien por ejemplo como el form1 tiene sus atributos ya que son los edits , no sé si debo volver a crear los atributos en la otra clase osea atributos nombre,apellido y id,pero solo hago métodos no creo que se la forma correcta , yo generalmente solo hago métodos en la clase para manejar los datos pero en esos métodos creo parametros y les paso los edits como atributos por lo tanto en esa clase no uso atributos, no sé estoy usando mal el concepto .¿ debo crear los atributos en la otra clase y pasarle los edits por un constructor ?,o simplemente dejarlo así, gracias de antemano.

  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 marzo 2011 - 07:47

Hola Master23,

Ha decir verdad no te entendí bien del todo. ¿Te molestaría si te pido que nos des un ejemplo de lo que estás haciendo y sobre cual es tu duda al respecto?

Saludos,

  • 0

#3 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 20 marzo 2011 - 09:22

Hola Master23,

Ha decir verdad no te entendí bien del todo. ¿Te molestaría si te pido que nos des un ejemplo de lo que estás haciendo y sobre cual es tu duda al respecto?

Saludos,

Por supuesto amigo delphius, aquí un ejemplo claro.


delphi
  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs;
  6. type
  7.   TForm1 = class(TForm)
  8.     Nombre: TEdit;
  9.     Apellido: TEdit;
  10.     Id: TEdit;
  11.   private
  12.     { Private declarations }
  13.   public
  14.     { Public declarations }
  15.   end;
  16. var
  17.   Form1: TForm1;
  18. implementation
  19. {$R *.dfm}
  20. end.


Este es el primero , como se puede ver en esa clase ya están hechos 3 atributos de tipo edit , que van a capturar los datos correspondientes, Nombre,Apellido,Id . Yo creo otra clase para manipular las entidades diferentes, como clase cliente y bueno, lo que quiero saber es, ¿Debo volver a crearle los atributos en la nueva clase ?, como la clase form tiene ya sus atributos entonces yo simplemente hago una clase como esta sin atributos y solo métodos,pero está mal según veo , aquí pueden ver un ejemplo:


delphi
  1. unit Unit2;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs;
  6.   type
  7.     TCliente = class(TObject)
  8.       private
  9.       {}
  10.       public
  11.         procedure InsertarDatos(Nombre:string;Apellido:string;id:integer);
  12.   end;
  13. implementation
  14.  
  15. procedure TCliente.InsertarDatos(Nombre: string; Apellido: string; id: Integer);
  16.   begin
  17.   //Digamos que aquí uso las variables nombre , apellido y Id para insertar a
  18.   //La base datos algunos de estos datos.
  19.   end;
  20. end.



Por lo tanto en la unidad principal hago lo siguiente y no uso atributos en la nueva clase si no que atravez de sus métodos les envio los parametros capturados en los atributos edits. Aquí veremos la forma de implementar en la clase form es que hago esto.


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. Cliente:TCliente;
  4. begin
  5. Cliente.Create;
  6. Cliente.InsertarDatos(Nombre.Text,Apellido.Text,StrToint(id.Text));
  7. Cliente.Free;
  8. end;


En conclusión , quiero saber si estoy aplicando mal el concepto al hacer esto, ya que una clase sin atributos, creo que no es correcto hacerlo , sin embargo no tiene sentido que le haga atributos nombre, apellido,id si en la clase form ya estan , simplemente hago métodos y se los paso como parametros para la inserción , espero que me puedan ayudar, gracias de antemano.
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 20 marzo 2011 - 03:59

Vaya por delante que yo no suelo crear objetos dentro de mis forms para tratar con las entidades que alli se editan, en parte porque mis fichas siempre editan un record sin mas, por lo que el propio dataset es, para mi, el sitio correcto donde tener los datos accesible a cualquier parte del form.

Aparte de eso, si lo quieres hacer bien, yo crearia en tu objeto cliente una propiedad "nombre" con un par de funciones GetNombre y SetNombre que lean y escriban sobre el field del dataset, asi "aislas" al objeto de depender de unos datos externos en su funcionamiento interno.

Si un dia lo necesitas, puedes cambiar esas dos funciones y hacer que tu objeto opere sobre una lista de objetos TCliente en memoria en lugar de un dataset, por decirte algo. Creo que eso es lo correcto, minimizar la dependencia de los datos a un solo punto concreto del objeto.
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 marzo 2011 - 07:53

Hola Master23,
Disculpa si no he respondido antes. Estoy bastante ocupado últimamente y no puedo darme demasiado tiempo.

Creo que como tu estás iniciandote en el tema POO para una primera aproximación va bastante bien.
Haces bien en preguntarte si te es útil o no esos atributos en la clase TCliente.
La respuesta puede ser un SI como un NO... todo depende del uso y diseño, de lo que se espera de la clase TCliente. ¿La usarás para algo más? ¿O en otro lado? ¿Quienes más invocan y/o crean objetos de cicha Clase? ¿Es posible o de esperarse que la clase TCliente deba regresar algún dato? Si, la respuesta fue si, entonces respóndete ¿Desde donde proviene o quien es (o debería) ser el dueño de dicho dato?
Esos tipos de preguntas te van a ir guiando para diseñar tus clases y la forma en como se van a ir comunicando y relacionando.

No puedo decir que SI, ni tampoco que NO. Es muy importante conocer bien el diseño, y contar con una mirada más global.

En principio, una clase que no tiene atributos podría ser catalogada como inútil, inservible, que no tiene sentido pero en realidad no necesariamente debe ser así. Justamente ahora se me ocurre un caso de una clase sin atributos: Una clase que realiza cálculos matemáticos varios:



delphi
  1. TCalculadora = class
  2. public
  3.   function Suma(X, Y: Double): Double;
  4.   function Sgn(X: Double): Double;
  5.   Function Transpose(A: TMatrix; var At: TMatrix): TResultMatrixOperation;
  6.   // ....
  7. end;



Para esta clase no se le han imaginado atributos, (aunque también se podría darle algunos) ya que todo los datos que necesita los recibe como parámetros. La idea, aparentemente, es centralizar todos los cálculos en una clase. A como está diseñada la clase, posee visibilidad por parámetros.

¿Es legal esto? Pues si, no viola en ningún momento el Análisis OO.

Volviendo a tu caso, ¿entonces? ¿Está bien? Si te resulta de utilidad pues si, ahora si únicamente esta clase hace de intermediario entre el Form y un DataModule (talvez) o incluso en forma directa hacia algún DataSet (Tables, Querys, etc) debes preguntarte ¿Y en el caso inverso, que sucede? Es decir: tu form se apoya en TCliente para pasar los datos hacia la DB, pero... cuando es desde la DB hacia el Form, ¿Cómo le encaras? ¿Hay alguna vinculación directa y ésta se trata de un camino alternativo o que evita al TCliente? Por dar un un caso típico a modo de ejemplo: el form tiene un DataSource para alimentar un DBGrid y justo éste está ligado a un TQuery (que está en un DataModule). ¿De que sirve el TCliente aquí?

¿Me explico? Si en un sentido pasas por la clase, y en el otro sentido (o en el mismo, incluso) hay una (y otra) manera de esquivarla ¿No crees que está más molestando que ayudando?
Esto es justamente lo que dice Sergio.

No quiero que te mortifiques demasiado. Sigue practicando los conceptos, a medida que los vas entendiendo tu visión del análisis y el diseño OO se te hará más rica y podrás encontrar nuevas cosas.
Entender el paradigma OO no es algo que se hace en días, es en meses (incluso de años  ;) )... No desesperes. Por mi parte puedo sugerirte la lectura del libro Introducción a la Programación Orientada a Objetos de Timothy Budd, pero debes primar las fuentes que haya recomendado y citado tu profesor en el programa.

Cuando ya tengas más cancha y estés metiéndote en UML te altamente aconsejo la lectura de UML y Patrones de Craig Larman. Ese libro te abre la cabeza de una manera no vista por lo general en la forma en como se dan las cátedras... logras entender muchísimo mejor el tema del Análisis y Diseño OO. Pero primero lo primero: aprende bien los conceptos OO, practica y practica.

Seguramente tu profesor en no mucho tiempo les enseñe una técnica en la que apoyarse: las tarjetas CRC (Clase, Responsabilidad, Colaboración). La idea de esta "tarjeta" es conseguir listar las responsabilidades de la clase como a sus colaboradores, de ese modo uno puede darse una idea si la clase es más una controladora que no sabe delegar, o si por el contrario ha delegado demasiado.

Saludos,
  • 0

#6 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 20 marzo 2011 - 09:10

Muchas gracias delphius, excelente estoy revisando los libros que me recomendaste muchas gracias por tomar de tu preciado tiempo , para responderme esta inquietud, y muchas gracias Sergio igualmente por tu ayuda.
  • 0




IP.Board spam blocked by CleanTalk.