Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Alex Rodríguez

Páginas: 1 ... 50 51 52 53 54 [55] 56 57 58 59 60 ... 93
1081
Hola rubens23, cuando se trate de una corrección o modificación sobre algo que se estaba tratando en otro hilo, responde en el mismo hilo abierto en lugar de en uno nuevo. Voy a unir la conversación con la anteriormente abierta.

Saludos

1082
Hola Dan, buen código, has hecho hasta los cálculos de salinidad :)

Lo único que no veo bien resuelto es esto:

Código: [Seleccionar]
switch(elige){
            case 1: System.out.println("Productos frescos:");
                tomate.imprimirInfo();
                manzana.imprimirInfo();
            break;
            case 2: System.out.println("Productos refrigerados:");
                leche.imprimirDatos();
                jugo.imprimirDatos();
                queso.imprimirDatos();
            break;
            case 3: System.out.println("PRODUCTOS CONGELADOS.\nCongelados por agua: ");
                pescado.imprimirDatos();
                cangrejo.imprimirDatos();
                rex.imprimirDatos();
                pulpo.imprimirDatos();
                System.out.println("Congelados por nitrogeno:");
                cordero.imprimirDatos();
            break;
            case 4: System.out.println("Prueba finalizada!"); break;
            default: System.out.println("Caracter invalido."); break;
        }

Aunque sea un ejercicio, en general nunca recorreremos una colección a mano, sino usando alguna forma de recorrido automatizada (como un iterador, un bucle for, un bucle for extendido, etc.). Siempre hay que pensar que una colección en vez de 2 elementos podría tener 200 y no vamos a escribir 200 líneas pro1.imprimirInfo(), pro2.imprimirInfo(), pro3.imprimirInfo() ... hasta pro200.imprimirInfo(), por eso nunca recorremos las colecciones a mano, ni siquiera cuando tienen pocos elementos.

Saludos

1083
Habría que probarlo, no estoy muy seguro de qué responderá si no le llegan valores por post (if ($secureimage->check($post['captcha_code']) == false){)  pero sería justo al principio

Código: [Seleccionar]
<?php
session_start
(); ?>

<?php require_once('Connections/conexion_usuarios.php'); ?>

<?php
//check captcha    
include_once 'http://localhost/sitio4/securimage/securimage.php'
$securimage = new Securimage();
// Verifify captcha
if ($secureimage->check($post['captcha_code']) == false){
    echo 
"The security code entered was incorrect.<br />";
echo "<a href='javascript:history.go(-1)'>Try again</a>.";
exit;            
}

if (!
function_exists("GetSQLValueString")) {
...
...

Saludos

1084
Ahora sí... Hola en este código he visto algo que me resulta extraño.

Código: [Seleccionar]
$MM_flag="MM_insert";
if (isset($_POST[$MM_flag])) {
  $MM_dupKeyRedirect="ya_existe_registro.php";
  $loginUsername = $_POST['email'];
  $LoginRS__query = sprintf("SELECT email FROM usuarios WHERE email=%s", GetSQLValueString($loginUsername, "text"));
  mysql_select_db($database_conexion_usuarios, $conexion_usuarios);
  $LoginRS=mysql_query($LoginRS__query, $conexion_usuarios) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);

  //if there is a row in the database, the username was found - can not add the requested username
  if($loginFoundUser){
    $MM_qsChar = "?";

//check captcha   
include_once 'http://localhost/sitio4/securimage/securimage.php';
$securimage = new Securimage();
// Verifify captcha
if ($secureimage->check($post['captcha_code']) == false){
    echo "The security code entered was incorrect.<br />";
echo "<a href='javascript:history.go(-1)'>Try again</a>.";
exit;           
}

    //append the username to the redirect page
    if (substr_count($MM_dupKeyRedirect,"?") >=1) $MM_qsChar = "&";
    $MM_dupKeyRedirect = $MM_dupKeyRedirect . $MM_qsChar ."requsername=".$loginUsername;
    header ("Location: $MM_dupKeyRedirect");
    exit;
  }
 
}

El formulario es un formulario de registro. El usuario introduce los datos y el captcha. Si el captcha es erróneo no se debe avanzar. Sin embargo aquí

Código: [Seleccionar]
$loginUsername = $_POST['email'];
  $LoginRS__query = sprintf("SELECT email FROM usuarios WHERE email=%s", GetSQLValueString($loginUsername, "text"));
  mysql_select_db($database_conexion_usuarios, $conexion_usuarios);
  $LoginRS=mysql_query($LoginRS__query, $conexion_usuarios) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);

Lo que parece hacer es tomar el valor email  que le llega del formulario (en $loginUsername = $_POST['email']; ) para comprobar si el usuario existe en la base de datos, y sólo si existe, hace la comprobación del captcha.

¿No tendría que estar la comprobación del captcha antes de cualquier cosa? Tal y como está escrito parece que sólo verifica el captcha si el usuario existe en la base de datos, pero esto no tendría sentido, la verificación del captcha tendría que ser anterior a cualquier otro paso  ::)

Saludos

1085
Hola toni, me parece una reflexión acertada como las que haces habitualmente. El diseño del software (y más ampliamente toda la organización en torno a los grandes desarrollos de software donde intervienen decenas, cientos o miles de programadores en un proyecto, lo que se llama ingeniería del software) es algo todavía muy discutido, aunque hay un cierto grado de consenso sobre que es muy importante la ampliabilidad y la mantenibilidad. En un proyecto con miles de líneas de código en general se prefiere generar unas cuantas líneas más (aunque no sea óptimo) para hacer el código más legible y comprensible, porque a la larga esto tiene una repercusión positiva en el mantenimiento y ampliación. Creo que lo que indicas de compactación de clases y atributos tiene un valor positivo, pero todo hay que verlo en un contexto más amplio donde hay que poner en la balanza ventajas e inconvenientes y dado que no hay soluciones óptimas, elegir la que aporte más ventajas. La compactación es un buen valor para un programador, pero siempre que no vaya en contra de la claridad, la mantenibilidad, la ampliabilidad, etc. Creo que más o menos he dicho lo mismo que tú decías.

Saludos

1086
Hola, en primer lugar te recomiendo este curso donde tienes todos los conceptos básicos  http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

La etapa 3 por lo que veo te va indicando los pasos que tienes que dar. Lo primero sería crear la clase Entrada.

Tendrías que crear la clase teniendo como atributos de clase (campos):

- private Sesion sesion; (porque te dice que cada entrada es para una sesión)

- private double precio; (para guardar el precio)

Y los métodos getter y setter correspondientes...

Vete creando el código y vete pegándolo en el foro siguiendo las instrucciones del enunciado para que lo revisemos, si no sabes hacer algo indica el punto concreto del código o del enunciado que no entiendes para tratar de mirarlo y darte una orientación.

Saludos

1087
Hola, a mí me sigue diciendo "no encontrado"  ::)

1088
Hola no sé si a ti te permite descargar algo pero a mí cuando pulso en http://www.thkseditores.com/otros/securimage.rar me dice "no encontrado"

Saludos

1089
Sí, he podido descargarlo con botón derecho y opción descargar (a lo mejor no lo probé así antes ?)

¿Puedes explicar lo que llevas hecho y qué es lo que te está dando problemas o no sabes hacer?

 ::)

1090
Hola, en primer lugar pedirte por favor que no repitas el mismo mensaje en distintos puntos del foro o podrías ser bloqueado por los moderadores. Voy a mantener este hilo y borrar el otro abierto con el mismo tema.

Sobre la cuestión que planteas, en el link de descarga el documento pdf indica "sólo lectura" y no permite ser descargado. Por otra parte, indicarte que es necesario que des una descripción más amplia de qué es lo que llevas hecho y el punto concreto donde no sabes cómo avanzar o donde obtienes errores, de otra forma resultará complicado ayudarte.

Saludos

1091
Hola Jaime, para escribir en los foros siempre y cuando no estés continuando una conversación ya existente pulsa en el nombre de un foro y luego en nuevo tema para escribir una nueva consulta. No escribas dentro de un tema que abre sobre otra cuestión.

Respecto a la pregunta:

Operadores de Incremento y Decremento

Los operadores ++ y -- son los operadores de incremento y decremento, respectivamente. La expresión i++ es equivalente a i=i+1, salvo que i se evalúa sólo una vez.

Los operadores de incremento y decremento pueden ser prefijos o postfijos, dependiendo de si aparecen delante o detrás del operando. Si el operador está delante, la operación se realiza antes de que sea devuelto el valor de la expresión. Si está detrás la operación se realiza después de que se haya usado el valor original. Por ejemplo:

