Mostrando las entradas con la etiqueta Eiffel. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Eiffel. Mostrar todas las entradas

jueves, 11 de junio de 2015

Opal el nuevo lenguaje Orientado objeto con aires Funcionales


Opal el nuevo lenguaje Orientado objeto (es nuevo para mi) que tiene como objetivo remplazar a C, C++, Java, C#, Eiffel, Simula, and SmallTalk, y tambien:

  • Mejorar la implementación de la programación orientada a objetos
  • Introducir ideas del paradigma funcional
  • Ser de bajo nivel y de alto nivel. 
  • Usar técnicas avanzadas de compilación para hacer programas más eficientes. 


Entre sus características podemos destacar que es un lenguaje multiparadigma (procedural, orientado a objeto y Funcional) se pueden utilizar inmutables, clausuras, object, ASAP Garbage Collection, ect.

Como se ve un programa en Opal? bueno veamos un hola mundo:


IMPLEMENTATION GCD
   IMPORT Nat COMPLETELY
   DEF GCD(a,b) == IF a % b = 0 THEN b
                       ELSE IF a-b < b THEN GCD(b,a-b)
                           ELSE GCD(a-b,b)
                       FI
                   FI

Dejo link:
http://www.cs.oberlin.edu/~jwalker/opal/

viernes, 22 de mayo de 2015

Contratos en C#

Leyendo sobre C# en infoQ parece ser que quieren agregar contratos, pero que serían los  contratos? En un momento de mi vida yo escribí sobre contratos, escribí algo como esto:

"Eiffel es el lenguaje pionero en el diseño por contrato. Diseño por contrato es un concepto basado en la calidad del software.

Diseño por contrato es una metafora de como los objetos deben colaborar entre ellos. La metafora se puede explicar como un cliente que debe contratar un servicio; lo cual lo hace por medio de un contrato.

El proveedor debe proporcionar un producto determinado o servicio y tiene derecho a esperar hasta que el cliente pague.

El cliente debe pagar y tiene derecho a obtener el producto o servicio.
Ambas partes deben cumplir con ciertas obligaciones, tales como las leyes y reglamentos, aplicables a todos los contratos."

Volviendo a C# han decidido implementar un mecanismo de programación basada en contratos de la siguiente manera:

public int Insert(T item, int index)
    requires index >= 0 && index <= Count
    ensures return >= 0 && return < Count
{ … }

Lo que esta haciendo acá es asegurarse de que index sea mayor a 0 y menor a count.

Dejo link: http://www.infoq.com/news/2015/05/CSharp-7-contract

sábado, 15 de junio de 2013

Racket


Como les aconseje en el siguiente post : http://emanuelpeg.blogspot.com.ar/2013/06/introduction-to-systematic-program.html; un curso que esta muy bueno en cursera es "Introduction to Systematic Program Design". En este curso se utiliza el lenguaje Racket.

Racket es un lenguaje de la familia de lisp/scheme, multiparadigma y es un lenguaje de propósito general que se utiliza para la enseñanza, investigación y para cualquier otra cosa. Tiene un entorno que se llama DrRacket, funciona en diferentes plataformas; yo lo estoy corriendo en Linux sin problemas.

Como se pueden imaginar al ser un lenguaje derivado de lisp es funcional, pero también fue influido por scheme y eiffel. De este ultimo toma la programación dirigida por contratos. A la vez soporta macros y es muy extensible. Una cosa curiosa es que soporta elementos gráficos, en realidad me resulta curioso a mi, podemos hacer esto:

(require 2htdp/image)
(triangle 80 'solid 'red)

y dibujara un triangulo.

Esta muy bueno para enseñar programación funcional y también para introducir a los alumnos a programación dirigida por contratos.

También tiene funciones similares a doctest de python es decir podemos hacer:

;; devuelve la suma de dos nros
(check-expect (suma 2 3) 5)
(check-expect (suma 5 3) 8)
(check-expect (suma 2 30) 32)
(check-expect (suma 2 -3) -1)

(define (suma nro1 nro2)
  (+ nro1 nro2)
 )

y haciendo esto la ide nos devolverá: "All 4 tests passed!"

Es lanzado con licencia LGPL por lo tanto lo podemos usar para hacer proyectos GPL y también comerciales.

Dejo links:
http://racket-lang.org/
https://en.wikipedia.org/wiki/Racket_(programming_language)

Dejo unas fotos de la IDE:



miércoles, 3 de octubre de 2012

Que pasaría si no existiría el Null??


