Debo usar clases anidadas en este caso?


Estoy trabajando en una colección de clases utilizadas para la reproducción y grabación de video. Tengo una clase principal que actúa como la interfaz pública, con métodos como play(), stop(), pause(), record() etc... Luego tengo clases de caballo de batalla que hacen la decodificación de video y la codificación de video.

Acabo de enterarme de la existencia de clases anidadas en C++, y tengo curiosidad por saber qué piensan los programadores sobre su uso. Soy un poco cauteloso y no estoy muy seguro de cuáles son los beneficios/inconvenientes, pero parecen (según el libro que estoy leyendo) ser utilizados en casos como el mío.

El libro sugiere que en un escenario como el mío, una buena solución sería anidar las clases workhorse dentro de la clase interface, por lo que no hay archivos separados para las clases que el cliente no está destinado a usar, y para evitar cualquier posible conflicto de nombres? No estoy seguro de estas justificaciones. Las clases anidadas son un nuevo concepto para mí. Solo quiero ver qué piensan los programadores sobre el tema.

Author: Bruce, 2008-08-02

10 answers

Sería un poco reacio a usar clases anidadas aquí. ¿Qué pasa si ha creado una clase base abstracta para un "controlador multimedia" para manejar las cosas de back-end (caballo de batalla), y una clase separada para el trabajo de front-end? La clase front-end podría tomar un puntero / referencia a una clase de controlador implementada (para el tipo de medio apropiado y la situación) y realizar las operaciones abstractas en la estructura workhorse.

Mi filosofía sería seguir adelante y hacer que ambas estructuras sean accesibles a el cliente de una manera pulida, justo bajo el supuesto de que se utilizarían en tándem.

Me referiría a algo como un QTextDocument en Qt. Proporciona una interfaz directa para el manejo de datos de metal desnudo, pero pasa la autoridad a un objeto como un QTextEdit para hacer la manipulación.

 26
Author: saint_groceon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-17 00:10:18

Usaría una clase anidada para crear una clase auxiliar (pequeña) que se requiere para implementar la clase principal. O por ejemplo, para definir una interfaz (una clase con métodos abstractos).

En este caso, la principal desventaja de las clases anidadas es que esto hace que sea más difícil reutilizarlas. Quizás te gustaría usar tu clase VideoDecoder en otro proyecto. Si lo convierte en una clase anidada de VideoPlayer, no puede hacer esto de una manera elegante.

En su lugar, ponga las otras clases en separado .h.archivos cpp, que luego puede usar en su clase VideoPlayer. El cliente de VideoPlayer ahora solo necesita incluir el archivo que declara VideoPlayer, y todavía no necesita saber cómo lo implementó.

 9
Author: Frederik Slijkerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 11:50:28

Una forma de decidir si usar o no clases anidadas es pensar si esta clase juega o no un papel secundario o es su propia parte.

Si existe únicamente con el propósito de ayudar a otra clase, generalmente la hago una clase anidada. Hay un montón de advertencias a eso, algunas de las cuales parecen contradictorias, pero todo se reduce a la experiencia y el sentimiento visceral.

 5
Author: graham.reeds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-05 08:29:13

Suena como un caso en el que podrías usar el patrón de estrategia

 4
Author: DShook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-05 08:37:19

A veces es apropiado ocultar las clases de implementación del usuario -- en estos casos es mejor ponerlas en un foo_internal.h que dentro de la definición de clase pública. Así, lectores de tu foo.h no verá con lo que preferiría que no se preocuparan, pero aún puede escribir pruebas contra cada una de las implementaciones concretas de su interfaz.

 4
Author: 0124816,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-16 09:31:01

Encontramos un problema con un compilador Sun C++ semi-antiguo y la visibilidad de las clases anidadas cuyo comportamiento cambió en el estándar. Esta no es una razón para no hacer su clase anidada, por supuesto, solo algo que debe tener en cuenta si planea compilar su software en muchas plataformas, incluidos los compiladores antiguos.

 4
Author: Allan Wind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 19:11:57

Bien, si usa punteros a sus clases workhorse en su clase de Interfaz y no los expone como parámetros o tipos de retorno en sus métodos de interfaz, no necesitará incluir las definiciones para esos caballos de trabajo en su archivo de encabezado de interfaz (simplemente los declara en su lugar). De esa manera, los usuarios de su interfaz no necesitarán saber acerca de las clases en segundo plano.

Definitivamente no necesitas anidar clases para esto. De hecho, los archivos de clase separados en realidad, haga que su código sea mucho más legible y más fácil de administrar a medida que su proyecto crece. también le ayudará más adelante si necesita subclase (por ejemplo, para diferentes tipos de contenido/códec).

Aquí hay más información sobre el patrón de PIMPL (sección 3.1.1).

 4
Author: Carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-27 20:24:09

Debe usar una clase interna solo cuando no pueda implementarla como una clase separada usando la interfaz pública de la clase externa. Las clases internas aumentan el tamaño, la complejidad y la responsabilidad de una clase, por lo que deben usarse con moderación.

Su clase de codificador/decodificador suena como que se ajusta mejor al Patrón de estrategia

 2
Author: luke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 15:19:37

Una razón para evitar las clases anidadas es si alguna vez tiene la intención de envolver el código con swig (http://www.swig.org ) para su uso con otros idiomas. Swig actualmente tiene problemas con las clases anidadas, por lo que interactuar con bibliotecas que exponen cualquier clase anidada se convierte en un verdadero problema.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-20 07:37:30

Otra cosa a tener en cuenta es si alguna vez visualiza diferentes implementaciones de sus funciones de trabajo (como decodificación y codificación). En ese caso, definitivamente querrá una clase base abstracta con diferentes clases concretas que implementen las funciones. No sería realmente apropiado anidar una subclase separada para cada tipo de implementación.

 1
Author: Michael Mathews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-23 19:07:55