Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > La Taberna
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2016
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Al recuerdo que hace un tiempo nos habías comentado sobre esa forma de usar el with, ¿Puede ser? ¿O recuerdo mal?

Suelo tener mis diferencias con Mario, pero creo que en esta coincido sobre como debería ser declarado el uso del with. Se me hace que si el problema del with pasa por su problema de ambigüedad y nomeclatura, la forma más familiar al estilo de Object Pascal debería tener la construcción "With As Do"

Ahora bien, también siento que de llevar esa forma de usarlo, al final no elimina nada... más bien está escondiendo un problema dentro de otro.
Como bien lo señala Agustín, ahora el problema se traduce en nombres de variables cortos.

La verdad es que entre tener esto:

Código Delphi [-]
With.Algo := ...

O el tener esto:

Código Delphi [-]
Clave.Algo := ...

Siendo Clave:

Código Delphi [-]
with TMiObject.Create as Clave do

No hemos ganado mucho que digamos.
Y la técnica sucia del nombre corto del ejemplo de Agustín, no deja de ser otra forma de llegar a lo mismo.

Aún así, considero que el with podría recibir algún tipo de mejora... y que merece cierta compasión y no pasarlo por la guillotina (no todavía...)
El problema de ambigüedad y debilidad del with se da cuando no se puede distinguir el objeto de referencia del resto de los posibles objetos con los que podría "interactuar". Porque hay casos en los que no hay problemas de distinción, como el ejemplo de muestra que hay en Delphi Basics:

Código Delphi [-]
type
  // Declare a customer record
  TCustomer = Record
    firstName : string[20];
    lastName  : string[20];
    address1  : string[100];
    address2  : string[100];
    address3  : string[100];
    city      : string[20];
    postCode  : string[8];
  end;

 var
  John, Sarah : TCustomer;

 begin
  // Set up the John's customer details
  With John do
  begin
    firstName := 'John';
    lastName  := 'Smith';
    address1  := '7 Park Drive';
    address2  := 'Branston';
    address3  := 'Grimworth';
    city      := 'Banmore';
    postCode  := 'BNM 1AB';
  end;

Si la mejora pasa por tener alguna "marca" que elimine esa ambigüedad ¿Porqué no pensar en algún carácter especial, como el & para indicar que lo que sigue pertenece al objeto con el que se está haciendo uso en la construcción With? Así podríamos entonces esperar cosas como:

Código Delphi [-]
 begin
  // Set up the John's customer details
  With John do
    &firstName := FirstName; // FirstName podría ser una variable global... & es la marca e identifica a John

Aunque esto no me suena muy Object Pascal friendly... Quiero pensar que podría hacerse de alguna otra forma. Yo por el momento no soy capaz de pensar otra alternativa de llevarlo a cabo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #2  
Antiguo 18-09-2016
avmm2004 avmm2004 is offline
Miembro
 
Registrado: jun 2006
Ubicación: Santa cruz de Tenerife, Islas Canarias
Posts: 500
Poder: 18
avmm2004 Va por buen camino
El with tiene fallos importantes .... a la hora de depurar un programa los objetos referenciados con with no muestran su valor en el popup etc.
A mi me da que no esta del todo bien implementado en el lenguaje o en el ide. Un fallo de esos con la cantidad de veces que se depura un programa es
muy importante. Por lo menos en delphi xe2 y xe4 falla.

Yo por NORMA no lo utilizo.
Responder Con Cita
  #3  
Antiguo 18-09-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Delphius Ver Mensaje
Código Delphi [-]
 begin
  // Set up the John's customer details
  With John do
    &firstName := FirstName; // FirstName podría ser una variable global... & es la marca e identifica a John
Esto me hizo recordar (no se de donde) otra forma de hacerlo y que no quedaria tan mal:

Código Delphi [-]
 begin
  // Set up the John's customer details
  With John do
    .firstName := FirstName;
    .lastName := LastName;
    .fullName := capitalize(.firstName  + " " + .lastName);
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 19-09-2016
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Ahora mismo voy a ver si en el foro de Lazarus/Free Pascal han dicho algo de esto, y si no encuentro nada lo comento a ver qué dicen.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #5  
Antiguo 19-09-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Al González Ver Mensaje
Hago una propuesta "políticamente incorrecta" para Delphi / Object Pascal: Mejorar la sintaxis de los modernos compiladores Pascal (como es el caso de Delphi)
A primeras decir que no veo porqué es "políticamente incorrecta" esta propuesta Al. Me parece más "políticamente incorrecta" el eliminar directamente el WITH. El hecho de proponer mejoras no veo porqué debe serlo (y más si lo enfrentamos a la propuesta de eliminarlo)

