PDA

Ver la Versión Completa : Campaña para corregir el uso de 'With' en Object Pascal


Al González
17-09-2016, 19:03:45
Hago una propuesta "políticamente incorrecta" para Delphi / Object Pascal: Mejorar la sintaxis de los modernos compiladores Pascal (como es el caso de Delphi) respecto al uso de la palabra reservada With. En las altas esferas existe la intención de desaparecer este estatuto de control por lo perjudicial de su sintaxis en el moderno Object Pascal de estos días.

Desafortunadamente dicha idea ha permeado en muchas de las mentes de colegas con menos cuota de poder, incluso en algunos compañeros de este foro cuya inteligencia no está por debajo de la de quienes deciden el rumbo del lenguaje. Este dogma se ha instalado cómodamente, bajo el "poderoso" argumento de que el With debe desaparecer simplemente porque es malo. ¡Y vaya que lo es! Pero si fue útil durante tantos años es porque también ayuda mucho a simplificar el código que escribimos. Yo evito usarlo desde hace algún tiempo. Estoy consciente de lo terrible que es, pero también de lo bueno que podría seguir siendo si lo mejoramos. Hace un par de años intenté otra propuesta de mejora. Hubo un debate intenso y no se llegó a nada. Incluso admito que mi idea de entonces no era tan buena. Puede que dentro de otros dos años piense lo mismo de esta que les traigo ahora; o quizá esta vez daré, o propiciaré que alguien más preparado que yo dé en el clavo.

Viendo solo sus bondades, hay lógica y sentido común en el uso de With. Evitemos que se siga usando mientras su sintaxis siga siendo riesgosa. Pero invitemos a los fabricantes de compiladores a corregirlo, en lugar de enterrarlo. Todos aquellos que deseen apoyar esta idea (sin que ello les avergüence o les haga comprometer sus intereses) pueden hacer eco de este mensaje, de la imagen que anexo al final o de este tweet (https://twitter.com/algonzalez74/status/777158345710985216).

Quizá las futuras generaciones de programadores Delphi/Lazarus se sientan un poquito más afortunadas gracias al apoyo que reciban iniciativas como la presente.

Muchas gracias. :)

Al González.

mamcx
17-09-2016, 19:09:27
En python se usa asi:


with open('file.txt', 'r') as f:
f.read()
d.write(...)


Zero ambiguedad.

Al González
17-09-2016, 19:27:19
En python se usa asi:


with open('file.txt', 'r') as f:
f.read()
d.write(...)


Zero ambiguedad.
Entonces en el ejemplo de la imagen que subí hay -1 ambigüedad. ;)

¿Apoyas la propuesta? :)

Casimiro Notevi
17-09-2016, 19:49:52
Interesante propuesta.
No soy partidario de eliminarlo, aunque no lo uso nunca porque puede ser peligroso y no queda claro el código. Sin embargo, con una serie de reglas como las que indicas, sí me parece bien que se mantenga.

mamcx
17-09-2016, 20:00:05
El problema es que esta propuesta, la escuchara el dueño de Delphi? Y de hacerlo, creara los medios para migrar el codigo?

Lo dudo.

No es que sea muy dificil ver que se puede arreglar en un lenguaje, es que es mas facil agregar que quitar, y ni siquiera en los open source se ve mucho que se animen a quitar.

Casimiro Notevi
17-09-2016, 20:03:31
Me ha parecido entender que se pretende modificar para que sea más seguro y no haya equívocos o ambiguedades en el código, ¿no es eso?

Al González
17-09-2016, 20:12:41
El problema es que esta propuesta, la escuchara el dueño de Delphi?
Eso depende de ti, de cómo emplees tu tiempo y energía. El mundo mejora conforme decimos vale y actuamos; empeora cuando sólo nos detenemos a mirar las dificultades.

Al González
17-09-2016, 20:14:30
Me ha parecido entender que se pretende modificar para que sea más seguro y no hay equívocos o ambiguedades en el código, ¿no es eso?
¡Correcto! Eso pretende esta propuesta. :) ^\||/

Casimiro Notevi
17-09-2016, 20:19:49
¡Correcto! Eso pretende esta propuesta. :) ^\||/
Me apunto, aunque no se me ocurre cómo darle visibilidad :o

mamcx
17-09-2016, 21:28:37
Eso depende de ti, de cómo emplees tu tiempo y energía. El mundo mejora conforme decimos vale y actuamos; empeora cuando sólo nos detenemos a mirar las dificultades.

Entiendo que intentes ser optimista, pero con Delphi todo ha sido muy consistente por años.

Ahora bien, ve a los foros del dueño, haz la propuesta, habla con la gente dentro, si recibes el mas *minimo* de escucha te sigo encantado.

