Patrones de Programacion
## Objetivos de Aprendizaje
- Aplicar patrones de programacion en MATLAB
- Depurar codigo efectivamente
- Manejar errores apropiadamente
- Escribir codigo mantenible
## Organizacion del Codigo
### Scripts vs Funciones
```matlab
% Script: comandos en secuencia
% Usar para: procesamiento de datos, analisis rapido
% Las variables persisten en el espacio de trabajo
a = 10;
b = 20;
c = a + b;
disp(c);
% Funcion: reutilizable, alcance aislado
% Usar para: codigo reutilizable, algoritmos
function result = add(a, b)
result = a + b;
end
```
### Organizacion de Proyectos
```text
myproject/
main.m % Punto de entrada
functions/
processData.m % Procesamiento de datos
visualize.m % Funciones de graficacion
utils/
helper.m % Funciones utilitarias
config/
settings.m % Configuracion
```
## Depuracion
### Modo de Depuracion
```matlab
% Establecer puntos de interrupcion
% Hacer clic en el numero de linea o usar:
dbstop in functionName at lineNumber
% Ejecutar en modo de depuracion
myFunction(input)
% Recorrer
dbstep % Ejecutar siguiente linea
dbstep in % Entrar en funcion
dbstep out % Salir de funcion
% Inspeccionar variables
whos % Listar variables del espacio de trabajo
disp(variable) % Mostrar valor
% Reanudar y salir
dbcont % Continuar ejecucion
dbquit % Salir del modo de depuracion
```
### Opciones de dbstop
```matlab
dbstop in functionName % Detener en entrada de funcion
dbstop in functionName at line % Detener en linea especifica
dbstop if error % Detener en error
dbstop if warning % Detener en advertencia
dbstop if naninf % Detener en NaN o Inf
```
### Depuracion con Print
```matlab
% Mostrar valores de variables
x = 10;
fprintf('x = %d\n', x);
% Salida de depuracion condicional
DEBUG = true;
if DEBUG
disp('Debug: entrando al bucle');
end
% Usando keyboard
function process()
% ...
keyboard; % Pausa ejecucion, vuelve al prompt
% Escribir 'return' para continuar
% Escribir 'dbquit' para salir
end
```
## Manejo de Errores
### try-catch
```matlab
try
result = riskyOperation();
catch ME
disp('Ocurrio un error:');
disp(ME.message);
end
```
### Informacion Detallada de Error
```matlab
try
x = 10 / 0;
catch ME
disp(['Identificador: ', ME.identifier]);
disp(['Mensaje: ', ME.message]);
disp(['Linea: ', num2str(ME.stack(1).line)]);
disp(['Funcion: ', ME.stack(1).name]);
end
```
### Rethrow
```matlab
try
x = notAFunction();
catch ME
disp('Manejo de error personalizado');
rethrow(ME); % Volver a lanzar con informacion original
end
```
### lastwarn y lasterr
```matlab
% Capturar advertencias
lastwarn(''); % Limpiar
x = sqrt(-1);
[msg, id] = lastwarn;
% Capturar errores
lasterr % Ultimo mensaje de error
```
## Ejecucion Condicional
### Verificando Entradas
```matlab
function result = processData(data, varargin)
% Validar entrada requerida
if ~isnumeric(data)
error('Los datos deben ser numericos');
end
% Parsear parametros opcionales
p = inputParser;
p.addOptional('verbose', false, @islogical);
p.addOptional('maxIter', 100, @isnumeric);
p.parse(varargin{:});
opts = p.Results;
end
```
### Validacion de Entrada
```matlab
function y = compute(x)
% Validar tipo
validateattributes(x, {'numeric'}, {'finite'});
% Multiples condiciones
validateattributes(x, {'numeric'}, {'positive', 'finite', 'nonnan'});
% Validacion personalizada
if x < 0
error('x debe ser no negativo');
end
end
```
## Calidad del Codigo
### Convenciones de Nombres
```matlab
% Variables: minusculas con guiones bajos (opcional)
iteration_count = 0;
totalSum = 0;
% Constantes: MAYUSCULAS
MAX_ITERATIONS = 100;
PI = 3.14159;
% Funciones: camelCase o snake_case
function output = calculateArea(radius)
output = pi * radius^2;
end
% Clases: PascalCase (si se usa POO)
classdef MyClass
properties
Data
end
end
```
### Comentarios
```matlab
%{
Bloque de comentario de multiples lineas
para explicaciones mas largas
%}
% Comentarios de una linea para:
% - Encabezados de funciones
% - Calculos complejos
% - Elementos TODO
% TODO: Agregar manejo de errores
% FIXME: Manejar valores negativos
% NOTE: Este algoritmo es O(n^2)
```
## Patrones de Vectorizacion
### Reemplazar Bucles con Operaciones Vectoriales
```matlab
% Lento: Bucle
result = zeros(1, 1000);
for i = 1:1000
result(i) = sin(i) * cos(i);
end
% Rapido: Vectorizado
x = 1:1000;
result = sin(x) .* cos(x);
```
### Indexacion Logica
```matlab
% Encontrar y reemplazar
A = [1, 2, 3, 4, 5];
A(A > 3) = 10; % A = [1, 2, 3, 10, 10]
% Asignacion condicional
B = zeros(size(A));
B(A > 2 & A < 5) = A(A > 2 & A < 5);
```
### Accumarray
```matlab
% Agrupar y agregar
id = [1, 1, 2, 2, 2, 3];
val = [10, 20, 30, 40, 50, 60];
result = accumarray(id(:), val(:), [], @sum);
% result = [30; 120; 60]
```
## Consejos de Rendimiento
### Preasignacion
```matlab
% Mal: Arreglo que crece
result = [];
for i = 1:1000
result = [result, i^2]; % Lento!
end
% Bien: Preasignar
result = zeros(1, 1000);
for i = 1:1000
result(i) = i^2;
end
% Mejor: Vectorizado
result = (1:1000).^2;
```
### Eficiencia de Memoria
```matlab
% Usar tipos apropiados
a = int8(10); % 1 byte vs 8 bytes para double
% Limpiar variables grandes cuando se terminen
largeArray = rand(10000);
clear largeArray;
% Reutilizar memoria
x = zeros(1000); % Preasignar
x(:) = newData; % Llenar sin nueva asignacion
```
### Perfilado
```matlab
% Perfilado de ejecucion de codigo
profile on
% ... tu codigo ...
profile viewer
% Verificar tiempo
tic
% ... codigo ...
elapsed = toc;
% Usar timeit para medicion de funciones
f = @() myFunction(data);
t = timeit(f);
```
## Pruebas Unitarias
### Framework de Pruebas Simple
```matlab
function testResults = runTests()
tests = {
@testAdd,
@testMultiply,
@testDivide
};
passed = 0;
failed = 0;
for i = 1:numel(tests)
try
tests{i}();
passed = passed + 1;
fprintf('PASS: %s\n', func2str(tests{i}));
catch ME
failed = failed + 1;
fprintf('FAIL: %s - %s\n', func2str(tests{i}), ME.message);
end
end
fprintf('\nResultados: %d pasados, %d fallidos\n', passed, failed);
end
```
### Aserciones de Prueba
```matlab
function testAdd()
result = add(2, 3);
assert(result == 5, 'Se esperaba 2+3=5');
end
function assert(condition, msg)
if ~condition
error(msg);
end
end
```
## Registro
### Registro Simple
```matlab
function logMessage(level, msg)
fprintf('[%s] %s: %s\n', datestr(now), level, msg);
end
logMessage('INFO', 'Procesamiento iniciado');
logMessage('WARN', 'Memoria baja');
logMessage('ERROR', 'Archivo no encontrado');
```
### Bandera de Depuracion
```matlab
function myFunction(data, debug)
if nargin < 2
debug = false;
end
if debug
fprintf('Tamano de entrada: %d x %d\n', size(data));
end
% Logica principal...
if debug
fprintf('Tamano de salida: %d x %d\n', size(result));
end
end
```
## Resumen
- Usar scripts para secuencias, funciones para codigo reutilizable
- Establecer puntos de interrupcion con `dbstop`, usar `dbstep` para navegar
- Envolver codigo riesgoso en bloques `try-catch`
- Validar entradas con `validateattributes`
- Vectorizar bucles para mejor rendimiento
- Preasignar arreglos antes de llenarlos
- Usar `profile` y `tic/toc` para optimizacion
- Escribir pruebas para verificar correctitud
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →