viernes, 31 de agosto de 2007

¿Tiene sentido usar nil?

En el último post, una de las preguntas que dejé pendiente era si bajo las condiciones de modelado comentadas tenía sentido utilizar "nil" (o "null" en otros lenguajes... aunque "nil" y "null" no son lo mismo[1]), si los objetos debían o no tener variables de instancia referenciando a "nil".
La realidad es que si aplicamos los principios que comenté en el post pasado, ningún objeto debería tener variables de instancia con "nil" (salvo por cuestiones implementativas como las que comento más abajo). Si al momento de crear objetos, a estos se le indica cuales son todos sus colaboradores internos, no debería existir ninguno de ellos referenciando a "nil".
Imaginense las ventajas que esto tiene! El objeto "nil" es uno de los más "dañinos" desde el punto de vista de "programación correcta o segura", puesto que su existencia implica que en algún momento se le deberá preguntar si es él (el famoso mensaje isNil o ==null en otros lenguajes), lo cual deriva en un ifTrue: (o if...) y por lo tanto en un posible foco de error y conflicto (error por olvidarse de hacer dicha pregunta, conflicto en el caso de la evolución del modelo, etc.)
Con esto no quiero decir que el objeto "nil" no debería existir o que no se lo debería utilizar, "nil" debe existir por lo que representa, "la nada", pero cuanto menos utilizado sea, mejor.
Siguiendo los consejos que publiqué en el post anterior, el uso de "nil" por lo tanto se disminuye al máximo y por ende también los errores que el uso del mismo induce.
El único motivo que encontré hasta ahora para utilizar "nil" como variable de instancia en un objeto, es para aquellas variables que "cachean" algún objeto y por lo tanto se pueden inicializar de manera lazy. Pero justamente por ser una cache o inicializarse de manera lazy, son colaboradores que solo debe conocer el objeto que los referencia y por lo tanto nunca otro objeto podrá pasarlo en el momento de la creación.
Por otro lado, les comento que en ambientes de objetos transaccionales como GemStone, tener variables que se inicialicen de manera lazy no es tan trivial puesto que al momento de comitiar una transacción se pueden generar conflictos de write-write. Por ejemplo, si desde dos transacciones distintas se le envía el mensaje que inicializa dicha variable al mismo objeto, aquella que commitee segunda tendrá el conflicto que comenté puesto que la primera ya habrá "escrito" dicha variable de instancia.

[1] "nil" en Smalltalk es un objeto, instancia de UndefinedObject y por lo tanto puede recibir mensajes y también se lo puede modificar. null en Java o .Net no es un objeto, es una construcción sintáctica y por lo tanto no posee la misma riqueza lingüística que "nil". ¿Qué significa "mayor riqueza lingüística?, les dejo un ejemplo para que lo deduzcan por su cuenta: (Este ejemplo fue una gran idea de Luciano!)
En un framework que usamos es necesario crear un diccionario cuyos valores pueden ser "nil" o no. Por ejemplo:
ClassXXX>>insertValuesFrom: aCuenta

^Dictionary new
at: 'sucursal' put: (aCuenta sucursal isNil ifTrue: [ nil ] ifFalse: [ aCuenta sucursal objectID ]);
at: 'calificacionCuenta'put: (aCuenta calificacion isNil ifTrue: [ nil ] ifFalse: [ aCuenta calificacion codigo ]);
...
yourself.
Como pueden ver, este framework no sigue los consejos que di en el post anterior y por ello es necesario verificar si 'sucursal' es "nil" para enviarle el mensaje #objectID en caso de no serlo. Lo mismo sucede con 'calificacion'.
Como podrán darse cuenta, escribir código de esta manera es error prone (propenso a error), tedioso, molesto, cansador, poco inspirador y poco divertido (se lleva todas las malas). La gran idea de Luciano fue darse cuenta que "nil" es un objeto y por lo tanto puede saber responder los mensaje #objectID y #codigo de tal manera que devuelvan self!. Por lo tanto implementando los siguientes métodos en UndefinedObject:
UndefinedObject>>objectID
^self

UndefinedObject>>codigo
^self
no es más necesario hacer los chequeos anteriores!. Transcribo lo que Luciano escribió:
"De esa manera el código del ejemplo anterior se puede escribir así, que es mucho más claro y se eliminan todos los isNil ifTrue:[] ifFalse:[] que entorpecen la lectura:"
ClassXXX>>insertValuesFrom: aCuenta