Y lo digo, porque eso es lo que he hecho antes. No hay como ser optimista cuando la *realidad* ha sido consistente.

Ademas, es un hecho que en la generalidad de los casos, no se recibe muy bien cambios en los lenguajes que impliquen romper codigo, mucho mas cuando aqui la comunidad delphi es MUY *reaciente* a cambiar.

Pero sabes que me encanta que me prueben equivocado, mas cuando eso resulta en que le vaya bien a Delphi.

P.D: Y apuesto que la misma respuesta la recibirias de FreePascal.

AgustinOrtu
17-09-2016, 22:37:26
A mi no me gusta el with en ninguna de sus formas, sabores y/o colores. En ningun lenguaje. Asi que de proponer algo, solamente se me ocurre matarlo; y si no lo matan, no usarlo. Asi de facil

Por mas que se implemente algo como lo de python, sigue teniendo el problema de que agrega un bloque mas al codigo, con un nivel de sangria adicional, el cual no hace para nada mas legible el codigo. Si el problema es que no gusta escribir "nombres largos de variables" se puede utilizar una fea tecnica que es crear una temporal con el nombre "corto"


procedure TFoo.Something;
var
ds: TDataSet;
begin
ds := Self.MyDataSet;

ds.Close;
ds.Open;
ds.FieldByName('foo');
// etc
end;


Aun asi, yo sigo pensando que las variables abreviadas siguen siendo malas (de ahi lo de feo) porque "ds" no me dice mucho. Es como cuando aprendemos a programar que no se porque motivo a las variables siempre las llamabamos: x, y, z, temp, aux, flag, etc..

Otra forma de atacar el problema es usar metodos encadenados, o interfaces fluidas (http://delphiaccess.com/foros/index.php/topic/12324-programacion-fluida-o-fluent/); basicamente todos los metodos que soporta la interfaz devuelven el objeto al que se le envio el mensaje; osea, todo devuelve Self y le puedo seguir encadenando llamadas a metodos.

De esta forma se puede usar una coleccion asi:


procedure Test;
var
Collection: Spring.Collections.IEnumerable<TMyClass>;
begin
Collection
.Where(function(const Each: TMyClass): Boolean
begin
Result := Each.Enabled;
end)
.Sort(function(const Left, Right: TMyClass): Integer
begin
Result := Left.Index - Right.Index;
end)
.ForEach(procedure(const Each: TMyClass)
begin
WriteLn(Each.Name);
end);
end;

mamcx
17-09-2016, 22:42:42
El problema con Delphi es que la sintaxis es muy "verbosed" y no se presta para hacer código conciso; ademas el tener que declarar las vbles en su bloque. Ambos son puntos a favor del lenguaje, pero hay cosas con las que el codigo deja de ser idiomatico.

Lo mismo con las interfazes fluidas y muchas otras cosas.

Para visualizar un lenguaje en el espiritu de pascal pero mas "conciso" este es el mejor ejemplo que conozco:

http://nim-lang.org/

AgustinOrtu
17-09-2016, 22:59:30
Entiendo que intentes ser optimista, pero con Delphi todo ha sido muy consistente por años.

Ademas, es un hecho que en la generalidad de los casos, no se recibe muy bien cambios en los lenguajes que impliquen romper codigo, mucho mas cuando aqui la comunidad delphi es MUY *reaciente* a cambiar.


No es del todo cierto, Mario. Embarcadero muchas veces ha dado como "excusa" el no querer hacer X o Z por justamente lo que comentas, no romper un moton de codigo que ya existe, cuando no se puede preservar la compatibilidad hacia atras.

Pero en muchos otros casos si han "obligado" a ciertos cambios que se han mantenido consistentes desde el dia #1.

Por ejemplo, los string en Delphi desde toda la vida fueron 1-based, soportan COW: simplemente al asignar un nuevo valor a un string, la RTL se encarga de todo. En realidad lo que terminamos teniendo es un string que internamente es "inmutable", pero se tiene cierta "sintaxis sugar" que permite tratarlos como mutables, sin tener que andar usando StringBuilders. Otros lenguajes matarian por poder hacer algo asi. Todo eso esta muy bien en Delphi, pero solo es "estable" en el compilador para Windows

Para los compiladores moviles, los string son 0-based, y aun no, pero en el futuro, podrian volverse "realmente" inmutables (http://docwiki.embarcadero.com/RADStudio/Berlin/en/Migrating_Delphi_Code_to_Mobile_from_Desktop#Use_0-Based_Strings):


Immutable Strings: If you want to change a character inside an immutable string, you have to break two or more, and combine these portions, or use a TStringBuilder.

For example, the following common operation (indexing into a string and modifying the string) cannot be done with immutable strings:

S[1] := 'A';

If you use a string operation such as this, the Delphi mobile compilers emit the warning W1068 Modifying strings in place may not be supported in the future (Delphi). At some point, this warning is to be replaced by an error; you can convert it into an error right now on the Hints and Warnings page in Project Options.

We Recommend Using TStringHelper to Handle Strings in Mobile and Desktop Apps


Eso cambia mucho el codigo que ya existe!!. Por ejemplo: Quien no ha usado la funcion System.Pos (http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Pos). Bien, esa funcion solo sirve para strings con indice 1-based; no sirve para las 0-based. Para solucionarlo, "solamente" debemos usar TStringHelper.IndexOf. En toda nuestra base de codigo.

No solamente pasa con Pos; lo mismo sucede con: Copy, Delete, Trim.. basicamente hay que reescribir el codigo que maneja strings.

En un principio, los compiladores para moviles soportaban el tipo UTF8String (http://docwiki.embarcadero.com/Libraries/Berlin/en/System.UTF8String). Luego, no se en que version, lo sacaron. Ahora en la ultima, 10.1 Berlin, esta de nuevo.


Entonces, no quiero criticar porque las cosas cambian; para mejorar, hay que cambiar. Si se pierde cierta compatibilidad hacia atras, "lo lamento": no se puede pretender que el codigo que esta escrito en Delphi en el año 2000, funcione sin tocarle absolutamente nada en 2016; no se hasta que punto se puede decir que es una "feature" que el codigo tan legado funcione: es tiempo de refactorizar y mejorar el codigo legado para que use las caracteristicas mas nuevas. Sino, no tiene mucho sentido actualizar el compilador "porque si"

Lo que si es para criticar, es que Embarcadero se jacte de decir: "no queremos perder la compatibilidad hacia atras", y se ponga a jugar con los string (entre otras cosas) como lo ha estado haciendo

Delphius
18-09-2016, 19:11:12
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:

With.Algo := ...

O el tener esto:

Clave.Algo := ...

Siendo Clave:

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:


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:

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,

avmm2004
18-09-2016, 19:56:07
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.

mamcx
18-09-2016, 21:38:07
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:

begin
// Set up the John's customer details
With John do
.firstName := FirstName;
.lastName := LastName;
.fullName := capitalize(.firstName + " " + .lastName);

Ñuño Martínez
19-09-2016, 11:11:45
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.

Neftali [Germán.Estévez]
19-09-2016, 13:26:10
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)

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: ;);)


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