Es una pregunta tonta, ya que el null nació como una forma de representar la nada misma. Es decir el null es necesario pero, no creen que esta sobre valorado? ¡esta en todos lados! En javacript por ejemplo se tiene que preguntar si esta definida la variable; porque una variable puede no estar definida; pero además la variable puede ser nula por lo tanto tengo que preguntar si es distinta de null. Para citar otro ejemplo  en java la lucha diaria contra NullPointerException...

No es un problema de la tecnología sino que no nos tomamos el tiempo de definir que puede ser nulo y que no, si existen valores por defecto, etc. Pero la tecnología nos puede ayudar y en este caso me parece correcto el camino que tomo C# o .net; en el cual se puede definir que una variable no puede ser nula (non-nullable)  o se puede definir un valor por defecto cuando no se asigna nada; cosa que se puede hacer en las bases de datos hace años.

Es interesante como en Eiffel se puede definir un contrato en el cual queda claro que por ejemplo para que esta función funcione es necesario que el parámetro no sea nulo y que sea mayor a 0. Dandole seguridad y tranquilidad a los desarrolladores. Me debo un buen post sobre Eiffel.

En conclusión cuando tenemos más tiempo hacemos las cosas mejor; por eso es importante tomarse el tiempo de definir que campos pueden ser nulos y cuales pueden tener datos por defecto. Y esta bueno que la tecnología nos ayude a definir estas restricciones y mejor sería que nos obligue a definirlo.

Dejo links:
http://www.infoq.com/news/2012/10/Null-CSharp
http://twistedoakstudios.com/blog/?p=330

sábado, 16 de julio de 2011

Eiffel y el diseño por contrato.


Eiffel es el lenguaje pionero en el diseño por contrato. Diseño por contrato es un concepto basado en la calidad del software.

Diseño por contrato es una metafora de como los objetos deben colaborar entre ellos. La metafora se puede explicar como un cliente que debe contratar un servicio; lo cual lo hace por medio de un contrato.

El proveedor debe proporcionar un producto determinado o servicio y tiene derecho a esperar hasta que el cliente pague.

El cliente debe pagar y tiene derecho a obtener el producto o servicio.
Ambas partes deben cumplir con ciertas obligaciones, tales como las leyes y reglamentos, aplicables a todos los contratos.

Las relaciones entre componentes de software estan definidas de forma formal por medio de los contratos, los cuales especifican las precondiciones, postcondiciones y invariantes.

La idea central de diseño por contrato como los componentes de software colaboran entre si, teniendo obligaciones y beneficios. Cuando definimos una función tenemos:
  • Precondiciones: Son los requisitos que debe cumplir quien llama esta función.
  • Postcondiciones: Es lo que debe hacer la función, es su obligación y un beneficio para el que llama a la función.
  • Invariantes: Mantener una cierta propiedad, que garanticen que ante tal entrada se obtenga determinada salida.
Muchos Lenguajes que proveen la capacidad de hacer asserciones, pero en el diseño por contrato estas se escriben antes de escribir el código y estas son parte del diseño.

El diseño por contrato es central en eiffel. Eiffel provee la expresión require para las precondiciones, ensure para las poscondiciones y invariant para las invariantes.

Veamos como se declara una clase en eiffel:

indexing
description: "Simple bank accounts"
class
ACCOUNT
feature -- Access
balance: INTEGER
-- Current balance
deposit_count: INTEGER is
-- Number of deposits made since opening
do
… As before …
end
feature -- Element change
deposit (sum: INTEGER) is
-- Add sum to account.
require
non_negative: sum >= 0
do
… As before …
ensure
one_more_deposit:
deposit_count = old deposit_count + 1
updated: balance = old balance + sum
end
feature { NONE } -- Implementation
all_deposits: DEPOSIT_LIST
-- List of deposits since account's opening.
invariant
consistent_balance: (all_deposits /= Void) implies
(balance = all_deposits . total)
zero_if_no_deposits: (all_deposits = Void) implies
(balance = 0)
end -- class ACCOUNT

Por ejemplo en el método o característica deposit es requerido que el valor a sumar no sea negativo y se asegura que la cantidad de balances haya aumentado.

En Java existen diferentes framework que nos proveen el diseño por contrato iContract2, Contract4J, jContractor, Jcontract, C4J, Google CodePro Analytix, STclass, OVal con AspectJ, Java Modeling Language (JML), SpringContracts de Spring framework, Modern Jass.

Para satisfacer las necesidades de las aplicaciones a gran escala y misión crítica de hoy, el diseño por contrato puede ser una gran solución.

Dejo links: