Yo propongo esta nueva clasificación.
Salud OS
Obtenida de....... ?
Saludox !
P.D. Me gusta más
Escrito 27 octubre 2010 - 11:51
Yo propongo esta nueva clasificación.
Salud OS
Escrito 27 octubre 2010 - 11:54
Obtenida de....... ?
Escrito 27 octubre 2010 - 12:01
Yo propongo esta nueva clasificación.
Salud OS
Obtenida de....... ?
Saludox !
P.D. Me gusta más
Escrito 27 octubre 2010 - 12:06
Escrito 27 octubre 2010 - 12:22
Escrito 27 octubre 2010 - 01:25
Escrito 27 octubre 2010 - 01:48
unit Unit2; interface uses SysUtils, StrUtils; var variablePublica: string; function funcionPublica(const a,b: integer): variant; implementation var variablePrivada: string; function funcionPrivada(const aPriv, bPriv: integer): variant; begin if AnsiUpperCase(variablePrivada) = 'SUMA' then result := aPriv + bPriv; if AnsiUpperCase(variablePrivada) = 'RESTA' then result := aPriv - bPriv; if AnsiUpperCase(variablePrivada) = 'MULTIPLICA' then result := aPriv * bPriv; if AnsiUpperCase(variablePrivada) = 'DIVIDE' then result := aPriv / bPriv; end; function funcionPublica(const a,b: integer): variant; begin variablePrivada := variablePublica; result := funcionPrivada(a,b); end; end.
uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin unit2.variablePublica := ComboBox1.Text; showMessage(unit2.funcionPublica(strtoint(Edit1.Text),StrtoInt(Edit2.Text))); end;
Escrito 27 octubre 2010 - 02:25
implementation type MiClase = class private FCampo: Integer; procedure SetCampo(const value: integer); function GetCampo: Integer; public property Campo: Integer read GetCampo write SetCampo; end; { MiClase }
Escrito 27 octubre 2010 - 02:45
Escrito 27 octubre 2010 - 03:53
Que bueno que este hilo lo viera la gente de embarcadero
Saludos!
Escrito 27 octubre 2010 - 05:10
Que bueno que este hilo lo viera la gente de embarcadero
Saludos!
Probablemente solicitarían primero los key de cada uno para autenticar la copia de delphi
Escrito 28 octubre 2010 - 01:07
Bueno, es que la misma estructura de una Unit permite generar métodos y variables públicas (sección Interface) y privadas (sección Implementation) de forma directa incluso sin la necesidad de crear objetos.
Veamos un código sencillito:
delphi
unit Unit2; interface uses SysUtils, StrUtils; var variablePublica: string; function funcionPublica(const a,b: integer): variant; implementation var variablePrivada: string; function funcionPrivada(const aPriv, bPriv: integer): variant; begin if AnsiUpperCase(variablePrivada) = 'SUMA' then result := aPriv + bPriv; if AnsiUpperCase(variablePrivada) = 'RESTA' then result := aPriv - bPriv; if AnsiUpperCase(variablePrivada) = 'MULTIPLICA' then result := aPriv * bPriv; if AnsiUpperCase(variablePrivada) = 'DIVIDE' then result := aPriv / bPriv; end; function funcionPublica(const a,b: integer): variant; begin variablePrivada := variablePublica; result := funcionPrivada(a,b); end; end.
Y su llamada desde la unidad principal:
delphi
uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin unit2.variablePublica := ComboBox1.Text; showMessage(unit2.funcionPublica(strtoint(Edit1.Text),StrtoInt(Edit2.Text))); end;
Como podrán ver, no se puede acceder a la variable privada ni a la función privada, lo cual, desde mi punto de vista, le dá una razón de existir a dicha estructura, que no tiene que ver si llegase a ser obsoleta o no.
Salud OS
unit Unit2; uses SysUtils, StrUtils; public var variablePublica: string; function funcionPublica(const a,b: integer): variant; begin variablePrivada := variablePublica; result := funcionPrivada(a,b); end; private var variablePrivada: string; function funcionPrivada(const aPriv, bPriv: integer): variant; begin if AnsiUpperCase(variablePrivada) = 'SUMA' then result := aPriv + bPriv; if AnsiUpperCase(variablePrivada) = 'RESTA' then result := aPriv - bPriv; if AnsiUpperCase(variablePrivada) = 'MULTIPLICA' then result := aPriv * bPriv; if AnsiUpperCase(variablePrivada) = 'DIVIDE' then result := aPriv / bPriv; end; end.
Escrito 28 octubre 2010 - 01:49
Cuando tu escribes un
TForm = class(TForm1)
En dicho pas, lo que estás haciendo es definir una clase. No un objeto.
El ver luego cosas como en tu ejemplo la asignación de algunas propiedades va en sentido contrario a la norma ya que se pierde sentido. Se ha pasado de definir una clase a definirse un objeto.
Java tiene algo similar a Delphi en esto del .dfm, al menos eso es lo que tengo entendido. No uso C# por lo que no sabría decir como es que funciona lo que comentas.
Cuando definimos la clase, además la estamos implementando. Suena lógico por tanto que toda su declaración esté en implementation. Luego, si ha tenerse alcance público, en interface se podría llevar la lista de los debidos elementos (no sólo las clases).
¿El porqué está su declaración en interface? Porque el compilador necesita definir y tener acceso a su descripción a fin de determinar el alcance de su visibilidad.
Considero que la sección interface podría estar para llevar la visibilidad externa el resto queda oculto. Por ello sostengo que debe existir la sección interface e implementation.
Sobre la existencia de clases privadas u públicas... pues... existen amigo. Existen. De hecho es legal hacerlo en Delphi:
delphi
implementation type MiClase = class private FCampo: Integer; procedure SetCampo(const value: integer); function GetCampo: Integer; public property Campo: Integer read GetCampo write SetCampo; end; { MiClase }
Como he dado, un ejemplo de caso práctico es la presencia de una clase fachada que es la clase visible, e internamente el resto de las clases. La Fachada da el resto a las demás y delega y reparte las funcionalides. Su nombre lo indica: la fachada es sólo una "interfaz" que lleva a que se centre en un punto todo el resto.
El cambio es cambio, y debe aceptarse. No es que esté en contra del cambio, sino que ese cambio sea lo más razonable y llevadero. Y no que lleve a un proceso cercano a una reingeniería completa que conduzca a una cirujía muy peligrosa. Tan peligrosa que tire años de trabajo por la borda.
Saludos,
Escrito 28 octubre 2010 - 08:39
Hola Marc,Hola Delphius.
No coincido contigo aquí. Estamos hablando siempre solo de las clases formularios (y frames, ...). Solo en estas clases (las que ahora llevan archivo .dfm) se van a inicializar algunas de sus propiedades.
¿ Pero que problema hay en eso ?, yo no lo veo contra norma, ni definiendo un objeto. Muchas clases en su código de creación se inicializan y dan valores por defecto a sus atributos, ... Esto es lo que hacemos en mi propuesta en el evento OnCreate, inicializamos los formularios de esta clase, dándole sus valores por defecto.
Después ya está en manos de tu código el cambiar esos atributos para hacer que una instancia determinada sirva a las necesidades concretas de un momento determinado.
Creo que me explicado antes. Una cosa es la inicilización, otra el valor por defecto y por último la asignación que uno le indica.No sé en que se diferencia esto a cualquier otra clase de Delphi (que también se inicializan con valores predeterminados en su creación).
Marc, a veces pienso que tu ya lo vez a eso como por vagancia.Esto creo que ya lo hablamos hace poco, sinceramente las necesidades del compilador me tienen sin cuidado. No entiendo esta mala costumbre de Delphi de obligarnos a escribir de más solo para que el compilador tenga la información mascada.
El punto es que no lo usé al compilador como argumento, sino que fue un simple comentario del porqué necesitaba que una clase esté en interface para poder determinar su visibilidad.El compilador no lo usaría nunca como argumento.
Eso ya lo discutimos antes. Repito... tomaste mis palabras sobre el compilador como si fuera una defensa cuando en esta ocasión fue un simple comentario aclaratorio.Me niego a trabajar de más para ponerle las cosas más fáciles al compilador. Podemos discutir sobre legibilidad del código, funcionalidad, elegancia, etc. ... pero sobre el compilador no, el compilador que espabile un poco, es una herramienta a nuestro servicio, no somos los programadores quienes estamos al servicio del compilador (como cuando nos obliga a marcarle si un método es dinámico o virtual), si esa información la puede detectar él, no deberían obligarnos a declararla explícitamente.
He visto tu ejemplo. Da lo mismo si la sección se llama interface/implementation o public/private.Eso mismo ha comentado egostar. Le he sugerido una sintaxis explícita para public y private en la Unit, con un ejemplo.
Pues te digo que te equivocas. Esa clase SI es privada, sólo se puede usar dentro de esa unit. Cualquier otra unidad que tenga en uses la unidad no podrá ver la clase MiClase.Delphius, en este ejemplo MiClase no es una clase privada, esta clase se puede utilizar por cualquier módulo que enlace esa Unit. Por tanto la clase es pública (hasta donde yo lo entiendo).
Unidad.MiClase;
Creo que no me entendiste nada bien. Quisiera preguntarte si tienes conocimiento sobre patrones.Y respecto a una clase fachada con métodos y atributos privados internos donde delega y reparte la funcionalidad, eso funciona exactamente igual con mi sugerencia de integrar declaración e implementación.
Lo siento, sigo sin ver ninguna diferencia entre la visibilidad de las declaraciones actuales en Delphi y las que se pueden conseguir integrando la declaración y la implementación.
TMiClase = class private procedure Foo; end; procedure TMiClase.Foo; begin // aqui el código end;
Escrito 28 octubre 2010 - 08:42
Creo que aquí es donde diferimos de verdad. A mi no me importaría ver de vez en cuando una buena sacudida en el lenguaje, aunque pierdas completamente la compatibilidad hacia atrás.
NOTA: Sinceramente, ¿ cuan útil es la compatibilidad hacia atrás ?. Cuando intentas portar un programa que escribiste en Delphi 6, hace 10 años, a un Delphi actual, el mayor problema no te lo encuentras en los cambios del lenguaje, sino en los componentes que utilizaste. ¿ De donde sacas esos FastReports 2 o QuantumGrid 3, etc. ... ?, esas versiones no están disponibles para las versiones actuales de Delphi, además tampoco querrías utilizarlas (¿ para que te actualizas entonces ?), vas a tener que utilizar las versiones actuales de esos componentes de terceros. Y los fabricantes de componentes si que no se preocupan mucho por la compatibilidad hacia atrás. Un report FastReports 2 no tiene nada que ver con uno FastReports 4, incluso el formato de archivo ha cambiado. Una grid QuantumGrid 3 ha cambiado totalmente sus propiedades y estructura de clases respecto a las grids QuantumGrid 6. El trabajo de portar ese código antiguo a una versión actual de Delphi es enorme, por lo que ya no te viene de ahí si encima tienes que adaptar un poco también el código Pascal.
Escrito 28 octubre 2010 - 08:54
Escrito 28 octubre 2010 - 09:01
Creo que ha estas alturas será mejor partir el hilo y moverlo a debate.
¿Que opinan?
Saludos,
Escrito 28 octubre 2010 - 09:27
Pues que no me decido en donde cortarlo
Hace un rato que esperaba lo hiciera alguien
Salud OS
Escrito 28 octubre 2010 - 09:33
Escrito 28 octubre 2010 - 12:57
El asunto es que eso lleva a más código.... cuando son pocos forms el lio no es demasiado, pero en los aplicativos de muchos forms es demasiado confuso.
En el dfm solo quedan los valores específicos atribuidos, y distinto al default, a un form, frame y sus controles/componentes. Los valores por defecto son asignados por el compilador de forma totalmente automática cuando se crean. Me parece a mi que por unos pocos cambios y el ahorrarse unos pocos kbs de un .dfm no vale la pena llevar esto al código.
He visto tu ejemplo. Da lo mismo si la sección se llama interface/implementation o public/private.
Es medio confuso ya que la cláusula public y private las empleamos dentro de una clase. Pero no es nada grave.
Ahora tengo una pregunta, según tu ejemplo, ¿en donde pondrías la clase?
Pues te digo que te equivocas. Esa clase SI es privada, sólo se puede usar dentro de esa unit. Cualquier otra unidad que tenga en uses la unidad no podrá ver la clase MiClase.
Delphius, en este ejemplo MiClase no es una clase privada, esta clase se puede utilizar por cualquier módulo que enlace esa Unit. Por tanto la clase es pública (hasta donde yo lo entiendo).
Te invito a hacer la prueba. Es más, no es posible verla aún haciendo esto:
delphi
Unidad.MiClase;
Creo que no me entendiste nada bien. Quisiera preguntarte si tienes conocimiento sobre patrones.
Y respecto a una clase fachada con métodos y atributos privados internos donde delega y reparte la funcionalidad, eso funciona exactamente igual con mi sugerencia de integrar declaración e implementación.
Una Fachada es una clase con visibilidad pública. No interesa como está diseñada, si tiene atributos, métodos y propiedades privados, protegidos, y/o públicos.
El punto es que la clase Fachada actúa de enlace entre la clase cliente y un conjunto de clases privadas que al cliente no le interesa.
Y sigo sin comprender el porqué debamos mezclar en la definición la implementación del código de los métodos.
Como en mi ejemplo, preferiría que esté la clase en implementation/private y tener el tradicional:
delphi
TMiClase = class private procedure Foo; end; procedure TMiClase.Foo; begin // aqui el código end;
Es mucho más fácil de leer y entender.
TMiClase = class private procedure Foo; begin // aqui el código end; end;