¿Qué es la Ciencia Cognitiva?

La ciencia cognitiva es el estudio interdisciplinario de la mente y la inteligencia, que abarca la filosofía, la psicología, la inteligencia artificial, la neurociencia, la lingüística y la antropología.

Origen intelectual

Surge a mediados de la década de 1950 cuando investigadores de varios campos comenzaron a desarrollar teorías sobre la mente, basados en representaciones complejas y procedimientos de cálculo.

Organización

A mediados de la década de 1970 se forma la Sociedad de la Ciencia Cognitiva y aparece la revista Cognitive Science. Desde entonces, más de setenta universidades de América del Norte, Europa, Asia y Australia han establecido programas de ciencias cognitivas, y muchos otros han instituido cursos en la ciencia cognitiva.

“El chimpancé descubre que hablar lo mete en problemas”. –Chomsky Gene.

Más información: Cerebros, Mentes y Máquinas.

Cosas que necesito tatuarme sobre PHP y OOP

¿Cuándo debo usar require o include?

La función require() es idéntica a include(), excepto que controla los errores de manera diferente. Si se produce un error, la función include() genera una advertencia, pero el script seguirá con su ejecución. Por otro lado, El require() genera un error fatal, por lo que el script se detendrá.

¿Cuándo debo usar require_once o require?

La declaración require_once () es idéntica a require(), pero PHP comprobará si el archivo ya se ha incluido, y si es así, no lo incluye otra vez.

Interfaces

Las clases abstractas son una característica mal entendida de la programación en PHP orientada a objetos (OOP) y la fuente de confusión surge cuando se considera frente a una interfaz.

¿Cuándo debo usar interfaces?

La razón obvia para usar una interfaz es que una clase hija puede implementar varias interfaces, pero sólo puede extender una única clase abstracta.

¿Cuándo debo usar clases abstractas?

Cuando no se requiere hacer uso de herencia múltiple se recomienda usar clases abstractas, simplemente porque permiten más tarde añadir funcionalidad básica dentro de la clase abstracta. Sin embargo las razones de la creación de clases abstractas debe ser más que eso.

“Abstract” sólo indica que algo fue declarado pero no definido, por lo que antes de usarlo, es necesario definirlo.

¿Por qué debo utilizar clases abstractas?

Una clase abstracta proporciona funciones base concretas, así como funciones abstractas que deben ser implementadas por clases concretas hijas que se vinculan por algo que llamaremos: un contrato.

El brillo sutil de las clases abstractas

Pueden llamar a funciones abstractas dentro de las funciones de la base concreta. Por ejemplo:

abstract class Vehicle { 
  function start() { 
    $ready = $this->drive();      // Existe en la clase hija por contrato.
    return strtoupper($ready); 
  } 
  abstract function drive();      // Este es el contrato.
} 
 
class Car extends Vehicle { 
  function drive() {              // Esta implementación concreta es obligatoria.
    return "Please accelarate your car."; 
  } 
} 

class Motorcycle extends Vehicle {
  // Actually you ride a motorcycle.
  function drive() {              // Esta implementación concreta es obligatoria.
    return "Please accelarate your motorcycle."; 
  } 
} 
 
$car = new Car(); 
echo $car->start();

$motorcycle = new Motorcycle(); 
echo $motorcycle->start();

Para comprender mejor las clases abstractas:

  • Herencia simple. Las clases hijas sólo pueden extender sólo una clase a la vez.
  • Las clases abstractas no pueden ser instanciadas – no se usa new Vehicle();
  • Las clases abstractas sólo pueden definir variables de clase del tipo const.
  • La clase abstracta A puede ser extendida por otra clase abstracta B. La clase B puede implementar alguna o ninguna de las funciones abstractas en A.
  • En el caso anterior, una clase hija C que extiende a la clase abstracta B debe implementar todas las funciones abstractas de B, así como las funciones abstractas en A que no se hayan implementado en la clase abstracta B.
  • Los parámetros de las funciones concretas y las funciones abstractas deben coincidir. Sin embargo, si una función abstracta se define como función abstracta turnOff($message); entonces está bien implementarla como turnOff($message, $lock = TRUE), pero no como turnOff($message, $lock).
  • La visibilidad de las funciones en las clases hijas debe ser la mismo o menos restrictiva que las de la clase madre. Por lo tanto protected abstract function puede ser implementada como protected o public pero no como private.
  • Arriba de PHP 5.3 si es permitido declarar funciones como static abstract.

A diferencia de las interfaces, las clases abstractas si son clases. Estas son otras características:

  • Las clases abstractas pueden tener “consts”, “members”, “method stubs” y “defined methods”, mientras que las interfaces sólo pueden tener “consts” y  “method stubs“.
  • Los métodos y los miembros de una clase abstracta se pueden definir con cualquier visibilidad, mientras que todos los métodos de una interfaz se deben definir como públicos.
  • Al heredar una clase abstracta, la clase hija debe definir los métodos abstractos, mientras que una interfaz puede extender otra interfaz y no es necesario que los métodos deban ser definidos.
  • Una clase hija sólo puede extender una sola clase abstracta (o cualquier otra), mientras que una interfaz se puede extender, también una clase puede implementar otras múltiples interfaces.
  • Una clase hija puede definir métodos abstractos con la misma o visibilidad menor restrictiva, mientras que una clase que implementa una interfaz debe definir los métodos con la misma visibilidad exacta.

Abstract Class vs Final Class/”Class Constant”

  • Una clase abstracta no puede ser instanciada. En otras palabras, no podemos crear directamente el objeto de la clase abstracta. Pero con las clases final sí podemos crear una instancia.
  • Una clase abstracta debe ser extendida mientras una clase final no lo puede ser.
  • Una clase final no puede contener métodos abstractos, pero una clase abstracta sí puede contener métodos final.

Traits

Arriba de PHP 5.4, las clases abstractas son antigüedades y no deben utilizarse. La clara separación de las interfaces y los traits proporciona los mismos beneficios DRY y son menos restrictivos para el desarrollador.

Los traits no implican una relación. Son puramente reutilización de código. En tiempo de ejecución, los traits no existen. No dicen nada acerca de un objeto que los utiliza, cómo se comportan, lo que puede hacer con ellos, o cualquier otra cosa. Los traits son puramente reutilización de código. En ese sentido, son completamente ortogonales a las interfaces; mientras que una interfaz es la reutilización puramente de la interfaz, un trait es puramente reutilización de código.

Las clases abstractas existen para apoyar a los desarrolladores de PHP 5.3, que aún no tienen acceso a los traits.