ylabel xlabel suptitle comando matlab oop organization code-organization matlab-class

xlabel - ¿La mejor manera de organizar las clases de MATLAB?



title subplot matlab (4)

El nuevo estilo de archivo único tiene algunas ventajas. Le permite y lo alienta a escribir muchos métodos pequeños, lo que creo que conduce a un código mejor factorizado. La molestia de crear un nuevo archivo, guardarlo y agregarlo al control de código fuente (todos estamos usando el control de código fuente, ¿no?) Es menor, pero sumar más de un par de docenas de métodos pequeños es suficiente para que por lo general no sea conveniente clase en bits más finos de funcionalidad. Y editar la totalidad de su clase es conveniente para navegar, buscar y reemplazar, y no tener que abrir una docena de pestañas de editor independientes, que luego se pueden usar para organizar el código fuente para 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 de origen e implementación que se repiten en el árbol de origen tienen un costo por archivo para cosas como las operaciones stat y diff. 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 Matlab. El tiempo de inicio aumenta con el tamaño del código base implementado. Hay una parte por archivo de este costo, de las operaciones de archivo, y porque los archivos (creo) se cifran individualmente. Sospecho, pero no lo 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 archivos múltiples para la mayoría 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 comúnmente disponible. Pero en parte por el rendimiento. La nueva organización de un solo archivo solo funciona con las nuevas clases de Matlab de MCOS de estilo, y son más lentas que las clases de Matlab de estilo antiguo debido a una mayor sobrecarga de envío de métodos. Por ejemplo, aquí hay un fragmento de referencia que muestra el tiempo de ejecución de los métodos nop () de no hacer nada.

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 hace muchas llamadas a métodos, esto puede tener un impacto significativo en el rendimiento. (Ver también ¿Es lento el OPA de MATLAB o estoy haciendo algo mal? )

Otro factor importante es que el auto-indentador de Matlab sangrará cada sección y cada método en una definición de clase, por lo que la línea de base de todo su código ejecutable es dos tabulaciones, desperdiciando 8 columnas de bienes raíces de pantalla.

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

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

MATLAB tiene dos formas de organizar las clases:

@ -directorios:

@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 de 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 utilizas y por qué?


He encontrado que los @-directories son un kludge (por ejemplo, público / privado, ¿qué es eso?) Que es mejor olvidar. En las versiones más recientes (desde 2007b, creo), la mejor manera de organizar sus clases es con paquetes . 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 (imagínese cambiar 8 archivos después de cambiar un nombre de variable).


La ventaja de usar el directorio @ClassName es que matlab lo obliga a borrar y recargar una clase si realiza cambios en el archivo classdef. Si coloca la implementación de funciones en archivos m separados y simplemente coloca las firmas del método en el archivo classdef, puede deshacer el proceso con la implementación sin tener que borrar la clase.


Yo uso el método de archivo único. Me resulta un poco más fácil organizar el código cuando consta de un solo archivo, y los títulos de las celdas hacen que sea muy fácil saltar entre los métodos. Además, si creo una nueva clase @, es posible que deba volver a crear la ruta antes de poder usarla, y no tengo paciencia para eso.

Dicho todo esto, no creo que el estilo de archivo único sea mucho mejor que el estilo de archivos múltiples; Tener muchos archivos pequeños y fáciles de mirar también puede ser muy útil.