Código: [Seleccionar]
class Prepost{
   public static void main(String [] args){
   int i=0;
   System.out.println(++i + " " + i++ + " " + i);
   }
}

produce la salida

1 1 2


Saludos.

1092
El enlace que has puesto parece que no funciona  ???

1093
Hola, mis recomendaciones serían:

Crea un archivo .java para cada clase, no declares muchas clases dentro de un mismo archivo java.

Mejora la forma de nombrar las clases, te copio desde otro hilo:

<< Te recomendaría que empieces a acostumbrarte a pensar en cómo nombrar adecuadamente a las clases. El nombre normalmente debe ser descriptivo, en singular, y reflejar lo que representa o hace la clase. En el caso de que la clase represente algo de la vida real será "Rueda" o "Vehiculo", etc. En el caso de que represente algo no real podrá ser "Pensamiento" o "Duda" o "Reunion". Cuando las clases están destinadas más que a representar a realizar procesos, como es este caso, los nombres suelen ser del tipo -or, por ejemplo CombinadorInicialesPalabras, Exponenciador, ConstructorDeMultillaves, ExtractorDeAtributos, ReductorDeFlujo, etc. >>

No tienes coherencia en los nombres de clases. La clase Productos_Frescos hereda de la clase Empresa_Alimentaria. Esto significaría que un Producto fresco es un tipo e empresa alimentaria, cosa que no tiene sentido.

En la superclase Empresa_Agroalimentaria tienes los atributos fechaCaducidad y numLote. Pero el enunciado aunque no lo dice directamente si lo vemos bien nos dice que hay otros atributos comunes que deberían estar en la superclase (por ejemplo la fecha de envasado).

Tampoco estás haciendo un buen uso de la reutilización de código y aprovechamiento de la herencia, por ejemplo el método despliega() de la clase Congelados_Aire se repite en gran medida en la clase Congelados_Agua y en la clase Congelados_Nitrogeno sin hacer las partes comunes en la clase Productos_Congelados.

Como referencia para consultar la solución a este ejercicio puedes mirar https://www.aprenderaprogramar.com/foros/index.php?topic=2342

Para aplicar bien los conceptos te recomiendo seguir el curso desde el principio (http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188)

Saludos

1094
De todo un poco... / Re:Problemas con securimage captcha php
« en: 19 de Abril 2015, 21:21 »
Sobre el problema que comentas, en el código tenemos llamadas a estos archivos:

require_once('Connections/conexion_usuarios.php'); que supongo es la conexión con la base de datos

Y por otro lado:

include_once 'http://localhost/sitio4/securimage/securimage.php';  que sí puede estar relacionado con el problema

¿Tienes el código de este archivo?

Saludos

1095
De todo un poco... / Re:Problemas con securimage captcha php
« en: 19 de Abril 2015, 21:18 »
Hola, adjunto el código que indicas pues es más cómodo revisarlo pudiendo acceder a él directamente:

Código: [Seleccionar]
<?php
session_start
(); ?>

<?php require_once('Connections/conexion_usuarios.php'); ?>

<?php
if (!function_exists("GetSQLValueString")) {
function 
GetSQLValueString($theValue$theType$theDefinedValue ""$theNotDefinedValue ""
{
  if (
PHP_VERSION 6) {
    
$theValue get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  
$theValue function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch (
$theType) {
    case 
"text":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;    
    case 
"long":
    case 
"int":
      
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case 
"double":
      
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case 
"date":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;
    case 
"defined":
      
$theValue = ($theValue != "") ? $theDefinedValue $theNotDefinedValue;
      break;
  }
  return 
$theValue;
}
}

// *** Redirect if username exists
$MM_flag="MM_insert";
if (isset(
$_POST[$MM_flag])) {
  
$MM_dupKeyRedirect="ya_existe_registro.php";
  
$loginUsername $_POST['email'];
  
$LoginRS__query sprintf("SELECT email FROM usuarios WHERE email=%s"GetSQLValueString($loginUsername"text"));
  
mysql_select_db($database_conexion_usuarios$conexion_usuarios);
  
$LoginRS=mysql_query($LoginRS__query$conexion_usuarios) or die(mysql_error());
  
$loginFoundUser mysql_num_rows($LoginRS);

  
//if there is a row in the database, the username was found - can not add the requested username
  
if($loginFoundUser){
    
$MM_qsChar "?";

//check captcha    
include_once 'http://localhost/sitio4/securimage/securimage.php'
$securimage = new Securimage();
// Verifify captcha
if ($secureimage->check($post['captcha_code']) == false){
    echo 
"The security code entered was incorrect.<br />";
echo "<a href='javascript:history.go(-1)'>Try again</a>.";
exit;            

    
//append the username to the redirect page
    
if (substr_count($MM_dupKeyRedirect,"?") >=1$MM_qsChar "&";
    
$MM_dupKeyRedirect $MM_dupKeyRedirect $MM_qsChar ."requsername=".$loginUsername;
    
header ("Location: $MM_dupKeyRedirect");
    exit;
  }
}
   

  

$editFormAction $_SERVER['PHP_SELF'];
  if (isset(
$_SERVER['QUERY_STRING'])) {
  
$editFormAction .= "?" htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset(
$_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  
$insertSQL sprintf("INSERT INTO usuarios (nombre, apellido, email, clave, pais, ciudad) VALUES (%s, %s, %s, %s, %s, %s)",
                       
GetSQLValueString($_POST['nombre'], "text"),
                       
GetSQLValueString($_POST['apellido'], "text"),
                       
GetSQLValueString($_POST['email'], "text"),
                       
GetSQLValueString($_POST['clave'], "text"),
                       
GetSQLValueString($_POST['pais'], "text"),
                       
GetSQLValueString($_POST['ciudad'], "text"));
   
mysql_select_db($database_conexion_usuarios$conexion_usuarios);
  
$Result1 mysql_query($insertSQL$conexion_usuarios) or die(mysql_error());

  
$insertGoTo "registro_ok.php";
  if (isset(
$_SERVER['QUERY_STRING'])) {
    
$insertGoTo .= (strpos($insertGoTo'?')) ? "&" "?";
    
$insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  
header(sprintf("Location: %s"$insertGoTo));
}

?>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type" />
<meta content="es-pe" http-equiv="Content-Language" />
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="estilos.css">
<style type="text/css">
#apDiv1 {
position: absolute;
width: 630px;
height: 90px;
z-index: 1;
left: 620px;
top: 95px;
background-color: #FAFAFA;
text-align: center;
font-size: 36px;
}
#apDiv2 {
position: absolute;
width: 630px;
height: 385px;
z-index: 2;
left: 620px;
top: 184px;
background-color: #FAFAFA;
text-align: center;
color: #D56939;
}
#apDiv1 p {
font-size: 36px;
}
#apDiv2 #form1 table tr td {
font-size: 24px;
}
#apDiv3 {
position: absolute;
width: 303px;
height: 243px;
z-index: 3;
left: 90px;
top: 272px;
text-align: center;
}
#apDiv4 {
position: absolute;
width: 254px;
height: 249px;
z-index: 3;
left: 124px;
top: 85px;
text-align: center;
}
#apDiv5 {
position: absolute;
width: 200px;
height: 115px;
z-index: 3;
left: 98px;
top: 255px;
}
#apDiv6 {
position: absolute;
width: 200px;
height: 115px;
z-index: 3;
}
#apDiv7 {
position: absolute;
width: 292px;
height: 248px;
z-index: 3;
left: 90px;
top: 218px;
text-align: center;
}
#apDiv2 p a {
color: #D56939;
}
</style>
<script type="text/javascript">
function MM_validateForm() { //v4.0
  if (document.getElementById){
    var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
    for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=document.getElementById(args[i]);
      if (val) { nm=val.name; if ((val=val.value)!="") {
        if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
          if (p<1 || p==(val.length-1)) errors+='- '+nm+' Debe ingresar una dirección de correo electrónico.\n';
        } else if (test!='R') { num = parseFloat(val);
          if (isNaN(val)) errors+='- '+nm+' es requerido.\n';
          if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
            min=test.substring(8,p); max=test.substring(p+1);
            if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
      } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' es requerido.\n'; }
    } if (errors) alert('DATOS OBLIGATORIOS PARA PODER REGISTRARSE:\n'+errors);
    document.MM_returnValue = (errors == '');
} }
</script>
</head>
<body background="images/fondoserv.jpg" onfocus="MM_validateForm('nombre','','R','apellido','','R','email','','RisEmail','clave','','R','pais','','R','ciudad','','R');return document.MM_returnValue">
     <header class="header2">
       <div class="wrapper">
       </div>
<nav>
<a href="index.html" class="auto-style2">INICIO</a>
<a href="#" class="auto-style2">INFO</a>
<a href="#" class="auto-style2">SERVICIOS</a>
<a href="#" class="auto-style2">BLOG</a>
<a href="#" class="auto-style2">CONTACTO</a>
</nav>
</div>
</header>


<!--- Empieza contenido del texto---><!-- TemplateBeginEditable name="doctitle" -->
<title>Registro de usuarios</title>
<!-- TemplateEndEditable -->
<style type="text/css">
 p.MsoNormal
{margin-top:0cm;
margin-right:0cm;
margin-bottom:8.0pt;
margin-left:0cm;
line-height:107%;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
}
.auto-style2 {
font-family: "Humanst521 BT";
}
p.Aurelio
{margin-bottom:.0001pt;
text-align:justify;
font-size:12.0pt;
font-family:"Times New Roman",serif;
margin-left: 0cm;
margin-right: 0cm;
margin-top: 0cm;
}
p.MsoListParagraph
{margin-top:0cm;
margin-right:0cm;
margin-bottom:8.0pt;
margin-left:36.0pt;
line-height:107%;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
}
</style>
<div id="apDiv7"><img src="images/rombo-id-web.png" width="405" height="320" /></div>
</head>

<body style="background-attachment: fixed; background-color: #FFFFFF; background-image: url('../Fotografías/Fondos%20Pantalla/fondo-tres.jpg'); background-repeat: no-repeat; background: url('images/fondoserv.jpg') no-repeat fixed center;">

<div id="apDiv1">
  <p>&nbsp;</p>
  <p>Registro de usuario</p>
</div>
<div id="apDiv2">
  <p>&nbsp;</p>
  <form action="<?php echo $editFormAction?>" method="post" name="form1" id="form1">
    <table align="center" class="wrapper">
      <tr valign="baseline">
        <td nowrap="nowrap" align="right">Nombre:</td>
        <td><input name="nombre" type="text" id="nombre" onfocus="MM_popupMsg('Debe ingresar la totalidad de los datos...')" value="" size="32" /></td>
      </tr>
      <tr valign="baseline">
        <td nowrap="nowrap" align="right">Apellido:</td>
        <td><input name="apellido" type="text" id="apellido" value="" size="32" /></td>
      </tr>
      <tr valign="baseline">
        <td nowrap="nowrap" align="right"> Correo electr&oacute;nico: </td>
        <td><input name="email" type="text" id="email" onblur="MM_validateForm('nombre','','R','apellido','','R','email','','RisEmail','clave','','R','pais','','R','ciudad','','R','codpost','','R');return document.MM_returnValue" value="" size="32" /></td>
      </tr>
      <tr valign="baseline">
        <td nowrap="nowrap" align="right">Contrase&ntilde;a:</td>
        <td><input name="clave" type="password" id="clave" onfocus="MM_validateForm('nombre','','R','apellido','','R','email','','RisEmail','clave','','R','pais','','R');return document.MM_returnValue" value="" size="32" /></td>
      </tr>
      <tr valign="baseline">
        <td nowrap="nowrap" align="right">Pa&iacute;s:</td>
        <td><input name="pais" type="text" id="pais" value="" size="32" /></td>
      </tr>
      <tr valign="baseline">
        <td nowrap="nowrap" align="right">Ciudad:</td>
        <td><input name="ciudad" type="text" id="ciudad" value="" size="32" /></td>
      </tr>
      <tr valign="baseline">
        <td nowrap="nowrap" align="right"><img id="captcha" src="http://localhost/sitio4/securimage/securimage_show.php" alt="CAPTCHA Image" /></td>
        <td><p>
          <input type="text" name="captcha_code" size="8" maxlength="6" />
        <a href="#" onclick="document.getElementById('captcha').src = 'http.//localhost/sitio4/securimage/securimage_show.php?' + Math.random(); return false"> &iexcl;Prueba con otra imagen</a><a href="#">!</a></p>
        <p>&nbsp;</p></td>
      </tr>
      <tr valign="baseline">
        <td nowrap="nowrap" align="right">&nbsp;</td>

        <td><input type="submit" class="wrapper" value="Guarda tus datos" /></td>
      </tr>
     
     
    </table>
    <input type="hidden" name="MM_insert" value="form1" />
  </form>
  <p>&nbsp;</p>
  <p>&nbsp;</p>
  <p>&nbsp;</p>
</div>
</body>

</html>

Saludos

1096
Hola Dan, lo que le faltaría a tu esquema es una clase ProductoCongelado, de donde hereden los distintos tipos de productos congelados. En la clase ProductoCongelado tendríamos todo lo común a los productos congelados. Si en el momento de crear el programa no tenemos nada común, quedará una clase vacía de contenido. Esto puede parecer poco recomendable (¿para qué tener una clase vacía?) pero es razonable en las siguientes situaciones:

- Es previsible que cuando el programa se desarrolle esa clase permita agrupar aspectos comunes de distintas subclases. Es decir, aunque ahora mismo no nos sea útil, prevemos que sea útil en un futuro próximo.

- Hace que el diseño refleje el mundo real. La falta de la clase dejaría "cojo" el diseño.

- Otras a considerar

Si en tu diseño incluyes la clase ProductoCongelado, ya tendrás el diseño preparado para cuando tengas que agrupar aspectos comunes de los productos congelados. Si no la incluyes, cuando en el futuro tuvieras que agrupar aspectos comunes de productos congelados tendrías que modificar el diseño, y una modificación de diseño es costosa porque puede tener más efectos colaterales.

Siempre habrá que hacer modificaciones de diseño, pero hay que crear diseños lo más consistentes posibles que eviten en la medida de lo posible modificaciones por situaciones que son más o menos previsibles.

Saludos.

1097
Adjunto un archivo con un artículo sobre diseño orientado a objetos que pienso puede ser de interés

Saludos

1098
Hola, mi recomendación: un esquema de herencia no debe contradecir el mundo real, a lo sumo, puede crear artefactos o clases intermedias que faciliten la labor del programador, pero sin ir en contra de los conceptos del mundo real. Lo que tratamos de hacer al crear un diseño de clases Java es en buena medida conceptualizar el mundo real.

Una cuestión que se debe tener presente al crear un programa es la posibilidad de ampliación. Como programadores, tenemos que intentar crear diseños consistentes, y la consistencia viene dada por varios factores. Uno de ellos es que el diseño prevea posibles ampliaciones del programa. Por ello lo lógico es tener una superclase Producto, de la que hereden los distintos tipos de productos. Hacer que ProductoCongelado herede de ProductoFresco no reflejaría el mundo real y generaría problemas cuando hubiera que ampliar el programa. Los programas rara vez son algo terminado, algo final, un programa a nivel profesional siempre requiere cambios y mantenimiento. Otro motivo para no contradecir el mundo real es pensar que cuando como programadores terminamos un programa, es posible que el mantenimiento de ese programa tenga que realizarlo otra persona. Si el diseño no es autoexplicativo, si hemos deformado la realidad, la persona que vaya a mantener ese programa tendrá problemas para entenderlo y esto generará sobrecostes en el mantenimiento del programa.

El diseño planteado en este hilo es el que me parece más correcto: www.aprenderaprogramar.com/foros/index.php?topic=2342

Saludos

1099
Hola jimmorrison, ¡todo correcto!  :D

1100
El código sería (dejando el css interno):

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>Portal web - aprenderaprogramar.com</title>
<meta name="description" content="Portal web aprenderaprogramar.com">
<meta name="keywords" content="aprender, programar, cursos, libros"><meta charset="utf-8">
<style type="text/css">
.principal{color: red; font-size: 150%;}
.secundario{color: green; font-size: 110%;}
.secundario p{background-color: yellow;}
</style>
</head>
<body>

<div class="principal">
<h1>Novedades</h1><p>Aquí presentamos las novedades delsitio.</p>
</div>

<div class="secundario">
<h3>Lanzamos el producto X-FASHION</h3>
<p>Este producto permite estirar la piel hasta dejarla como la de un bebé.</p>
<p><img src="http://i.imgur.com/tq5Bs.png" title="Imagen del producto"

alt="imagen producto x-fashion" /></p>
</div>

<div class="secundario">
<h3>Mejoramos el producto T-MOTION</h3>
<p>Hemos lanzado una nueva versión del producto T-MOTION</p>
<p><img src="http://i.imgur.com/SpZyc.png" title="Imagen del proudcto
tmotion" alt="imagen producto tmotion" /></p>
</div>

</body>
</html>

Páginas: 1 ... 50 51 52 53 54 [55] 56 57 58 59 60 ... 93

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".