Cita:
Empezado por Al González Ver Mensaje
Mejorar la sintaxis de los modernos compiladores Pascal (como es el caso de Delphi) respecto al uso de la palabra reservada With.
El problema que le veo a esto Al (independientemente de gustos) y por lo que pienso que no debe hacerse es por un tema de compatibilidad. Es más, me cuesta mucho pensar que se vaya a eliminar de pronto un comando, cuando eso provocaría que, infinidad de código de programas, librerías y componentes dieran erores en lugares que antes eran corectos. Y además sin la posibilidad de "convertir" código a una nueva versión.
Creo que es añadir un problema "sin ninguna necesidad".
Me explico; Si vas a cambiar los componentes de conexión a Base de Datos, sabes que vas a introducir "un problema" en los códigos existentes a la hora de actualizar, pero es "necesario", pero en este caso es crear un problema donde no lo hay.

Es el mismo caso del GOTO. ¿Porqué no se ha eliminado el GOTO de la sintaxis de Object-Pascal/Delphi? Me da la sensación de que es por lo mismo.
¿Qué necesidad hay?

A saber cuantos códigos tendrán algo como esto:

Código Delphi [-]
procedure TForm1.FormClick(Sender: TObject);
label
  mensaje2;
begin
  Goto mensaje2;
  MessageDlg('Mensaje 1', mtInformation, [mbOK], 0);
mensaje2:
  MessageDlg('Mensaje 2', mtInformation, [mbOK], 0);
end;

GOTO saludo;

saludo:
Un saludo
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 19-09-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por mamcx Ver Mensaje
Esto me hizo recordar (no se de donde) otra forma de hacerlo y que no quedaria tan mal:

Código Delphi [-]
 begin
  // Set up the John's customer details
  With John do
    .firstName := FirstName;
    .lastName := LastName;
    .fullName := capitalize(.firstName  + " " + .lastName);
Si no mal recuerdo, es Visual Basic, donde sucede esto, y también me parece bien. Por lo menos, si se trata de meter un caracter extra, pues mucho mejor el punto que el ampersand.


Yo voy más de acuerdo con la comparativa con el goto. No hay necesidad. Lo que es necesario es hacer que la gente programe bien, que tenga buenas técnicas y en tal caso, el with, al igual que el goto, serán evitados en su mayoría de veces. Incluso el goto es usado, aunque muchos lo nieguen o lo desconozcan, cada vez que usan un break o un continue.

Más me gustaría, por ejemplo, ampiar el uso del case a strings, cosa que, a diferencia del with, no rompería ningún código.

LineComment Saludos
Responder Con Cita
  #7  
Antiguo 19-09-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
Más me gustaría, por ejemplo, ampiar el uso del case a strings, cosa que, a diferencia del with, no rompería ningún código.

LineComment Saludos
Aunque caro en algún momento nos enseñó como se hace tal cosa con el string, estoy de acuerdo que debería ser más natural y extenderse aún más la funcionalidad del case, como lo hacen otros lenguajes.

En cuanto al tema principal del hilo de marras, encuentro atractiva la propuesta que expone Al, sin embargo pienso que si voy a usar un "Alias" para referirme a las referencias dentro del with (Ya sea punto, ampersand, with...) pues para eso sigo sin usarlo... ya que el punto le puede quitar claridad al código y el "with" pues... para usar la palabra with con todo y reglas, mejor uso el nombre del objeto ya instanciado.

Aunque puede ser que mi opinión esté un poco marcada por el hecho de haber decidido hace tiempo, no seguir usando dicha sentencia y no me ha hecho falta... es más, creo que eso me ha evitado muchos problemas y tener que reescribir cosas.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #8  
Antiguo 19-09-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
No estoy de acuerdo con dejarlo pero advertir que no es buena práctica. Imaginar a Marco Cantu diciendo: "miren, tenemos una sintaxis que es el with, recomendamos no usarlo, pero hay código viejo dando vueltas por ahí, así que no lo sacamos por eso" me parece absurdo. En el peor de los casos estaría bien la posibilidad de "activar" el with usando alguna directiva de compilación. Pero sigo pensando que es dedicarle tiempo a una tontería, porque el mensaje es siempre el mismo: no conviene usar el with.