roman
19-09-2016, 16:05:05
Esto me hizo recordar (no se de donde) otra forma de hacerlo y que no quedaria tan mal:

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

jhonny
19-09-2016, 17:00:19
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.

AgustinOrtu
19-09-2016, 17:59:32
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

roman
19-09-2016, 18:38:35
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í (http://www.marcocantu.com/epascal/Spanish/ch05stat.htm), 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.


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 :D


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.


Aún así sostengo que prefiero que inviertan el tiempo en otras cuestiones

De acuerdo en esto.

LineComment Saludos

bitbow
19-09-2016, 18:51:53
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.

roman
19-09-2016, 18:59:55
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

mamcx
19-09-2016, 20:00:44
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:



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



Se hace:




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.)

Delphius
19-09-2016, 20:20:43
Que debate nos dejó Al ¿he? :p

Yo tampoco uso with. Me acostumbré a no usarlo desde el comienzo.
Desconozco si hay mucho código en la VCL que esté fuertemente atado al with como para tratar de justificar su existencia por la compatibilidad hacia atrás.
Agustin tiene razón al decir que no se puede pretender tener compatibilidad hacia atrás 100%, en algún momento algo sale caro y deberá toquetearse. Es inevitable.

Yo tengo la creencia que puede tener su cuota de uso y comodidad, bajo ciertas condiciones. Por eso no veo tan necesario mantener la postura de que debiera de desaparecer.

Ahora hay que encontrar el equilibrio entre su mal uso o mala práctica, la facilidad que aporta, y que cuente con una forma segura de poder identificar adecuadamente la construcción (objeto, record, etc) inequivocamente.

Saludos,

mamcx
19-09-2016, 20:38:18
Ahora hay que encontrar el equilibrio entre su mal uso o mala práctica, la facilidad que aporta, y que cuente con una forma segura de poder identificar adecuadamente la construcción (objeto, record, etc) inequivocamente.

Pero eso nos deja en el mismo punto. Si todo depende de que "cada cual se supone que lo debe usar bien", pues así es como es ahora. Y si se cambia la sintaxis para que no se ambiguo, eso hace incompatible el código anterior (a menos que haya un reformateador de código que reescriba el with donde aparezca, recursivamente a todas las dependencias - como que solo se ha funcionado exitosamente con GO-).

A diferencia del GOTO que tiene casos de uso especializados utiles, el WITH es pura conveniencia. En tal caso, entre "medio-cambiarlo" o quitarlo es mejor quitarlo y así no hay ambigüedad en que hacer (igual apuesto que la mayoría de los programadores ni lo usan). La otra es dejar tal cual, y que "cada cual se asegure de usarlo bien".

----
Si ahora que he investigado como hacer un lenguaje me estreso, no me imagino lo que sera manejar un lenguaje y años despues, pensar en corregir algun problema.

Cuando se ha hecho (caso reciente: Python 3) los cambios han sido traumáticos.

Aqui hay que quitarse el sombrero con los diseñadores de GO, que desde el principio anticiparon este lio y crearon una herramienta que formatea el código para que se vea consistentem, y de paso auto-convierte la sintaxis y llamadas a librerías para salir de los problemas y de llamadas "deprecated". Y la comunidad entera lo usa de forma rutinaria:

https://golang.org/cmd/gofmt/

Sin este tipo de herramientas, este tipo de mejoras es muy difícil de implementar en la practica.

Incluso, el problema que mencionaron de como Delphi rompe las expectativas en como funcionan los STRING en móviles subraya el lio: A la final, es lo que los diseñadores del lenguaje necesite AHORA, y les salga fácil: Y mirar pa' atras y arreglar correctamente? Eso es de lo mas anomalo en nuestra industria.

Al González
19-09-2016, 22:56:57
En el debate de Twitter ya se está considerando usar "It". Aunque eso dé pie a todo tipo de referencias jocosas a la película del payaso (o la novela de S.K.) por parte de los detractores del With. :D

Marcelo: "&" ya tiene otro uso en Object Pascal.

Jhonny: La expresión en la cabecera del With, como cualquier otra expresión de código, no necesariamente es una variable; puede tratarse de una llamada a método que no quisieras hacer más de una vez. Por lo cual se necesita una variable. No creo que sea buena idea permitir declarar variables después del Begin (lo hecho con Except es excepcional).

El With que propongo es para uso moderado. Limitándolo a un sólo elemento (objeto/registro) por cabecera, impidiendo el anidamiento de bloques With y agregando una variable implícita (como la actual Result o el parámetro Self) —propongan nombres para la misma si It o la misma With no gusta—, más una directiva de compilación que permita activar la nueva sintaxis (predeterminadamente inactiva por las siguientes n versiones), al cabo de un tiempo habremos conseguido enmendar la trampa sintáctica que supone y ocurre con el With actual. La compatibilidad hacia atrás es importante, y las directivas temporalmente opcionales hacen de estas transiciones pasajes menos traumáticos. Sin olvidar que estaremos evitando muchos bugs futuros gracias a esto.

Una vez pactada su practicidad teórica, será más eficaz impulsar el cambio en los compiladores y estándares. No dejen de alimentar el debate, ¡hay que corregir al infame With!

Un cordial saludo.

Al González.

jhonny
20-09-2016, 00:54:45
Jhonny: La expresión en la cabecera del With, como cualquier otra expresión de código, no necesariamente es una variable; puede tratarse de una llamada a método que no quisieras hacer más de una vez. Por lo cual se necesita una variable. No creo que sea buena idea permitir declarar variables después del Begin (lo hecho con Except es excepcional).

Bueno sí, es que he asumido que le paso el resultado del método a dicha variable y con dicha variable es que trabajaría, así no llamo el método varias veces (Como se asumo que la mayoría con un poco de conciencia sobre este asunto ha hecho), además simplemente puedo liberarla sin miedo a que me libere otra cosa distinta si es que ya no la necesito al final.

Delphius
20-09-2016, 01:14:51
En el debate de Twitter ya se está considerando usar "It". Aunque eso dé pie a todo tipo de referencias jocosas a la película del payaso (o la novela de S.K.) por parte de los detractores del With. :D

Marcelo: "&" ya tiene otro uso en Object Pascal.

Jhonny: La expresión en la cabecera del With, como cualquier otra expresión de código, no necesariamente es una variable; puede tratarse de una llamada a método que no quisieras hacer más de una vez. Por lo cual se necesita una variable. No creo que sea buena idea permitir declarar variables después del Begin (lo hecho con Except es excepcional).

El With que propongo es para uso moderado. Limitándolo a un sólo elemento (objeto/registro) por cabecera, impidiendo el anidamiento de bloques With y agregando una variable implícita (como la actual Result o el parámetro Self) —propongan nombres para la misma si It o la misma With no gusta—, más una directiva de compilación que permita activar la nueva sintaxis (predeterminadamente inactiva por las siguientes n versiones), al cabo de un tiempo habremos conseguido enmendar la trampa sintáctica que supone y ocurre con el With actual. La compatibilidad hacia atrás es importante, y las directivas temporalmente opcionales hacen de estas transiciones pasajes menos traumáticos. Sin olvidar que estaremos evitando muchos bugs futuros gracias a esto.

Una vez pactada su practicidad teórica, será más eficaz impulsar el cambio en los compiladores y estándares. No dejen de alimentar el debate, ¡hay que corregir al infame With!

Un cordial saludo.

Al González.
De los variados caracteres y símbolos posibles, me ha parecido que el más "amigable" con el uso y significado de With era el & ya que éste significa "Y". Como una manera de decir "con tal objeto hacer esto Y esto otro".

Emplear el punto como si fuera el método, me parece que puede dar a confusiones también. Y el uso de dos puntos también ya tiene su usos en el lenguaje.
Si la propuesta pasara por emplear un único caracter identificador entre los tradicionales y de rápido tecleo están @, #, $, %, ^, * y si nos ponemos a ver a todos esos tienen su "uso y significado"
Entonces me dije, ¿Y acaso no usamos la doble comilla cuando escribimos a mano para ahorrarnos escribir lo mismo una y otra vez? ¿Porqué no darle entonces el mismo uso a la pobre chica?

with Objecto do
begin
"Propiedad := algo;
"HacerAlgo();
// etc...
end;

Es una forma de decir: Idem. Pero sigamos con las palabras ya que los símbolos pueden resultar un tanto faltos de expresión... Miremos a Idem... ¿No es una bella palabra para decir justamente "lo mismo"? ¿O acaso no usan esta expresión en sus escritos? ;)
No me parace una mala idea.

si It la debiéramos de descartar porque resulta graciosa, la otra posibilidad es usar That. :p Tampoco es que se pierda demasiado en la "traducción". Pero ya tenemos una forma de decirlo sin jugarse demasiado. Idem es una expresión que viene del latín... ¡la conocemos "todos"!

La posible directiva podría ser $IdemInWith ON/OFF o $FlagInWith ON/OFF ya que el uso de la directiva obliga "identificar" o señalar con la palabra That/It/Idem o la que sea elegida que se está por referise al objeto en cuestión.

Saludos,

Al González
20-09-2016, 04:52:57
Esto se está poniendo bueno. :)

Jhonny: Comprendo lo que dices, pero no olvidemos que precisamente With te ahorra tener que declarar una variable y asignarle el valor de la expresión.

Estas cosas parecen baladíes para algunos, pero si se cae en la cuenta de que el empleo de recursos elegantes para ahorrar código mejora sensiblemente su comprensión, se concluye también que no permitir al With evolucionar sería como derribar un viejo, útil, pero riesgoso puente (o seguir con él), en lugar de construir un puente más seguro y probablemente más útil.

Marcelo: Es de imaginar que no seamos los únicos que hemos pensado en el símbolo de la doble comilla. Como podrás ver, esa fue mi propuesta de hace dos años: http://rescatandoadelphi.blogspot.mx/2014/03/my-proposal-for-better-delphi-with.html
Y este uno de los debates donde defendí la idea: http://www.delphifeeds.com/go/f/113867

Sin embargo, hoy estoy más convencido de que deberíamos utilizar una palabra y no un símbolo, para no ir en contra de la filosofía del precioso Pascal. Y he de decir que me va atrayendo más la idea de que dicha palabra no sea una palabra reservada, sino un identificador no declarado como los que ya existen en el lenguaje (Self, Result). It me gusta, y ahora que lo mencionaste, me parece que Idem no está del todo mal.

Germán: Espero haber dado a entender que no se trata de cambiar algo de la noche a la mañana, sin pensar en la compatibilidad hacia atrás. Reitero lo de las directivas de transición, que ya en otros casos se han utilizado con mucho éxito.

Por otra parte, les pido que no pierdan de vista la ventaja de poder referirse al objeto "witheado" dentro del propio bloque With. Algo que el With tradicional no tiene.

Saludos veracruzanos lluviosos.

Al González. :)

Delphius
20-09-2016, 05:09:56
Esto se está poniendo bueno. :)

Jhonny: Comprendo lo que dices, pero no olvidemos que precisamente With te ahorra tener que declarar una variable y asignarle el valor de la expresión.

Estas cosas parecen baladíes para algunos, pero si se cae en la cuenta de que el empleo de recursos elegantes para ahorrar código mejora sensiblemente su comprensión, se concluye también que no permitir al With evolucionar sería como derribar un viejo, útil, pero riesgoso puente (o seguir con él), en lugar de construir un puente más seguro y probablemente más útil.

Marcelo: Es de imaginar que no seamos los únicos que hemos pensado en el símbolo de la doble comilla. Como podrás ver, esa fue mi propuesta de hace dos años: http://rescatandoadelphi.blogspot.mx/2014/03/my-proposal-for-better-delphi-with.html
Y este uno de los debates donde defendí la idea: http://www.delphifeeds.com/go/f/113867

