Documente Academic
Documente Profesional
Documente Cultură
Ahora mira otra vez. Por cada cosa que ve, hay una infinidad de detalles para
observar: su tamaño, su color, su propósito previsto, los componentes con los
que está ensamblado (las patas sobre una mesa, las bombillas en una
lámpara), etc. Además, cada uno de estos componentes a su vez tiene detalles
asociados: el tipo de material utilizado para hacer las patas de la mesa (madera
o metal), el vataje de las bombillas, etc. Ahora factor en tus otros sentidos: el
sonido de alguien roncando (¡Ojalá no mientras lee este libro!), el olor a
palomitas de maíz que sale del horno de microondas al final del pasillo, etc.
Finalmente, piense en todos los detalles ocultos de estos objetos: quién los
fabricó, o cuál es su composición química, molecular o genética.
Si intentamos que la regla sea menos restrictiva eliminando la regla del "vuelo",
nos quedamos con
• Tiene plumas
• Tiene alas
• Pone huevos
Como muestra la Figura 1-6, esta vez hemos ido demasiado lejos: la
abstracción de un pájaro es ahora tan general que incluiríamos aviones,
insectos y todo tipo de otras aves que no sean de la mezcla.
El proceso de definición de reglas para fines de categorización implica "marcar"
solo el conjunto correcto de reglas, no demasiado generales, no demasiado
restrictivas y que no contienen redundancias, para definir la membresía
correcta en una clase en particular.
Abstracción como base para el desarrollo de software
Debemos hacer un juicio sobre cuáles de estos detalles son relevantes para el
propósito final del sistema. Esto es esencial, ya que no podemos
automatizarlos todos. Incluir demasiados detalles es complicar demasiado el
sistema resultante, por lo que es mucho más difícil de diseñar, programar,
probar, depurar, documentar, mantener y ampliar en el futuro.
Una vez que hayamos determinado los aspectos esenciales de una situación,
algo que exploraremos en la Parte 2 de este libro, podemos preparar un
modelo de esa situación. El modelado es el proceso por el cual desarrollamos
un patrón para hacer algo. Un modelo para un hogar personalizado, un
diagrama esquemático de un circuito impreso y un cortador de galletas son
todos ejemplos de tales patrones. Como veremos en las partes 2 y 3, un
modelo de objeto de un sistema de software es ese patrón. El modelado y la
abstracción van de la mano, porque un modelo es esencialmente una
representación física o gráfica de una abstracción; antes de que podamos
modelar algo de manera efectiva, debemos haber determinado los detalles
esenciales del tema a modelar.
Reutilización de abstracciones
Al aprender sobre algo nuevo, buscamos automáticamente en nuestro archivo
mental otras abstracciones / modelos que hemos construido y dominado
previamente, para buscar similitudes sobre las que podamos construir. Cuando
aprende a andar en bicicleta de dos ruedas por primera vez, por ejemplo,
puede haber recurrido a las lecciones que aprendió sobre montar un triciclo
cuando era niño (consulte la Figura 1-7). Ambos tienen manillares que se usan
para dirigir; ambos tienen pedales que se utilizan para propulsar la bicicleta
hacia adelante. Aunque las abstracciones no encajaban a la perfección (una
bicicleta de dos ruedas presentaba el nuevo desafío de tener que equilibrarse)
había suficiente similitud que le permitía aprovechar la experiencia de dirección
y pedaleo que ya dominaba, y centrarse en aprendiendo la nueva habilidad de
cómo balancearse sobre dos ruedas.
• Para complicar aún más las cosas, prácticamente nunca hay un solo modelo
"mejor" o "correcto", solo modelos "mejores" o "peores" en relación con el
problema a resolver. La misma situación se puede modelar en una variedad de
formas diferentes, igualmente válidas. Cuando lleguemos a hacer un poco de
modelado en la Parte 2 de este libro, veremos una cantidad de abstracciones
alternativas válidas para nuestro estudio de caso del Sistema de Registro de
Estudiantes (SRS) que se presentó al final de la Introducción.
• Tenga en cuenta, sin embargo, que existe un modelo incorrecto: a saber, uno
que tergiversa la situación del mundo real (por ejemplo, modelar una persona
que tiene dos tipos de sangre diferentes).
• Buenas habilidades para escuchar: Estas serán útiles ya que los futuros
usuarios del sistema describen cómo hacen su trabajo actualmente, o cómo
prevén hacer su trabajo en el futuro, con la ayuda del sistema que estamos a
punto de desarrollar.
La Parte 2 de este libro cubre estos tres aspectos del proceso de modelado, la
notación y la herramienta en detalle.
Resumen
En este capítulo, has aprendido que
Después de aprender qué hace que los objetos "marquen" en la Parte 1 del
libro y cómo modelar una aplicación para aprovechar los objetos en la Parte 2,
estará listo para la gran final: renderizar un modelo de objeto en código para
producir un Estudiante que trabaje Aplicación del Sistema de Registro (SRS) en
la Parte 3. Como se mencionó anteriormente, podríamos avanzar construyendo
el SRS usando cualquier lenguaje de programación OO. ¿Por qué querríamos
usar Java? Siga leyendo y verá rápidamente por qué.
Java es arquitectura neutral
• Incluso la función principal utilizada para iniciar una aplicación (en Java se
llama el método principal) ya no está sola, sino que se incluye dentro de una
clase, y las razones por las cuales la exploraremos en profundidad en los
capítulos siguientes.
Debido a esto, Java se presta particularmente bien para escribir aplicaciones
que defienden el paradigma OO. Sin embargo, como señalé en la introducción
de este libro, el mero hecho de utilizar un lenguaje OO de este tipo no garantiza
que las aplicaciones que usted produzca sean fieles a este paradigma. Debe
tener conocimientos tanto sobre cómo diseñar una aplicación desde cero para
hacer el mejor uso de los objetos como sobre cómo aplicar el idioma
correctamente, que son los propósitos primarios de este libro.
La práctica hace la perfección
Te recordaré este hecho unas cuantas veces más, para que no olvides y
accidentalmente intentes escribir y compilar un seudocódigo en algún punto del
camino.
Anatomía de un programa simple de Java
La Figura 2-8 muestra una de las aplicaciones Java más simples.
Repasemos los elementos clave de nuestro programa simple.
Comments
donde llaves {...} encierran el cuerpo de la clase que incluye la lógica principal
del programa junto con otros bloques de construcción opcionales de una clase.
Una vez que hemos ingresado nuestra lógica de programa, como texto, en un
archivo, usando un editor de texto simple (como Windows Notepad o vi) o una
herramienta Java Integrated Development Environment (IDE), primero
debemos compilar el código fuente en bytecode antes podemos ejecutarlo.
Para las personas que son competentes con vi (un editor de Unix / Linux),
tenga en cuenta que hay una versión compatible con Windows / DOS
llamada vim que está disponible sin costo en http: //www.vim.org-
específicamente, puede ser descargado de
http://www.vim.org/download.php.
Una vez que haya dominado el lenguaje Java, puede "graduarse" a un IDE
más complejo si lo desea.
Tenga en cuenta que es importante omitir el sufijo .class del nombre de archivo
de código de bytes (que se llama SimpleProgram.class en este caso).
De forma predeterminada, la JVM buscará en su directorio de trabajo
predeterminado junto con el directorio "de inicio" donde se ha instalado el
idioma de Java en su sistema informático para dichos archivos de código de
bytes. Si la JVM encuentra el archivo bytecode especificado, ejecuta su método
principal y ¡su programa está apagado y en funcionamiento!
El lenguaje Java define ocho tipos primitivos (los ocho nombres de estos tipos
son Java palabras clave), de la siguiente manera.
Cuatro tipos de datos numéricos enteros:
• byte: entero sin signo de 8 bits
• short: entero de 16 bits con signo
• int: entero de 32 bits con signo
• largo: entero con signo de 64 bits
Dos tipos numéricos de coma flotante:
• flotante: punto flotante de precisión simple de 32 bits
• doble: coma flotante de doble precisión de 64 bits
Además de dos tipos primitivos adicionales:
• char: un solo carácter, almacenado utilizando codificación Unicode de 16 bits
(frente a la codificación ASCII de 8 bits), que permite a Java manejar una
amplia gama de conjuntos de caracteres internacionales.
• booleano: una variable que solo puede asumir uno de dos valores: verdadero
o falso (ambos valores son palabras reservadas en Java). Las variables
booleanas a menudo se usan como indicadores para señalar
precio = costo + (a + b) / longitud; // Una vez más suponemos que todas las
variables fueron
// correctamente declarado anteriormente en el programa.
El uso de comillas dobles ("...") está reservado para asignar valores literales a
las variables de cadena, un tipo distinto que se tratará más adelante en este
capítulo. Lo siguiente no se compilaría en Java:
Para corregir este error, deberíamos asignar un valor explícito a bar, así como
a foo, antes de usarlos en la expresión de suma:
int foo;
int bar;
foo = 3;
// We're now initializing BOTH variables explicitly.
bar = 7;
foo = foo + bar; // This line will now compile properly.
El tipo de cadena
Veremos otro tipo de Java más importante en este capítulo: el tipo de cadena.
Una cadena representa una secuencia de cero o más caracteres Unicode.
El símbolo String comienza con una "S" mayúscula, mientras que los nombres
de los tipos primitivos se expresan en minúsculas: int, float, boolean, etc. Esta
diferencia de mayúsculas es deliberada y la cadena obligatoria (minúsculas) no
funcionará como un tipo :
cadena s = "foo"; // Esto no se compilará.
Aquí está el mensaje de error:
cannot find symbol
symbol: string
Hay varias formas de crear e inicializar una variable String. La manera más fácil
y más comúnmente utilizada es declarar una variable de tipo String y asignar
un valor a la variable mediante un literal de cadena. Un literal de cadena es
cualquier texto entre comillas dobles, incluso si consta de un solo carácter:
String name = "Steve"; // Note the use of double quotes, regardless of the
String shortString = "A"; // length, when we're assigning a literal value
// to a String variable.
Los últimos dos operadores aritméticos que veremos son los operadores de
incremento unificado (++) y decremento (-), que se utilizan para aumentar o
disminuir el valor de una variable int en 1 o de un punto flotante (flotante) ,
doble) valor por 1.0. Se los conoce como operadores unarios porque se aplican
a una sola variable, mientras que los operadores binarios combinan los valores
de dos expresiones como se discutió anteriormente. Los operadores de
incremento y decremento unarios también se pueden aplicar a variables char
para avanzar o retroceder una posición de carácter en la secuencia de
clasificación Unicode. Por ejemplo, en el siguiente fragmento de código, el valor
de la variable c se incrementará de 'e' a 'f':
char c = 'e';
c++; // c will be incremented from 'e' to 'f'.
Aquí hay un ejemplo que usa el operador lógico "y" para programar el
compuesto lógico expresión "si x es mayor que 2.0 y y no es igual a 4.0":
if ((x > 2.0) && (y != 4.0)) { ... }
la expresión (x> 2.0) && (y! = 4.0) se evalúa como verdadera y, por lo tanto, se
dice que la expresión (x> 2.0) && (y! = 4.0) es una expresión de tipo booleano.
Y, en el siguiente fragmento de código
int x = 1;
int y = 2;
int z = 3;
int answer = ((8 * (y + z)) + y) * x;
En otras palabras, tendríamos que reescribir la última línea del ejemplo anterior
de la siguiente manera para que el compilador de Java permita la asignación
de un valor de coma flotante más preciso a una variable entera menos precisa:
int x;
double y;
y = 2.7;
x = (int) y; // This will compile now, because we have explicitly
// informed the compiler that we WANT a
// narrowing conversion to occur.