^Dictionary new
at: 'sucursal' put: aCuenta sucursal objectID;
at: 'calificacionCuenta' put: aCuenta calificacion codigo;
...
yourself
¿Se ve a simple vista no?... Esto es riqueza lingüística, es la posibilidad de modificar el lenguaje para cumplir con objetivos que no estaban pensados en primera instancia, es poder hacer evolucionar un lenguaje de la misma manera que evoluciona un lenguaje natural. De más está decir que con Java, .Net o C++, etc, esta solución no es factible puesto que "null" no es un objeto.
Se puede discutir si desde el punto de vista conceptual es correcto implementar estos mensajes en UndefinedObject... seguramente nuestra conclusión será que no, pero que ayuda, no perjudica y es muy práctico, no quedan dudas.
Así que, me saco el sombreo: Grande Lucho!

19 comentarios:

Claudio Acciaresi dijo...

Buenas, cómo va? Estuve leyendo el post, y me parece que un problema que
se puede producir al hacerlo de esta manera es que la cantidad de mensajes
implementados en UndefinedObject puede ser extremadamente grande...

Quizás se podría encontrar alguna superclase común a todos los objetos
que son utilizados por el framework, en la cual se puede implementar
el mensaje doesNotUnderstand: aMessage, dandole la semántica deseada...

Quizás estoy tirando fruta, pero bueno, al menos es un comentario!!!!!! :)

Anónimo dijo...

probando

Anónimo dijo...

Perdon, no se enviaba el comentario. Por eso el anterior que dice "probando".
No sería mejor tener un objeto sucursalNoExistente (por ejemplo) que sepa responder a esos mensajes con nil?
Saludos
Gabriel

Unknown dijo...

Si bien se mejora el codigo usando el nil modificado, no se esta cambiando el sentido del nil? Al menos el sentido en Smalltalk. Objective-C no tenia el nil que devolvia nil a todo mensaje?(o mando fruta)
Me gusta mas la onda de la idea de Gabriel.

Hernan Wilkinson dijo...

Que tal Claudio, antes que nada gracias por el comentario.
Tenés razón que se está "bastardeando" UndefinedObject de esta manera. La solución que propones no funciona porque el que no entiene el mensaje es "nil", no una instancia que posee una superclase común en el framework.
En realidad, la mejor solución sería modelar la ausencia de sucursal o calificación. Por lo tanto, al instanciarse una Cuenta, si la misma no conoce o posee sucursal se iniciaría con este objeto que representa dicha situación y que sabe responder #objectID como es esperado.
El problema que hacer todo esto es muy engorroso en este framework, por lo tanto la solución de compromiso de Lucho es bien "pragmática"

Hernan Wilkinson dijo...

Que tal Gabriel. Si, tu solución es la que le propongo a Claudio. Según mi parecer sería la mejor solución, lo que sucede que implementarla con el framework y sistema del ejemplo no es tan rápido y sencillo como lo que propone Luciano.
Pero estoy de acuerdo con vos, sería una muy buena solución.

Hernan Wilkinson dijo...

Que tal minobuzo. Como decís en Objective-C el objeto "nil" implementa el comportamiento que se denomina "generic nil" que significa que siempre que le envíen un mensaje que no sabe responder se devuelve a sí mismo. Esto se puede hacer en Smalltalk (de hecho lo hemos hecho) pero se llega a la misma situación que le comentaba a Claudio, modificar el sistema para que en vez de usar "nil" use este nuevo objeto no es sencillo...
Estoy de acuerdo con vos que lo que propone Gabriel es la mejor solución.

Gaboto dijo...

Tampoco me voy a llevar el mérito de esa solución, creo que es una idea que nombraste en alguna de las clases del cuatrimestre pasado.
je.
Saludos.
Gabriel

Anónimo dijo...

Esta muy interesante este tema.
A mi me quedo una duda con respecto a la solución de modelar la no existencia de, por ejemplo, una sucursal. Me pregunto: el objeto que representa la "noSucursal" ¿es instancia de qué clase? ¿puede ser una instancia de la clase Sucursal? o ¿Habría que crear una nueva clase "NoSucursal"?
Yo creo que lo mejor es que sea instancia de Sucursal, pero no estoy seguro.
Saludos!
Diego Campodónico

Hernan Wilkinson dijo...

