2010-03-26 13 views
17

MATLAB tiene dos formas de organización de las clases:¿La mejor manera de organizar clases de MATLAB?

@ -directories:

 
@ClassName\ 
    ClassName.m 
    Method1.m 
    Method2.m 

archivos individuales:

 
ClassName.m: 
classdef ClassName 
    methods 
     % all methods included here 
    end 
end 

El primer estilo existía antes de la nueva sintaxis classdef, pero parece ser una forma más estructurada de hacer las cosas. El segundo estilo (todo en un solo archivo) es nuevo.

¿Qué método usas y por qué?

Respuesta

5

Utilizo el método de archivo único. Me resulta algo más fácil organizar el código cuando se compone de un solo archivo, y los títulos de las células hacen que sea muy fácil saltar entre los métodos. Además, si creo una nueva [email protected], podría necesitar recrear la ruta antes de poder usarla, y no tengo la paciencia para eso.

Habiendo dicho todo eso, no creo que el estilo de un solo archivo sea mucho mejor que el estilo de varios archivos; tener muchos archivos pequeños y fáciles de ver también podría ser muy útil.

6

He encontrado que @-directories es un kludge (por ejemplo, público/privado, ¿qué es eso?) Que mejor se olvida. En las versiones más recient (desde 2007b, creo), the best way to organize your classes is with packages. Esto da un espacio de nombres mucho más limpio. Creo que trabajar con toda la clase en un archivo hace que sea mucho más fácil tener una idea de lo que está haciendo la clase, y un 1000% menos molesto cuando se trata de refactorizar (imagina cambiar 8 archivos después de cambiar un nombre de variable).

+0

Con suerte para la refactorización, puede usar 'sed' o' perl -pi -e' y si está en Git renombrar foo con barra en miles de archivos es tan fácil como esto: 'git ls-files | xargs perl -pi -e s/foo/bar/g'. Estás en Windows? No hay problema, solo instale Cygwin o MinGW. Supongo que tu último argumento no es válido. – nowox

18

El nuevo estilo de un solo archivo tiene algunas ventajas. Te permite y te anima a escribir muchos métodos pequeños, que creo que conducen a un código mejorado. La molestia de crear un nuevo archivo, guardarlo y agregarlo al control de código fuente (nosotros son usando control de fuente, ¿no?) Es menor, pero sumado más de un par de docenas de pequeños métodos es suficiente para desanimarme. factorizando una clase en bits de funcionalidad más fina. Y editar toda la clase es conveniente para navegar, buscar y reemplazar, y no tener que abrir una docena de pestañas de editor por separado, que luego se pueden utilizar para organizar el código fuente de diferentes clases.

Para bases de código más grandes, puede haber ventajas de rendimiento para el estilo de archivo único. Los sistemas de control e implementación de origen que iteran sobre el árbol fuente tienen un costo por archivo para cosas como estadísticas y operaciones de diferencias. Para una base de código más grande, por ejemplo, miles de métodos, eso puede ser significativo, especialmente en una unidad de red. Sospecho que también hay un efecto de rendimiento para las aplicaciones implementadas con el compilador de Matlab. El tiempo de inicio aumenta con el tamaño de la base de código implementada. Hay una parte por archivo de este costo, desde las operaciones de archivos, y porque los archivos (creo) están encriptados individualmente. Sospecho, pero no he probado experimentalmente, que el uso de definiciones de clase de archivo único reducirá el costo de inicio de las aplicaciones compiladas de Matlab.

Sin embargo, uso la antigua organización de varios archivos para la mayor parte de mi código. En parte porque nuestra base de código se inició hace unos años antes de que el nuevo estilo estuviera disponible comúnmente. Pero en parte por el rendimiento. La nueva organización de un solo archivo solo funciona con las nuevas clases MCOS Matlab de estilo, y son más lentas que las clases antiguas de Matlab debido a una mayor sobrecarga de despacho de métodos. P.ej. Aquí hay un fragmento de referencia que muestra el tiempo de ejecución de los métodos do-nothing nop().

 
Calling each function/method 100000 times 
nop() function:     0.02715 sec 0.27 usec per call 
nop(obj) method:    0.24629 sec 2.46 usec per call 
classdef nop(obj):    0.98572 sec 9.86 usec per call 
classdef obj.nop():    1.81307 sec 18.13 usec per call 

En una base de código que realiza muchas llamadas a métodos, esto puede tener un impacto significativo en el rendimiento. (Ver también Is MATLAB OOP slow or am I doing something wrong?)

Otra nit es que la auto-penetrador de MATLAB sangría en cada sección y cada método en una definición de clase, por lo que la línea de base de todo el código ejecutable es de dos tabulaciones en, perdiendo 8 columnas de la pantalla bienes raíces.

En resumen, si no fuera por las consideraciones de rendimiento OO, probablemente iría con un solo archivo, y estoy escribiendo nuevas clases críticas no rendimiento de esa manera.

ACTUALIZACIÓN: También parece que contentsrpt(), un generador de documentación útil, no funciona con funciones definidas dentro del archivo classdef; solo aquellos en archivos de funciones separados.

1

La ventaja de usar el directorio @ClassName es que matlab te obliga a borrar y volver a cargar una clase si realizas algún cambio en el archivo classdef. Si coloca la implementación de funciones en archivos m separados y simplemente coloca las firmas de método en el archivo classdef, puede rebuscar con la implementación sin tener que borrar la clase.

+1

Solo está obligado a volver a cargar el archivo de clase si agrega o elimina propiedades o métodos, o si cambia las firmas de método. Si cambia algo dentro de un método, Matlab lanza una advertencia, pero aún utiliza la versión actualizada del archivo. Por lo tanto, aparte de la advertencia, no hay diferencia cuando se trata de tener que borrar las clases. – Jonas

Cuestiones relacionadas