jueves, 27 de junio de 2013

Características únicas e PHP

Si estás familiarizado con otros lenguajes que se ejecutan del lado del servidor, como ASP.
NET o JSP, tal vez te preguntes qué tiene de especial PHP o qué lo hace tan diferente de esas
opciones competidoras. Bien, he aquí algunas razones:
Rendimiento Los scripts escritos en PHP se ejecutan más rápido que los escritos en otros
lenguajes de creación de scripts; numerosos estudios comparativos independientes ponen
este lenguaje por encima de sus competidores como JSP, ASP.NET y Perl. El motor de PHP

5.0 fue completamente rediseñado con un manejo óptimo de memoria para mejorar su rendimiento
y es claramente más veloz que las versiones previas. Además, están disponibles aceleradores
de terceros que pueden mejorar aún más el rendimiento y el tiempo de respuesta.
Portabilidad PHP está disponible para UNIX, Microsoft Windows, Mac OS y OS/2 y los
programas escritos en PHP se pueden transportar de una plataforma a otra. Como resultado,
las aplicaciones PHP desarrolladas en Windows, por ejemplo, se ejecutarán en UNIX sin
grandes contratiempos. Esta capacidad de desarrollar fácilmente para múltiples plataformas es
muy valiosa, en especial cuando se trabaja en un ambiente corporativo de varias plataformas o
cuando se intenta atacar diversos sectores del mercado.

Fácil de usar “La sencillez es la mayor sofisticación”, dijo Leonardo da Vinci y, de acuerdo
con ello, PHP es un lenguaje de programación extremadamente sofisticado. Su sintaxis es
clara y consistente y viene con una documentación exhaustiva para las más de 5 000 funciones
incluidas en la distribución principal. Esto reduce de manera importante la curva de aprendizaje
tanto para los desarrolladores novatos como para los expertos, y es una de las razones por
las que PHP es favorecido como una herramienta rápida para la creación de prototipos que
permitan el desarrollo de aplicaciones basadas en Web.

Código libre PHP es un proyecto de código libre; el lenguaje es desarrollado por un grupo
de programadores voluntarios distribuidos por todo el mundo, quienes ponen a disposición
gratuita el código fuente a través de Internet, y puede ser utilizado sin costo, sin pagos por licencia
y sin necesidad de grandes inversiones en equipo de cómputo ni programas. Con ello se
reduce el costo del desarrollo de programas sin afectar la flexibilidad ni la confiabilidad de los
productos. La naturaleza del código libre implica que cualquier desarrollador, dondequiera que
se encuentre, puede inspeccionar el árbol de código, detectar errores y sugerir posibles correcciones;
con esto se produce un producto estable y robusto, en que las fallas, una vez descubiertas,
se corrigen rápidamente, en algunas ocasiones, ¡horas después de ser descubiertas!
Soporte comunitario Una de las mejores características de los lenguajes a los que da soporte
una comunidad, como PHP, es el acceso que ofrece a la creatividad e imaginación de
cientos de desarrolladores ubicados en diferentes partes del mundo. En la comunidad PHP, los
frutos de esta creatividad pueden ser encontrados en PEAR (PHP Extension and Application
Repository), el repositorio de extensiones y aplicaciones de PHP (http://pear.php.net), y en
PECL (PHP Extension Community Library), la biblioteca de la comunidad de extensiones
PHP (http://pecl.php.net), que contienen cientos de soluciones y extensiones que los desarrolladores
pueden ocupar para añadir sin esfuerzo nuevas funcionalidades a sus aplicaciones
PHP. Utilizar estas soluciones suele ser una mejor opción en tiempo y costo, en vez de desarrollar
desde cero tu propio código.

Soporte a aplicaciones de terceros Una de las fortalezas históricas de PHP ha sido su
soporte a una amplia gama de diferentes bases de datos, entre las cuales se incluyen MySQL,

PostgreSQL, Oracle y Microsoft SQL Server. PHP 5.3 soporta más de quince diferentes motores
de bases de datos, e incluye una API (interfaz de programación de aplicaciones) común
para el acceso a base de datos. El soporte para XML facilita la lectura (y escritura) de documentos
XML como si fueran estructuras de datos nativas de PHP; es posible accesar a colecciones
de nodos XML utilizando XPath y transformar código XML en otros formatos con las
hojas de estilo XSLT.

Y no termina aquí. La arquitectura extensible de PHP permite que los desarrolladores
escriban sus propias adiciones personalizadas al lenguaje, de manera que hoy en día los desarrolladores
de PHP pueden hacer que sus aplicaciones lean y registren imágenes en formato
GIF, JPEG y PNG; enviar y recibir correos electrónicos utilizando protocolos SMTP, IMAP y
POP3; colaborar con servicios Web utilizando protocolos SOAP y REST; validar datos de entrada
utilizando expresiones regulares de Perl, además de crear y manipular documentos PDF.
Más aún, PHP puede acceder a las bibliotecas de C, las clases de Java y los objetos COM, ¡y
aprovechar el código escrito en esos lenguajes!

Algoritmo de las 8 reinas en Java

public boolean solucionReinas()
{
solucion = false;
ponerReina(1);
return solucion;
} private void ponerReina(int i)
{
int j;
j = 0; // inicializa posibles movimientos
do {
j++;
reinas[i] = j; // prueba a colocar reina i en fila j,
// a la vez queda anotado el movimiento
if (valido(i))
{
if (i < N) // no completado el problema


{
ponerReina(i+1);
// vuelta atrás
if (!solucion)
reinas[i] = 0;
}
else // todas las reinas colocadas
solucion = true;
}
} while(!solucion && (j < 8));
}
private boolean valido(int i)
{
/* Inspecciona si la reina de la columna i es atacada por
alguna reina colocada anteriormente */
int r;
boolean libre;
libre = true;
for (r = 1; r <= i-1; r++)
{
// no esté en la misma fila
libre = libre && (reinas[i] != reinas[r]);
// no esté en alguna de las dos diagonales
libre = libre && ((i + reinas[i]) != (r + reinas[r]));
libre = libre && ((i - reinas[i]) != (r - reinas[r]));
}

Recursion infinita

La iteración y la recursión pueden producirse infinitamente. Un bucle infinito ocurre si la prueba
o test de continuación de bucle nunca se vuelve falsa; una recursión infinita ocurre si la etapa
de recursión no reduce el problema en cada ocasión, de modo que converja sobre el caso base o
condición de salida.


La recursión infinita significa que cada llamada recursiva produce otra llamada recursiva
y ésta, a su vez, otra llamada recursiva, y así para siempre. En la práctica, dicho método se
ejecutará hasta que la computadora agote la memoria disponible y se produzca una terminación
anormal del programa.
El flujo de control de un método recursivo requiere tres condiciones para una terminación
normal:
• Un test para detener (o continuar) la recursión (condición de salida o caso base).
• Una llamada recursiva (para continuar la recursión).
• Un caso final para terminar la recursión.




¿Que es mejor la recursion o iteracion?

Se han estudiado varios métodos que se pueden implementar fácilmente, bien de modo recursivo,
bien de modo iterativo. En esta sección se comparan los dos enfoques y se examinan las razones
por las que el programador puede elegir un enfoque u otro según la situación específica.
Tanto la iteración como la recursión se basan en una estructura de control: la iteración utiliza
una estructura repetitiva y la recursión utiliza una estructura de selección. Tanto la iteración
como la recursión implican repetición: la iteración utiliza explícitamente una estructura repetitiva
mientras que la recursión consigue la repetición mediante llamadas repetidas al método.
La iteración y la recursión implican cada una un test de terminación (condición de parada). La
iteración termina cuando la condición del bucle no se cumple, mientras que la recursión termina
cuando se reconoce un caso base o se alcanza la condición de parada.
La recursión tiene muchas desventajas. Se invoca repetidamente al mecanismo de llamadas a
métodos y, en consecuencia, se necesita un tiempo suplementario para realizar cada llamada.

Esta característica puede resultar cara en tiempo de procesador y espacio de memoria. Cada
llamada recursiva produce una nueva creación y copia de las variables de la función, esto consume
más memoria e incrementa el tiempo de ejecución. Por el contrario, la iteración se produce
dentro de un método, de modo que las operaciones suplementarias en la llamada al método y en
la asignación de memoria adicional son omitidas.
Entonces, ¿cuáles son las razones para elegir la recursión? La razón fundamental es que
existen numerosos problemas complejos que poseen naturaleza recursiva y, en consecuencia, son
más fáciles de implementar con algoritmos de este tipo. Sin embargo, en condiciones críticas de
tiempo y de memoria; es decir, cuando el consumo de tiempo y memoria sean decisivos o concluyentes
para la resolución del problema, la solución a elegir debe ser, normalmente, la iterativa.

Mostrar alfabeto en forma recursiva Java

public class Alfabeto
{
public static void main(String [] a)
{
System.out.println();
metodoA('Z');
System.out.println();
}
static void metodoA(char c)
{
if (c > 'A')

metodoB(c);
System.out.print(c);
}
static void metodoB(char c)
{
metodoA(--c);
}
}

Factorial Recursivo Java

import java.io.*;
public class Factorial
{
public static void main(String[] ar)throws IOException
{
int n;
BufferedReader entrada = new BufferedReader(
new InputStreamReader(System.in));
do {
System.out.print("Introduzca número n: ");
n = Integer.parseInt(entrada.readLine());
}while (n < 0);
System.out.println("\n \t" + n + "!= " + factorial(n));
}
static long factorial (int n)
{
if (n <= 1)
return 1;
else
{
long resultado = n * factorial(n - 1);
return resultado;
}
}
}

Implementar una interfaz en Java

La interfaz especifica el comportamiento común que tiene un conjunto de clases. Dicho comportamiento
se implementa en cada una de las clases, es lo que se entiende como implementación
de una interfaz. Se utiliza una sintaxis similar a la derivación o extensión de una clase, con la
palabra reservada implements en lugar de extends.
class NombreClase implements NombreInterfaz


{
// definición de atributos
// implementación de métodos de la clase
// implementación de métodos de la interfaz
}


La clase que implementa una interfaz tiene que especificar el código (la implementación) de
cada uno de los métodos de la interfaz. De no hacerlo la clase se convierte en clase abstracta y
entonces debe declararse abstract. Es una forma de obligar a que cada método de la interfaz
se implemente.

Considérese una jerarquía de barcos, todos tienen como comportamiento común msgeSocorro()
y alarma(). Las clases BarcoPasaje, PortaAvion y Pesquero implementan el comportamiento
común.
Se declara la interfaz Barco:
interface Barco
{
void alarma();
void msgeSocorro(String av);
}

Las clases BarcoPasaje, PortaAvion y Pesquero implementan la interfaz Barco y, además,
sus métodos:
class BarcoPasaje implements Barco
{
private int eslora;
private int numeroCamas = 101;
public BarcoPasaje()
{
System.out.println("Se crea objeto BarcoPasaje.");
}
public void alarma()
{
System.out.println("¡¡¡ Alarma del barco pasajero !!!");
}
public void msgeSocorro(String av)
{
alarma();
System.out.println("¡¡¡ SOS SOS !!!" + av);
}
}


class PortaAvion implements Barco
{
private int aviones = 19;
private int tripulacion;
public PortaAvion(int marinos)
{
tripulacion = marinos;
System.out.println("Se crea objeto PortaAviones.");
}
public void alarma()
{
System.out.println("¡¡¡ marineros a sus puestos !!!");
}
public void msgeSocorro(String av)
{
System.out.println("¡¡¡ SOS SOS !!! " + av);
}
} class Pesquero implements Barco
{


private int eslora;
private double potencia;
private int pescadores;
String nombre;
public Pesquero(int tripulacion)
{
pescadores = tripulacion;
System.out.println("Se crea objeto Barco Pesquero.");
}
public void alarma()
{
System.out.println("¡¡¡ Alarma desde el pesquero " +
nombre + " !!!");
}
public void msgeSocorro(String av)
{
System.out.println("¡¡¡ SOS SOS !!! " + av);
}
}

INTERFACES JAVA

Java incorpora una construcción del lenguaje, llamada interface, que permite declarar un
conjunto de constantes y de cabeceras de métodos abstractos. Estos deben implementarse en las
clases y constituyen su interfaz. En cierto modo, es una forma de declarar que todos los métodos
de una clase son públicos y abstractos, con lo que se especifica el comportamiento común de
todas las clases que implementen la interfaz.


La declaración de una interfaz es similar a la de una clase; en la cabecera se utiliza la palabra
reservada interface en vez de class, por ejemplo:


public interface NodoG
{
boolean igual(NodoG t);
NodoG asignar(NodoG t);
void escribir(NodoG t);
}
La interfaz NodoG define tres métodos abstractos y además públicos. Sin embargo no es necesario
especificar ni abstract ni public ya que todos los métodos de una interface lo son.

Sintaxis
acceso interface NombreInterface
{
constante1;
...
constanten;
tipo1 nombreMetodo1(argumentos);
...
tipon nombreMetodon (argumentos);

} acceso es la visibilidad de la interfaz definida, normalmente public.

Ventajas del polimorfismo Java

El polimorfismo hace su sistema más flexible sin perder ninguna de las ventajas de la compilación
estática de tipos que tienen lugar en tiempo de compilación. Este es el caso de Java.
Las aplicaciones más frecuentes del polimorfismo son:
• Especialización de clases derivadas. El uso más común del polimorfismo es derivar clases
especializadas de clases que han sido definidas. Así, por ejemplo, una clase Cuadrado es
una especialización de la clase Rectangulo (cualquier cuadrado es un tipo de rectángulo).
Esta clase de polimorfismo aumenta la eficiencia de la subclase, mientras conserva un alto
grado de flexibilidad y permite un medio uniforme de manejar rectángulos y cuadrados.
• Estructuras de datos heterogéneos. A veces es muy útil poder manipular conjuntos
similares de objetos. Con polimorfismo se pueden crear y manejar fácilmente estructuras
de datos heterogéneos, que son fáciles de diseñar y dibujar, sin perder la comprobación de
tipos de los elementos utilizados.
• Gestión de una jerarquía de clases. Las jerarquías de clases son colecciones de clases
altamente estructuradas, con relaciones de herencia que se pueden extender fácilmente.

Declaración de un tipo parametrizado Java

Al nombre de la colección le sigue el tipo de los elementos entre paréntesis angulares (< tipo>):
Coleccion<tipo> v;
Si se parametrizan dos tipos, como ocurre con los mapas, se separan con coma:
Coleccion<tipoClave,tipoValor> cc;

Por ejemplo:

Stack<Double> pila;
SortedMap<Integer,String> mapa;
Realmente con el tipo parametrizado es como si se hubiera declarado otra clase, en consecuencia
las instancias de colecciones parametrizadas se crean con esa clase, es decir new
Coleccion<tipo> crea la instancia. Por ejemplo:
pila = newStack<Double>();
mapa = newTreeMap<Integer,String>();



A continuación del nombre de la clase se especifican los tipos parametrizados entre
paréntesis angulares:
Coleccion<tipo1...> var;
Para crear instancias, new Coleccion<tipo1...>();
Por ejemplo:
Set<Integer> cn = new TreeSet<Integer>();