Estimado Gabriel,

Muchas gracias por tomarte el tiempo en contestar mi publiucación.

Sí, si me suena el señoir Ingals, gracias. Aunque creo que el señor Meyer
pesa más en la comunidad principalmente porque el mensaje es más reducido, a
mi entender porque el señor Meyer se concentra en lo importante, mientras
que el señor Ingals se concentra en los detalles. Ambos tipos de
personalidades son importantes, pero si quieres aprender deberías
concentrarte primero en lo importante, ya que los detalles los aprenderás de
todas formas. Si por el contrario te concentras en los detalles, puede que
descubras lo importante como puede que no.

Respecto de lo que escribió el señor Ingals concuerdo en un 100% y me parece
interesante el punto de vista, pero ¿no serán demasiados puntos a tener en
cuenta?

Lo sigo porque en vez de basarse en pocas ideas, presenta una serie de ideas
que no son fáciles de entender por sí solas, por ejemplo:


 *Leverage:** When a system is well factored, great leverage is available to
users and implementers alike.*     Take the case of sorting an ordered
collection of objects. In Smalltalk, the user would define a message called
sort in the class OrderedCollection. When this has been done, all forms of
ordered collections in the system will instantly acquire this new capability
through inheritance. As an aside, it is worth noting that the same method
can alphabetize text as well as sort numbers, since comparison protocol is
recognized by the classes which support both text and numbers.     The
benefits of structure for implementers are obvious. To begin with, there
will be fewer primitives to implement. For instance, all graphics in
Smalltalk are performed with a single primitive operation. With only one
task to do, an implementer can bestow loving attention on every instruction,
knowing that each small improvement in efficiency will be amplified
throughout the system. It is natural to ask what set of primitive operations
would be sufficient to support an entire computing system. The answer to
this question is called a *virtual machine* specification:


Ocurre que los sistemas "well factored" no pueden tener código repetido. O
por lo menos se esperaría que tuvieran poco código repetido, sino no se
entiende eso de "well factored". Simpáticamente ese es uno de los temas que
más contrariedad provoca en este grupo, porque al parecer sólo entienden de
este paper lo que les conviene o lo que no contradice sus creencias
irracionales. Está ampliamente documentado que todas las personas funcionan
así, en el fondo buscan corroborar sus creencias irracionales y con eso
sicólogicamente les basta, desafortunadamente no es así como avanza la
ciencia.

El punto que estábamos dicutiendo es si corresponde crear un sistema
partiendo como principio unificador del proyecto "modelar el mundo real". A
este respecto el señor Ingals menciona:


 *Polymorphism:* *A program should specify only the behavior of objects, not
their representation.*     A conventional statement of this principle is
that a program should never declare that a given object is a SmallInteger or
a LargeInteger, but only that it responds to integer protocol. Such generic
description is crucial to models of the real world.     Consider an
automobile traffic simulation. Many procedures in such a system will refer
to the various vehicles involved. Suppose one wished to add, say, a street
sweeper. Substantial amounts of computation (in the form of recompiling) and
possible errors would be involved in making this simple extension if the
code depended on the objects it manipulates. The message interface
establishes an ideal framework for such an extension. Provided that street
sweepers support the same protocol as all other vehicles, no changes are
needed to include them in the simulation:

Desafortunadamente cuando arriba dice "real world" se refiere a crear
simulaciones del mundo real, es decir, si vas a construir una simulación,
entonces el polimorfismo es útil. Como ustedes sabrán Smalltalk deriva en
parte del lenguaje Simula y por ende había una espectativa de que este
lenguaje también fuera usado para hacer simulaciones, por eso habla de mundo
real. El señor Ingals no está diciendo que los sistemas de información deban
construirse penando en modelar el mundo real, como al parecer alguien acá
quiere hacernos creer.

Saludos cordiales,
Guillermo.

 2008/9/23 Gabriel <[EMAIL PROTECTED]>

>   Mirá, no se trata de quien tiene experiencia y quien no. Cuando se
> discute se lo hace con argumentos, porque si no gana siempre el que laburo
> mas años (por mas que durante esos años se haya trabajado de muy mala
> manera).   En cuanto al paper ese que me pasaste, interesante, lo voy a
> leer, quiza ahi existan argumentos que sostengan lo que decis, en principio
> no conozco ninguno.
> Por otro lado, con respecto a experiencias que contradigan lo que decis te
> doy un ejemplo: Smalltalk.
>   Si te cabe duda leete este paper que es bastante viejito:
>
> http://users.ipa.net/~dwighth/smalltalk/byte_aug81/design_principles_behind_smalltalk.html
> Lo escribió un tal Daniel H. H. Ingalls, no se si te suena.
> Saludos.
>   El 23 de septiembre de 2008 15:07, Guillermo Schwarz <
> [EMAIL PROTECTED]> escribió:
>
>>  En mi pobre experiencia (comparada por supuesto con tu vasta experiencia
>> en el tema ;-), la recomendaciòn de "modelar la realidad" rara vez funciona,
>> y cuando funciona, lo hace por un periodo tan breve y en forma tan corrupta,
>> que es mejor no seguir esa recomendaciòn.
>>
>> Hay otros que tienen la misma visiòn:
>>
>>
>> http://www.developertutorials.com/tutorials/php/what-is-object-oriented-programming-070130/page2.html
>>
>> "Reasoning too much in terms of the real world can actually be detrimental
>> to software quality"
>>
>>
>> http://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel1/2/11070/00511974.pdf?arnumber=511974
>>
>> Y lo dice un señor llamado Bertrand Meyer... no sé si les suena...
>>
>> Si tienen experiencias que contradigan lo que digo o al señor Meyer serìa
>> bueno que las compartieran para que todos aprendamos de su infita
>> sabidurìa...
>>
>> Saludos cordiales,
>> Guillermo.
>>  2008/9/22 Gabriel <[EMAIL PROTECTED]>
>>
>>> Es increible que no puedas entender que modelar la realidad no significa
>>> modelarla entera. Obviamente que siempre es un modelo simplificado, la
>>> realidad es infinita, ni siquiera creo que exista la posibilidad de hacer un
>>> modelo completo de toda la realidad. Pero a ver si entendes, podes
>>> modelar algo y tratar de no perder de vista el gap semantico y no por eso
>>> eso que modelaste modele la realidad entera! lo importante es que siempre
>>> que sea posible te acerques lo mas que puedas.
>>> Si queres no repetir codigo podes hacerlo con programación procedural y
>>> no se para que complicas todo con objetos y mensajes, en el lugar que va el
>>> mismo codigo llama a la misma funcion y listo.
>>>  El 22 de septiembre de 2008 1:47, Guillermo Schwarz <
>>> [EMAIL PROTECTED]> escribió:
>>>
>>>>   2008/9/18 Abel Armoa <[EMAIL PROTECTED]>
>>>>
>>>>> Guillermo, hay algo que no entiendo cuando decís:
>>>>>
>>>>>> Proxy: Clase que permite agregar comportamiento a otras clases sin
>>>>>> usar herencia, sino usando composiciòn, de modo que la clase X 
>>>>>> preexistente
>>>>>> adquiere el comportamiento del Proxy P cuando esta clase se encuentra
>>>>>> envuelta en el proxy P.
>>>>>>
>>>>>  ¿Cómo puede ser que una clase preexistente adquiera nuevo
>>>>> comportamiento mediante el Proxy?
>>>>>
>>>>
>>>> a := Object new.
>>>> a := PersistentProxy for: a.
>>>>
>>>> la idea es que PersistentProxy es una clase que al mandarle el mensaje
>>>> for: crea una nueva instancia de sì misma que intercepta todos los 
>>>> mensajes.
>>>>
>>>>
>>>>>  La únca forma que se me ocurre que pueda pasar esto es que un proxy
>>>>> se maneje a nivel meta y redefina o agregue comportamiento a la clase. 
>>>>> Pero
>>>>> sé que los Proxy no hacen esto (o por lo menos no es su objetivo inicial).
>>>>>
>>>>
>>>> Si.
>>>>
>>>>
>>>>>   Otra duda que me surge es cómo hacés para envolver una clase con un
>>>>> Proxy. Porque la implementación de Proxy que yo conozco es la de un objeto
>>>>> que tiene como colaborador interno a otro objeto. El proxy recibe los
>>>>> mensajes de otros objetos y decide en cada caso si delega algo en su
>>>>> colaborador o no, si hace algo antes de delegar o después, etc.
>>>>>
>>>>
>>>> Sí. en Smalltalk si recuerdo bien, se redefine el mètodo
>>>> doesNotUnderstand. En Java se utliza un mecanismo llamado Dynamic Proxy que
>>>> involucra al compilador. Me da la impresiòn que es màs sofisticado el
>>>> mecanismo en Smalltalk porque permite redefinir mètodos, mientras que en
>>>> Smalltalk sòlo funciona si llegas al mètodo "doesNotUnderstand".
>>>>
>>>>>    ¿A qué te referís cuando decís que le agregás comportamiento a la
>>>>> clase?
>>>>>
>>>>
>>>> desde el punto de vista del usuario del objeto, el objeto ha adquirido
>>>> comportamiento que antes no tenìa.
>>>>
>>>>>    Y después cuando decís:
>>>>>
>>>>>> Trait: Clase que permite agregar comportamiento a otras clases sin
>>>>>> usar herencia, sino usando composiciòn, de modo que las clase X es creada
>>>>>> como un trait T del cual se extiende y se redefninen algunos de sus 
>>>>>> mètodos.
>>>>>>
>>>>>>
>>>>>  No entiendo a qué te referís con composición de clases. ¿Podrías
>>>>> explicar un poco esto?
>>>>>
>>>>
>>>> La idea es que las cuando estàs creando tus clases, puedes usar "is a" o
>>>> "has a", por ejemplo, un una manzana "is a" fruta, un auto "has a" motor,
>>>> etc.
>>>>
>>>> Cuando utilizas "has a" estàs pensando en composiciòn mientras que
>>>> cuando estàs usando "is a" estàs usando herencia.
>>>>
>>>>>    Menos còdigo => menos costo
>>>>>>
>>>>>  Para mi en realidad la cantidad de código no es importante, sino cuán
>>>>> bien modelado está el problema a tratar. Qué tanto se acerca mi modelo a 
>>>>> la
>>>>> realidad. Y ahí sí, cuanto más se acerca => menos costo (pero no creo que
>>>>> influya directamente en el costo, sino porque el modelo va a ser más fácil
>>>>> de entender, mantener, reutilizar, extender, etc.)
>>>>>
>>>>
>>>> Desafortunadamente la orientaciòn a objetos no tiene nada que ver con la
>>>> realidad, para eso estàn los casos de uso, es decir, el modelamiento de las
>>>> funcionalidades basadas en los "casos" en que el sistema serà usado. Una 
>>>> vez
>>>> que eso està modelado, los objetos son simplemente mecanismos de
>>>> implementaciòn.
>>>>
>>>> Los objetos del dominio (del problema) no deben ser màs del 10% de los
>>>> objetos del sistema y hasta donde he podido ver nunca estàn listos, nunca
>>>> representan adecuadamente la "realidad", sino màs bien satisfacen los
>>>> requerimientos en el mejor de los casos y punto.
>>>>
>>>> Un tìpico ejemplo son las direcciones. Por ejemplo los clientes tienen
>>>> direcciòn. La direcciòn tiene calle, nùmero, telèfono, comuna, ciudad y
>>>> paìs. El cliente puede tener ademàs un telèfono celular. El telèfono normal
>>>> puede tener ademàs una direcciòn y un contacto, donde el cantacto es una
>>>> persona que trabaja en esa direcciòn y que tìpicamente tiene un cargo. Y
>>>> todo eso sòlo para representar la direcciòn de un cliente.
>>>>
>>>> Luego un cliente sale con el pastelito de que tiene màs de una
>>>> direcciòn, una direcciòn con màs de un telèfono, un telèfono con màs de un
>>>> contacto, un contacto con màs de un cargo.
>>>>
>>>> Es muy difìcil de implementar para ser un problema tan simple, pero
>>>> principalmente porque "modelar la realidad" no deberìa ser el objetivo.
>>>>
>>>>>    Saludos,
>>>>> Abel Armoa
>>>>>   --
>>>>> Saludos cordiales,
>>>>>  Guillermo Schwarz
>>>>> Sun Certified Enterprise Architect
>>>>>
>>>>        --
>> Saludos cordiales,
>>  Guillermo Schwarz
>> Sun Certified Enterprise Architect
>>
>   >
 --
Saludos cordiales,
 Guillermo Schwarz
Sun Certified Enterprise Architect

--~--~---------~--~----~------------~-------~--~----~

To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]

http://www.clubSmalltalk.org
-~----------~----~----~----~------~----~------~--~---

Responder a