¿Cuáles son los problemas con la programación orientada a objetos?
1. Sobreencapsulación
Al usar programación orientada a objetos, algunos problemas complejos se dividirán y abstraerán en objetos independientes más simples, y las soluciones se implementarán mediante llamadas mutuas entre objetos. Sin embargo, dado que los objetos contienen sus propios datos encapsulados, el conjunto de datos de un problema se encuentra disperso en diferentes áreas de la memoria. Es probable que se produzcan errores de caché de datos al llamarse entre sí.
2. Polimorfismo
En la implementación polimórfica general de C, se utilizan tablas de funciones virtuales. La tabla de funciones virtuales implementa el despacho dinámico agregando una capa de indirección. Sin embargo, es necesario leer la tabla de funciones virtuales al realizar la llamada, lo que aumenta la posibilidad de que se pierda la memoria caché. Básicamente, se debe admitir el envío dinámico. Este problema ocurrirá independientemente de si se utilizan tablas de funciones virtuales o punteros de función. Sin embargo, si el número de clases es extremadamente grande, la combinación de punteros de función y datos a veces puede ralentizar el problema.
3. Diseño de datos
Aunque la programación orientada a objetos en sí no limita el diseño de los datos, básicamente la mayoría de los lenguajes de programación orientada a objetos envuelven variables miembro continuamente en una sección de memoria. Incluso cuando se programa en C, la programación orientada a objetos o el pensamiento basado en objetos se suele utilizar para colocar algunos datos relevantes en una estructura: struct?Particle?{
Vector3?position;Vector4?velocity; ;
Vector4?color;
flotación?edad;
//?...
};
Incluso si no usamos polimorfismo, usaremos este diseño de datos casi sin pensar. Normalmente pensamos que este diseño de datos suele ser compatible con el caché porque las variables miembro están colocadas juntas de forma compacta. Sin embargo, en realidad, debemos considerar el patrón de acceso a los datos.
En POO, a través de la encapsulación, varias funciones de una clase se implementarán como funciones miembro múltiples, y cada función miembro en realidad solo puede acceder a una pequeña cantidad de variables miembro. Esto puede generar un problema muy serio, por ejemplo: for?(Particle*?p?=?begin;?p?=?end;?p)
p-gt;position? gt;velocity?*?dt;?/?//?or?p-gt;SimulateMotion(dt);
En este modo, solo se accede a dos variables miembro en tiempo real, pero también se accederá a otras variables miembro. cargarse en la memoria caché, provocando desperdicio. Por supuesto, si puede acceder a tantas variables miembro como sea posible durante la iteración, es posible que este problema no exista, pero en realidad es muy difícil.
Si se adopta el paradigma y la implementación de la programación orientada a objetos tradicional, casi no hay solución al problema del diseño de datos. Por lo tanto, en [1], el autor propuso que en algunos casos, el método OOP debería abandonarse y el acceso y el diseño de los datos deberían ser las principales consideraciones de programación, lo que se denomina programación orientada a datos (DOP).