Sería preferible ir por el camino de SmallTalk en donde no existe el "void" o el "no retorno" de un método; traducido a Delphi sería que los métodos que no son funciones devuelvan siempre el objeto receptor

Evidentemente sería un problema para las propiedades porque no habría forma de discernir entre sí el siguiente método va para el objeto inicial, o para el retorno de la propiedad. Estaríamos obligados a usar "setters" así que no es tan viable

Aún así sostengo que prefiero que inviertan el tiempo en otras cuestiones
Responder Con Cita
  #9  
Antiguo 19-09-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por AgustinOrtu Ver Mensaje
No estoy de acuerdo con dejarlo pero advertir que no es buena práctica. Imaginar a Marco Cantu diciendo: "miren, tenemos una sintaxis que es el with, recomendamos no usarlo, pero hay código viejo dando vueltas por ahí, así que no lo sacamos por eso" me parece absurdo.
Es cuestión de enfoques. Lo que a ti te parece absurdo a mi me parece razón más que suficiente para no tocar el with. Ahora, qúe diga exactamente Marco Cantú, no lo sé. Aquí, por lo menos, habla de su uso, sus ventajas y desventajas, sin tomar realmente partido.

Yo soy de los que, en ocasiones, usa el with; normalmente sin anidarlos y asignando exclusivamente propiedades del registro u objeto en cuestión. Es, para mi, una manera clara -al leer por encima el código- de decir, ESTO es lo que voy a hacer con el registo/objeto.

Cita:
Empezado por AgustinOrtu Ver Mensaje
En el peor de los casos estaría bien la posibilidad de "activar" el with usando alguna directiva de compilación.
De acuerdo, aunque la opción por defecto tendría que ser width activado

Cita:
Empezado por AgustinOrtu Ver Mensaje
traducido a Delphi sería que los métodos que no son funciones devuelvan siempre el objeto receptor

Evidentemente sería un problema para las propiedades porque no habría forma de discernir entre sí el siguiente método va para el objeto inicial, o para el retorno de la propiedad. Estaríamos obligados a usar "setters" así que no es tan viable
Además de no ser viable, sería, éso sí, una fuente de confusión. Tendríamos la versión moderna del código espaghetti tipo jQuery.

Cita:
Empezado por AgustinOrtu Ver Mensaje
Aún así sostengo que prefiero que inviertan el tiempo en otras cuestiones
De acuerdo en esto.

LineComment Saludos
Responder Con Cita
  #10  
Antiguo 20-09-2016
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Esto se está poniendo espeso.

En el foro de Lazarus no se está discutiendo mucho, aunque sí hay algunos apuntes interesantes. Lo traduciría pero, creedme, mi capacidad de concentración está hoy bajo mínimos.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #11  
Antiguo 19-09-2016
bitbow bitbow is offline
Miembro
 
Registrado: jul 2006
Posts: 366
Poder: 18
bitbow Va camino a la fama
Y alguien sabe si existe alguna alternativa en los compiladores modernos? algo coo un alias (por ejemplo los de SQL)?

Personalmente lo uso por que en algunos caso es complicado tener caenas de codigo tan largas, visualmente es molesto.

Saludos.
__________________
¡Ni como ayudarte Niño!!
bitbow
Responder Con Cita
  #12  
Antiguo 19-09-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por bitbow Ver Mensaje
Y alguien sabe si existe alguna alternativa en los compiladores modernos? algo coo un alias (por ejemplo los de SQL)?
Ya mamcx mencionó arriba que en Python (aunque no es compilado) existe una versión with con alias.

LineComment Saludos
Responder Con Cita
  #13  
Antiguo 19-09-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Lo del with en Delphi es mas porque es un lenguaje que no es conciso y no tiene como declarar vbles fuera de su bloque. Pero en general es algo superfluo e innecesario en la mayoria de los lenguajes.

En python se usa por una razon diferente y es que encapsula el cierre automatico de un recurso, y eso lo hace UTIL.

En vez de:

Código PHP:

open('file.txt''r')
try:
   ...
finally:
  