QUe tal Diego!
lo mejor es usar un clase que represente la NoSucursal puesto que no vas a poder usar una instancia particular de Sucursal para representar la ausencia de sucursal por varios motivos. Uno se entiende conceptualmente y es el hecho de no poder representar la ausencia de algo con el concepto que representa la existencia de ese algo, entendés? Esto se ve prácticamente en la implementación porque la nosucursal tendrá mensajes que estarán implementados de distinta manera, no alcanza con que el objeto que representa la no sucursal tenga colaboradores internos distintos o especiales que aquellos que representan sucursales de verdad.

Anónimo dijo...

Hola Hernán, te hago una nueva consulta sobre este tema:
¿Como ves representar la situación de esta manera?
Una clase Sucursal que sea abstracta, y dos subclases de esta que sean SucursalConcreta y NoSucursal, de manera que una noSucursal sea polimorfica con una sucursalConcreta, pero con implementación diferente.
Gracias y saludos!
Diego Campodónico.

Anónimo dijo...

Now, escorts can be contacted right from the comfort zone of your home - thanks to the easily navigable, user-friendly websites that present all escort activities and services online for your access.
That's why they have been so successful and popular in the pleasure friendly crowd.
Payment for your girl can be done online instantly. So, you should not have any sort of issue regarding anything.
The services provided by Bijou escorts are top notch. New York escort service are also offered to various clients.Bijou available are top class escorts, and you will soon forget about normal things in life and enter the world of love and fantasy. You must remember that using personal escort service is not like using normal intimate service and these are not just simple girls that you are dealing with. These are highly trained and qualified escort personnel's that are there to rejuvenate you dull and boring life. You will be surprised to find out that some of these girls are very well educated.
[url=http://bijouescorts.com]New Jersey Escort[/url] In the last few years, the entire US industry has seen a drastic change - change that has represented more of growth. Girls who are hospitable and who have flair to serve people with the best fun services have been recruited by the New York escort agencies thus satiating every pleasure need of clients. With online presence of the New York agencies, it's been extremely easy for people like you to browse through the listed girls' profiles so as to find out which girl would be able to serve you better. When it comes to enjoying a session with a New York escort girl, a lot of things may come to your mind. Her physical beauty, area of specialization, capability of fulfilling fetishes, friendliness all may play a major role in letting you choose our girl accordingly. Most of the New York escorts agencies feature full information of girls' physical attributes, their hair color, sexual orientation, area of services and even of pricings. So, it's just a completely easy affair to know more about them on their website itself.

It's the quality of service offered by the New York escorts that have made New York one of the major escort hubs in the entire globe. All girls are very much educated and they know how to keep themselves clean and hygienic. If you have never used Hugo Boss once in your life yet, don't be surprised to smell it on their skins. They are really very much beauty and style conscious. That's the reason they have been able to mark such a big impression in the psyche of each and every escort fun lovers.
http://bijouescorts.com New York escorts are genuinely the best girlfriends for men seeking for pleasure. They are the abode of beauty and charm and satisfy men with their amazing sense of maturity. The top-quality escorts of New York are the finest and greatly enviable attractive girls who understand the need and desire of their customer. They are blessed with the most alluring bodies and with the superior set of soft skills; they can make anyone feel special.

Anónimo dijo...

if you guys requisite to hedonistic [url=http://www.generic4you.com]viagra[/url] online you can do it at www.generic4you.com, the most trusted viagra dispensary immature of generic drugs.
you can learn drugs like [url=http://www.generic4you.com/Sildenafil_Citrate_Viagra-p2.html]viagra[/url], [url=http://www.generic4you.com/Tadalafil-p1.html]cialis[/url], [url=http://www.generic4you.com/VardenafilLevitra-p3.html]levitra[/url] and more at www.rxpillsmd.net, the pre-eminent [url=http://www.rxpillsmd.net]viagra[/url] inception on the web. well another great [url=http://www.i-buy-viagra.com]viagra[/url] pharmacy you can find at www.i-buy-viagra.com

Anónimo dijo...

[url=http://bejepewa.t35.com/news_131.html]best casino cytech online[/url] [url=http://bejepewa.t35.com/news_18.html]aladdin casino las vegas[/url] [url=http://bejepewa.t35.com/news_241.html]interest rates on certificates of deposit[/url] [url=http://bejepewa.t35.com/news_602.html]internet casino gambling to play craps[/url] [url=http://bejepewa.t35.com/news_73.html]imperial palace and casino[/url]

Anónimo dijo...

Infatuation casinos? check this new [url=http://www.realcazinoz.com]online casino[/url] director and fake online casino games like slots, blackjack, roulette, baccarat and more at www.realcazinoz.com .
you can also probe our new [url=http://freecasinogames2010.webs.com]casino[/url] direct at http://freecasinogames2010.webs.com and replace in true well distant !
another late-model [url=http://www.ttittancasino.com]casino spiele[/url] in the region of is www.ttittancasino.com , because german gamblers, retrieve not busy online casino bonus.

Anónimo dijo...

Finally, realize that all the various bookmakers have their own rules and policies regarding how they settle bets done through arbitrage sports betting when they have such irregular results. As with the advice on pricing, be sure to check the rules of the individual bookmakers before you place your bets.

The Parlay System is one of the most famous of betting systems that are commonly used in horse racing. Many have said that contrary to other sports betting systems, the Parlay System has a pyramiding effect on your profit which means your winnings are played on successive wagers.
[url=http://www.pulsebet.com]football bet[/url]
The changes that are going to be made to the Wire Act are quite simple. First and foremost the internet will be added to the list of wire communications that are prohibited. Of course the internet was not around in 1961 so it was not included in the first draft. In addition, penalties for breaking the Wire Act will increase from a maximum of two years in prison to five.

Nonetheless, the reality of the matter is this: if you don't have a Selection System that is sound in every respect, then you are just as badly off as if you had no Selection System at all! And even if you find a good tipster service, you must still exercise a great deal of caution in making your final selections and look carefully at their success rate for the specific type of tips they are offering. If you fail to do this, then you can be certain of one thing: you will lose all your money somewhere down the road!

Anónimo dijo...

3.) Every card poses the same chance or game odds of winning at a game of online bingo. Hence, if you play with more cards, you are increasing your game odds and winning chances.
[url=http://www.bingokisses.com]play bingo[/url] play bingo Another bingo system functions through the positions in the bingo card. Every bingo card has 24 numbers with a free spot in the middle. All 24 numbers have strategic positions in the bingo card while the remaining numbers occupy dead positions or squares. Probability of winning combinations occupying strategic positions is high. The dead squares come into force only in bingo combinations occurring in horizontal or vertical positions.
[url=http://www.bingokisses.com]bingos[/url]
With so many different casino and gaming sites on the Internet, it is difficult to know which ones are legitimate and which ones are not. After all, if you want to join the gaming community, you have to decide whether you want to play for money or for fun and prizes. If the former, it is more pertinent to find out what sites are legitimate since you do not want to invest cash into something that is not going to give you a return on your investment.
bingo online
What you have to do is, coordinate the numbers that are called out by the host with what you have on our sheet, aiming at filling up a pattern reading bingo. The pattern would be announced at the beginning of the game, so you have to be careful to know what pattern you are looking out for. The cards have the b-i-n-g-o letters on rows and numbers running as a column. A host would call out a letter-number combination, which you would have to mark on your sheet. For example if I-34 is called, you will have to look at the I column down to search for number 34. In case you have it, you place a market on it, and so on.

Anónimo dijo...

One of the factors that can influence the outcome of your program is that many bookmakers set maximum stake limits which can keep you from placing your full wager, so make sure that there in no max limit with any of the bookies that you are dealing with.
bet football | bet online sport betting
One key thing to remember when you are seeking out the best sports betting odds is that the best odds and the best sports bookmaker are not necessarily one and the same.
[url=http://www.pulsebet.com]betting football online[/url]
On the other hand if you were to lose then you would wager twice what your original bet was. According to proponents of the system, this strategy will eventually enable you to win the bets you place and when you win you would recover all your lost bets plus one unit profit against your initial wager.

And finally, in the first article in this series I mentioned being honest with yourself, because one of the biggest lies I have found that a tremendous number of Bettors are guilty of is denying to themselves how many times their Base Bank has been busted! If you too are guilty of this, please remember that until you face up to the truth with the determination to do something about it, you can't expect to turn the situation round in your favour.

Anónimo dijo...

Attraction casinos? scrutinize this young [url=http://www.realcazinoz.com]casino[/url] games. guide and wing it denigrate online casino games like slots, blackjack, roulette, baccarat and more at www.realcazinoz.com .
you can also go over our late [url=http://freecasinogames2010.webs.com]casino[/url] manage at http://freecasinogames2010.webs.com and be heir to in principal hard currency !
another late-model [url=http://www.ttittancasino.com]casino[/url] spiele in the region of is www.ttittancasino.com , because german gamblers, rise via freed online casino bonus.