Sin embargo, hoy estoy más convencido de que deberíamos utilizar una palabra y no un símbolo, para no ir en contra de la filosofía del precioso Pascal. Y he de decir que me va atrayendo más la idea de que dicha palabra no sea una palabra reservada, sino un identificador no declarado como los que ya existen en el lenguaje (Self, Result). It me gusta, y ahora que lo mencionaste, me parece que Idem no está del todo mal.

Germán: Espero haber dado a entender que no se trata de cambiar algo de la noche a la mañana, sin pensar en la compatibilidad hacia atrás. Reitero lo de las directivas de transición, que ya en otros casos se han utilizado con mucho éxito.

Por otra parte, les pido que no pierdan de vista la ventaja de poder referirse al objeto "witheado" dentro del propio bloque With. Algo que el With tradicional no tiene.

Saludos veracruzanos lluviosos.

Al González. :)
Sabía que ya recordaba de algún lado esto. ;) Lo que ya se me había olvidado fue tu propuesta de las comillas dobles... ¡Otra vez yo reinventando la rueda che! :D

Yo también veo más apropiado un identificador y no un símbolo. En lo que si difiero, o al menos, hasta ahora estuve pensando y considerando, es que Idem TIENE que ser palabra reservada. Se me hace que tal palabra sólo tiene sentido dentro de la estructura del with, por lo que ya que ésta es palabra reservada, por transición y uso Idem también debe serlo.

Saludos,

Al González
20-09-2016, 05:24:10
[...]Idem TIENE que ser palabra reservada. Se me hace que tal palabra sólo tiene sentido dentro de la estructura del with, por lo que ya que ésta es palabra reservada, por transición y uso Idem también debe serlo.
function es palabra reservada, Result no. :)

AgustinOrtu
20-09-2016, 06:52:39
Result y Self son pseudovariables

Al, podrías publicar un pequeño fragmento de código, mas o menos "real" (pensando por ej en el uso del absolute en el tweet del otro día) en donde un with es una buena herramienta y no un problema? Me da mucha curiosidad. Quizá mi ingenio aún no sea capaz de encontrar el yang dentro del with :)

En realidad he decidido que la postura de sacarlo es algo caprichosa. Es mas fácil para mí pensar que no existe y no usarlo, como un montón de gustos que son particulares de cada uno. Si en algún momento me tocase consumir código que está implementado con withs, mientras funcione como se espera que funcione, podre soportarlo :D

Roman, con lo de Marco Cantu, que fue un ejemplo, simplemente quería decir que quedaría muy feo desde el punto de vista comercial que Embarcadero o un vocero aparezca un día diciendo que algo nuevo que agregaron no es una práctica muy recomendable.

Neftali [Germán.Estévez]
20-09-2016, 08:18:45
Entiendo que la única utilidad del with dentro del lenguaje es eliminar determinadas "palabras" de forma reiterativa en un bloque de código.
Si resulta que para poder usar el with ahora vamos a introducir la necesidad de usar una nueva palabra, ¿no será mejor no utilizarlo?
Es decir, creo que usar el with (que creo que es lo que proponéis) usando un identificador (it o idem) es lo mismo (o es peor) que usar una variable y declararla del tipo correcto.

Me explico:

Ahora tenemos esto:


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;


Para solventarlo, proponemos crear una directiva condicional y obligar a escribir esto:


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


Creo que en comparación con esto, estamos liando las cosas...
Porque resulta que al final, para poder utilizar el with (cuya ventaja creo que es eliminar determinadas palabra repetitivas), estamos obligando al usuario a escribir más código con otra palabra que se repite (y menos entendible) que si escribiéramos el código natural.


var
John, Sarah : TCustomer;
begin
// Set up the John's customer details
John.firstName := 'John';
John.lastName := 'Smith';
John.address1 := '7 Park Drive';
John.address2 := 'Branston';
John.address3 := 'Grimworth';
John.city := 'Banmore';
John.postCode := 'BNM 1AB';


O no lo entiendo o no lo veo.

NOTA: El código de ejemplo está extraído de la explicación del WITH de DelphiBasics (http://www.delphibasics.co.uk/RTL.asp?Name=with).

Neftali [Germán.Estévez]
20-09-2016, 08:32:17
Y que conste que hay ejemplos en los que WITH puede tener sentido (y creo que es para lo que se pensó) como puede ser algo así (donde la parte a eliminar es muy grande):


dmClientesMain.objCliente.QueryClientes.FieldByName('ID').AsString := ID;
dmClientesMain.objCliente.QueryClientes.FieldByName('Nombre').AsInteger := 'Nombre';
dmClientesMain.objCliente.QueryClientes.FieldByName('Desc').AsString := 'Descripcion';
dmClientesMain.objCliente.QueryClientes.FieldByName('Telefono').AsString := '123456789';
...


Pero es que para estos casos, creo que esto:


var
q:TQuery;
begin
q := dmClientesMain.objCliente.QueryClientes;
q.FieldByName('ID').AsString := ID;
q.FieldByName('Nombre').AsInteger := 'Nombre';
q.FieldByName('Desc').AsString := 'Descripcion';
q.FieldByName('Telefono').AsString := '123456789';
...


Es más claro que esto, ya sea usando it o idem:


with dmClientesMain.objCliente.QueryClientes do
begin
it.FieldByName('ID').AsString := ID;
it.FieldByName('Nombre').AsInteger := 'Nombre';
it.FieldByName('Desc').AsString := 'Descripcion';
it.FieldByName('Telefono').AsString := '123456789';
end;
...


Entre otras cosas porque <it> o <idem> me dan un significado "genérico", <q> en este caso, para mi tiene un significado (de query) que además me hace más claro entender el código.
Al igual que si uso frm (para un TForm), f (para un TField), ds (para un TDataSet),...

olbeup
20-09-2016, 09:25:51
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.
...
begin
with TfrmClientes.Create(Self) do
begin
ShowModal;
Free;
end;
end;
Otro:
...
var
frmC: TfrmClientes;
begin
frmC := TfrmClientes.Create(Self);
with frmC do
ShowModal;
FreeAndNil(frmC);
end;
Otro mas:
...
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.
...
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.
...
begin
with Edit1, Label1 do
begin
Font.Color := clRed;
Text := Caption;
end;
end;
de lo contrario tendria que hacer dos with, eje.
...
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.

Casimiro Notevi
20-09-2016, 10:36:37
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. :)

Ñuño Martínez
20-09-2016, 11:37:24
Esto se está poniendo espeso.

En el foro de Lazarus (http://forum.lazarus.freepascal.org/index.php/topic,34094) 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. :(

olbeup
20-09-2016, 12:51:13
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.

Delphius
20-09-2016, 13:28:11
Muchachos no se vayan al reduccionismo.
La propuesta del identificador idem/it o el que fuese no está pensando para eliminar los vicios de un programador y no es su intención usarlo en esos ejemplos tan simples.
Su principal idea es emplearlo (y que como ha dicho Al, que por defecto no esté habilitado por una directiva de compilación) en aquellos casos y escenarios en donde el with adquiere complejidad y se interactúa con una serie de objetos y/o variables que pudieran dar una confusión o en los que el compilador no supiera asociar correctamente a quien se está referenciando.

Saludos,

roman
20-09-2016, 15:47:57
Roman, con lo de Marco Cantu, que fue un ejemplo, simplemente quería decir que quedaría muy feo desde el punto de vista comercial que Embarcadero o un vocero aparezca un día diciendo que algo nuevo que agregaron no es una práctica muy recomendable.

Claro. Sólo que el with es muy, pero muy anteror a Marco Cantú, no es nada nuevo que agregar.

Esto, desde luego, sin quitar el hecho de que a algunos nos parece útil el with y pensamos que la confusión, como tantas otras cosas, depende mucho de cómo se use. Hay quienes gustan de anidar innecesariamente bloques try-except y no por eso los vamos a quitar o modificar.

Ahora, como dice Neftali, el with se usa para reducir la escritura. Cualquier otra palabra o símbolo, sólo generaría confusión y sería muy artificioso. Excepto, quizá, el punto, porque éste, a fin de cuentas, es lo mismo que escribiríamos si no usamos el with, esto es, usar el punto significaría simplemente que omitimos un poquito menos, pero no añadimos nada más. Además, el punto, como sucede en Visual Basic, da la oportunidad al IDE de autocompletar, que, dicho sea de paso, es realmente lo que extraño al usar el with.

Además del punto, la variante del as como un alias, es la que me parece más práctica. Claro que podemos usar una variable en lugar del alias, pero la idea sería que con el alias nos evitamos declarar algo extra.

LineComment Saludos

jhonny
20-09-2016, 21:04:52
Entiendo que la única utilidad del with dentro del lenguaje es eliminar determinadas "palabras" de forma reiterativa en un bloque de código.
Si resulta que para poder usar el with ahora vamos a introducir la necesidad de usar una nueva palabra, ¿no será mejor no utilizarlo?
Es decir, creo que usar el with (que creo que es lo que proponéis) usando un identificador (it o idem) es lo mismo (o es peor) que usar una variable y declararla del tipo correcto.

Me explico:

Ahora tenemos esto:


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;


Para solventarlo, proponemos crear una directiva condicional y obligar a escribir esto:


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


Creo que en comparación con esto, estamos liando las cosas...
Porque resulta que al final, para poder utilizar el with (cuya ventaja creo que es eliminar determinadas palabra repetitivas), estamos obligando al usuario a escribir más código con otra palabra que se repite (y menos entendible) que si escribiéramos el código natural.


var
John, Sarah : TCustomer;
begin
// Set up the John's customer details
John.firstName := 'John';
John.lastName := 'Smith';
John.address1 := '7 Park Drive';
John.address2 := 'Branston';
John.address3 := 'Grimworth';
John.city := 'Banmore';
John.postCode := 'BNM 1AB';


O no lo entiendo o no lo veo.

NOTA: El código de ejemplo está extraído de la explicación del WITH de DelphiBasics (http://www.delphibasics.co.uk/RTL.asp?Name=with).


¡Caramba!, creo que lo que dije antes, ha quedado mucho mejor explicado y reflejado por Neftali en este post. Así que me uno a este comentario y al otro que escribió después de ese.

Casimiro Notevi
20-09-2016, 21:08:33
¡Caramba!, creo que lo que dije antes, ha quedado mucho mejor explicado y reflejado por Neftali en este post. Así que me uno a este comentario y al otro que escribió después de ese.
+1 .

roman
20-09-2016, 21:57:32
De hecho, creo que el debate debió comenzar con una exposición de motivos, precisamente para dar mayor claridad: cuáles son exactamente las supuestas falencias y virtudes de la cláusula.

Por ejemplo, ¿quién no ha usado el típico


with TAlgunFormulario.Create do
begin
// ...
ShowModal;
// ..
end;


para mostrar un cuadro de diálogo?

Claro que podemos usar una variable pero resulta muy cómodo ahorrárnosla si el formulario se desecha una vez cerrado.

O bien, ¿han considerado que además de ahorrar escritura, el with puede ahorrar llamadas a métodos? Por ejemplo en:


Persona.Domicilio.Calle := 'Av. Principal';
Persona.Domicilio.Numero := 1;


si Domicilio es una propiedad de la clase TPersona a la que se accede mediante un getter, éste se llamará dos veces. El uso con with:


with Persona.Domicilio do
begin
Calle := 'Av. Principal';
Numero := 1;
end;


reduce a una sóla llamada.

Igual que el caso anterior, se puede usar una variable para evitar el doble acceso, pero resulta mucho más cómodo así.

LineComment Saludos

Al González
20-09-2016, 22:09:01
¡Menudos ejemplos, Germán! Por supuesto que no tendría sentido usar el nuevo With en casos así. :)

Pero hay otros donde sí, como el de la imagen del primer mensaje (que parece que salió borrosa). Consideremos la siguiente comparativa:

Sin With:
procedure TForm1.Button1Click(Sender: TObject);
var
LForm :TForm2;
begin
LForm := TForm2.Create(Self);

try
AppLogger.LogForm(LForm); // Llamada a un método externo usando el formulario creado como parámetro
LForm.ShowModal;
finally
LForm.Free;
end;
end;

Con el nuevo With:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Self) do
try
AppLogger.LogForm(It); // Llamada a un método externo usando el formulario creado como parámetro
It.ShowModal;
finally
It.Free;
end;
end;

No es que busquemos ahorrar palabras. No es así de simple. Sino que los recursos que permitan simplificar código fuente de una manera elegante siempre debieran ser bienvenidos, salvo que no sean seguros. Como el riesgo es la desventaja del With actual, se propone hacerlo seguro conservando su elegancia. Incluso se añade una ventaja más: la de poder hacer referencia al objeto mismo dentro del bloque With (algo que la actual sintaxis no posee).

Saludos aclaratorios.

Al González.

P.D. Se agradece el anterior mensaje, de Román, que ahora veo y suscribo. ^\||/

AgustinOrtu
20-09-2016, 22:46:56
Sigo sin verle mucho sentido. En lugar de escribir var it: TForm2 tengo que escribir with. No son muchos caracteres que se ahorran, y se debe agregar un nivel de sangría adicional. Combinado con un bloque de protección de recursos (try-finally) y un bloque de manejo de excepciones (try-except) se tendrían 3 niveles de sangría. A mi ya dos me parece mucho :)

poliburro
23-09-2016, 00:12:09
Cuando me inicié en pascal y use With simplemente no me gustó así que a la fecha no lo uso. Es como el Goto, sigue existiendo en Delphi pero no por eso se usa y es más, no vale la pena mejorarlo.



Ahora bien, ve a los foros del dueño, haz la propuesta, habla con la gente dentro, si recibes el mas *minimo* de escucha te sigo encantado.



^\||/ Exacto, aquí lo conveniente es llevar las propuestas a la casa del dueño, por que no hacerlo y gritar al vacío es lo mismo...