f.close() 

Se hace:


Código PHP:

with open
('file.txt''r') as f:
   ..
   .. 
Asi que no solo acorta el codigo, sino que automatiza el manejo de recursos (y en algunos casos, mucho mas que darle el "close" a un objeto. Esto permite automatizar aun mas.)
__________________
El malabarista.
Responder Con Cita
  #14  
Antiguo 20-09-2016
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
El uso del with, gusto los colores, por que alguno no le guste usar el with o le resulte complicado su uso, no es para eliminarlo, en mis proyectos uso el with en todo y, nunca he tenido ningún problema referente a el, incluso con el debug, eje.
Código Delphi [-]
...
begin
  with TfrmClientes.Create(Self) do
  begin
    ShowModal;
    Free;
  end;
end;
Otro:
Código Delphi [-]
...
var
  frmC: TfrmClientes;
begin
  frmC := TfrmClientes.Create(Self);
  with frmC do
    ShowModal;
  FreeAndNil(frmC);
end;
Otro mas:
Código Delphi [-]
...
begin
  with Edit1, Label1 do
    Text := Caption;
end;
Si no sabes como utilizar el with o te confunde, pues, evita su uso, es una herramienta bastante util al menos para mí, no veo que se deba suprimir, si lo que se pretende es evolucionar su sintaxis, estoy totalmente de acuerdo, añadir with as ?? y el ?? sea el objeto, perfecto, pero de ahí a quitarlo, no veo ningún avance sino un perjuicio, si hacemos lo mismo con este último ej. seria asi.
Código Delphi [-]
...
begin
  with Edit1 as E1, Label1 as L1 do
  begin
    E1.Font.Color := clBlue;
    L1.Font.Color := clRed;
    E1.Text := L1.Caption;
  end;
end;
En este caso puedo hacer dentro del mismo with as ??, poner el color en ambos objetos, sin el uso de with as ??, sólo seria para el Label1, ya que es el último objeto que ha entrado en el with y, como ambos tienen el Font, la prioridad es del Label1.
Código Delphi [-]
...
begin
  with Edit1, Label1 do
  begin
    Font.Color := clRed;
    Text := Caption;
  end;
end;
de lo contrario tendria que hacer dos with, eje.
Código Delphi [-]
...
begin
  with Edit1 do
  begin
    Font.Color := clBlue;
    with Label1 do
    begin
      Font.Color := clRed;
      Text := Caption;
    end;
  end;
end;
Que esto es confuso, según para quién, el que esta acostumbrado a utilizarlo, no veo ninguna confusión en el.

Si el with as ?? evoluciona de esta manera, perfecto, pero que no sea obligatorio usar el with as ?? y que se pueda utilizar como uno quiera, with sólo o con with as ??.

Un saludo.

p.d.: Espero haber contribuido a la no expulsión del with y si a su evolución.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #15  
Antiguo 20-09-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por olbeup Ver Mensaje
Que esto es confuso, según para quién, el que esta acostumbrado a utilizarlo, no veo ninguna confusión en el.
Confuso es, aunque sepamos cómo funciona y qué hace. Pero si alguien viene de otro lenguaje y ve eso, lo encontrará confuso, porque es confuso.
Es como el idioma chino, es confuso, aunque los chinos dirán que lo entienden, pero confuso es.
Responder Con Cita
  #16  
Antiguo 20-09-2016
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Pero si alguien viene de otro lenguaje y ve eso, lo encontrará confuso, porque es confuso.
Como VB, C#, C++, java, Python, todos utilizan el with de una forma mejor definida en su sintaxis, porque conoce el lenguaje, el mio es delphi.

Cualquier lenguaje de programación utiliza atajos como el with e incluso SQL Server, Oracle se utiliza with

Por que se deveria de quitar el with en delphi?, en base de datos como las que he nombrado, ¿por que las utilizan?, porque son utiles.

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Analogías entre C++ y Object Pascal noob C++ Builder 3 16-02-2009 18:19:54
como usar object pascal y gtk Lionheart OOP 6 09-12-2005 19:31:08
manual de excepciones de object pascal para free pascal??? Garion OOP 3 27-05-2005 00:42:29
¿Object Pascal para todo? ReigDidion OOP 10 12-02-2004 08:28:07


La franja horaria es GMT +2. Ahora son las 07:55:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi