2012-01-10 16 views
10

Estoy escribiendo una aplicación MATLAB que tiene muchas funciones repartidas en diferentes archivos. Tengo un registrador, que es una estructura con un puntero de función, y lo uso para registrar información para que el usuario vea (es decir, qué función se está ejecutando actualmente, resultados de cálculo, etc.). La razón por la que uso una estructura para mi registrador y no simplemente fprintf() es que podría reemplazarla fácilmente con un registrador XML, registrador HTML, etc. en el futuro.La mejor alternativa a las variables globales de MATLAB

Como mi código se compone de muchas funciones que se llaman entre sí, declaro que mi estructura de registrador es global, por lo que no tengo que pasarla a todas mis funciones. Sin embargo, donde sea que mire, veo que las variables globales son el mal encarnado en MATLAB y ralentizarán considerablemente mi programa.

¿Hay alguna manera de tener variables disponibles en todos los archivos sin pasarlos necesariamente como parámetros de entrada, y sin sufrir una grave penalización de rendimiento?

+0

Los vars globales no son "malvados". Simplemente pueden crear muchos errores si no eres un programador experimentado, como sobrecargar a otros vars, etc. Además, no creo que haya un impacto en el rendimiento para los globales en Matlab. Si usar Globals hace que su vida sea "extremadamente" más fácil, entonces úselos. Solo trata de no convertirlo en un hábito. – Jorge

+1

@Jorge cualquier programador, no solo los inexpertos. Pero de lo contrario, sí. –

+0

@Jorge: ¿cuál es su criterio para usar variables globales vs. pasar variables a los métodos? – dzisner

Respuesta

9

También puede usar palabra clave persistente dentro de un archivo y asignar allí el registrador.
Es similar en algunos aspectos a la palabra clave estática en C++. También es una implementación del patrón Singleton.

function CallLogger(st) 
    persistent logger; 
    if isempty(logger) 
     %Allocate new logger 
    end 
    logger.disp(st); 
end 

Es mejor que global porque
1. Nadie puede destruir su registrador sin su conocimiento.
2. Nadie conoce este objeto, porque está limitado al ámbito de la función

Por cierto, no estoy de acuerdo en que el mundo tenga un problema de rendimiento. Simplemente no es una buena práctica, en términos de Ingeniería de Software.

+0

Hola @ Andrey, la forma en que lo veo, las variables persistentes son el equivalente de las variables "estáticas" en C/C++, por lo que solo existen dentro del alcance de la función y no a través de las funciones, ¿verdad? – dzisner

+0

Gracias Andrey, tu respuesta es genial. Decidí alejarme de los globales tanto como puedo, tanto por la buena práctica como por el rendimiento. ¡¡Gracias!! – dzisner

2

Mejor que invocar variables persistentes en una función (que, por ejemplo, no se guardará si guardas y vuelves a cargar tu espacio de trabajo) sería pasar de la función + struct al objeto: es decir, debes mirar Programación orientada a objetos de MATLAB.

+0

¿Te refieres a crear una nueva clase que hereda la clase de manejo de MATLAB? – wherestheforce

+0

Sí: exactamente esto. – lsfinn