PHP Salvaje

En la oficina nos hemos inventado el termino “PHP Salvaje”. Yo me he permitido hacer una pequeña definición.

Php Salvaje

PHP Salvaje.

Nos referimos a PHP Salvaje a todo el conjunto de malas practicas llevadas acabo en un desarrollo. Esto quiere decir en un solo archivo mezclar:

  • Consultas SQL.
  • Lógica PHP mezclada con HTML.
  • Mucho código comentado que no se usa.
  • Código que no se usa.
  • Estilos (CSS).
  • Javascript.
  • Código no identado o identado de mas o de menos.
  • Las funciones hacen mas de una cosa: devolver por ejemplo HTML y regresar un valor.
  • Variables mal nombradas.

Además esto trae como consecuencia que el código resulte difícil de leer, difícil de mantener. Y para el programador un desgaste mental.

Añadiremos también el no seguir alguna metodología de diseño de software como MVC. Y aquí también se aplicaría PHP Salvaje al mezclar en los modelos, controladores HTML, javascript, estilos y las vistas hagan mucho mas que solo renderizar HML

Un ejemplo de PHP Salvaje lo podemos ver a continuación.

<?php
session_start(); //INICIA LA SESION DEL USUARIO
require_once("escolar_fns.php");
if (isset ( $_SESSION['valid_user'] ) )
{
	$usuario = $_SESSION['valid_user'];
	$sql = "select usr_nickname from
  			usuarios WHERE usr_nickname='$usuario'";
	$result = $conex->listaObjetos($sql);
	if ( !$result )
	{
		echo "No Has ingresado correctamente.<br /><a href='logout.php'>salir</a>";
	}
	else 
	{
		foreach ( $result as $r)
		{
		  $nombre = $r->usr_nickname;
		  //$tipo = $r->usr_tipo;	  
		}
		$sql = "select alum_id as id, CONCAT(alum_appaterno,' ',alum_apmaterno,' ',alum_nombre) as 'Nombre', alum_curp as 'CURP', 
						c_nombre as 'Carrera', ce_desc as 'CEscolar', sem_Id as 'Semestre', gpo_nombre as 'Grupo', 
						 est_nombre as 'Estatus', h_fmov as 'Fecha'
						from alumno
						inner join historial on alum_id=his_idalumno
						inner join carreras on c_id = h_carrera
						inner join cicloescolar on ce_id = his_cicloesc
						inner join semestre on sem_id = his_semestre
						inner join grupos on gpo_id = his_grupo						
						inner join estatus on est_id = h_estatus
					";
			$result = $conex->listaObjetos($sql);
		//	print_r($result);
			if ($result)
			{
			HeadHtmlJquery("Lista de alumnos Inscritos");
			?>	
			<link rel="stylesheet" href="jquery/css/style.css" type="text/css">
			<script src="jquery/js/jquery.tablesorter.min.js" type="text/javascript"></script>
			<script src="jquery/js/picnet.table.filter.min.js" type="text/javascript"></script>
				</head>
				<style type="text/css">
				#form1 { width: 400px; }
				#form1 label { width: 150px; }
				#form1 label.error, #form1 input.submit { margin-left: 300px; }
				</style>
 
			<script type="text/javascript" id="js">
			$(document).ready(function() {
			// call the tablesorter plugin, the magic happens in the markup
			$("#listainscritas").tablesorter();
			}); 
			</script>
			<script type="text/javascript">
				$(document).ready(function() {
					// Initialise Plugin
					var options = {
						additionalFilterTriggers: [$('#quickfind')]
 
					};
					$('#listainscritas').tableFilter(options);
				});
			</script>
 
				<body>
				<?
				HeaderHtml ("Sistema de Control Escolar");
 
				echo '<div id="menuh">'.ListaMenuAdmin($nombre).'</div>';	
				HeaderCierre();
				?>
				  <div id="centered"><H1>Lista de alumnos Inscritos</h1>
			Busqueda rapida: <input type="text" id="quickfind"/>
 
					<table id="listainscritas" name="listainscritas" class="tablesorter"> 
					<thead>
					<tr>
						<th>Documentos</th>
						<th>Nombre</th>
						<th>CURP</th>
						<th>Carrera</th>
						<th>Ciclo Escolar</th>
						<th>Sem</th>
						<th>Gpo</th>
						<th>Estatus</th>
						<th>Fecha</th>
					</tr>
					</thead>
					<tbody>
				<?
				$imgInsc= "<img src=\"Imagenes/Misc/dashcode.png\" alt=\"Solicitud de inscripcion\" height=\"20\" width=\"20\" />";
				$imgDatos= "<img src=\"Imagenes/Misc/Doc.png\" alt=\"Datos de los padres y tutor\" height=\"20\" width=\"20\" />";
				$imgAntecedentes= "<img src=\"Imagenes/Misc/Chm.png\" alt=\"Antecedentes\" height=\"20\" width=\"20\" />";
				$imgSep= "<img src=\"Imagenes/Misc/NamecardFolder.png\" alt=\"Solicitud Sep\" height=\"20\" width=\"20\" />";
				$imgDoctos= "<img src=\"Imagenes/Misc/Todo.png\" alt=\"Documentos Entregados\" height=\"20\" width=\"20\" />";
				foreach ($result as $r)
					{
						echo "<tr>\n";
						echo "<td><a href=\"solicitudinscripcion1.php?id=$r->id&sem=$r->Semestre\">$imgInsc</a><a href=\"datos_alumna.php?ida=$r->id\">$imgDatos</a>
							<a href=\"estudios_alumna.php?id=$r->id\">$imgAntecedentes</a><a href=\"solicitud-sep.php?id=$r->id\">$imgSep</a>
							<a href=\"tipotramite.php?ida=$r->id\">$imgDoctos</a></td>\n";
						echo "<td>". $r->Nombre."</td>\n";
						echo "<td>$r->CURP</td>\n";
						echo "<td>". $r->Carrera."</td>\n";
						echo "<td>$r->CEscolar</td>\n";
						echo "<td>$r->Semestre</td>\n";
						echo "<td>$r->Grupo</td>\n";
					//	echo "<td>". $r->Asesor."</td>\n";
						echo "<td>". $r->Estatus."</td>\n";
						echo "<td>$r->Fecha</td>\n";
						echo "</tr>";
					}
				?>
					</tbody>
					</table>
 
				</div>
			  <? 
				FooterHtml();
			 }
			 else MensajeDeError(9, "Acci&oacute;n invalida", 'No hay alumnos inscritos: <a href="form_alumno.php">Dar de alta ahora</a>' );
	}
} else MensajeDeError(8,'Error', 'No has iniciado sesion');
?>

Cabe aclarar que aquí no pongo en duda que una aplicación con PHP Salvaje funcione dado que es muy probable que ande de maravilla, cumpla con los objetivos del negocio y los usuarios no tengan queja.
 

Comentarios

El problema con el 'php-salvage' o espagueti es que funciona. Yo he visto montones de aplicaciones pequeñas echas a la medida que van a vivir por la eternidad así como funcionan hoy. Y hasta el día de hoy la mayor cantidad de lineas escritas en php en el mundo (mundial) llevan este estilo.

El problema existe en el cambio. Agregar una nueva funcionalidad o modficar una existente se convierte en un dolor indescriptible y una perdida de tiempo. 

Imagen de peter

Exactamente como mencionas el mantener y agregar funcionalidades se conviente en un trauma y desgaste mental.

Gracias por comentar. Saludos.

Añadir nuevo comentario