[eside-ghost] C++
Alfredo Beaumont
alfredo.beaumont en gmail.com
Jue Jul 19 23:45:28 CEST 2007
Og, 2007eko Uztren 19a(e)an, Juanval(e)k idatzi zuen:
> Bueeenas,
>
> On 7/19/07, Alfredo Beaumont <alfredo.beaumont a bildua gmail.com> wrote:
> > No le veo mucho sentido a lo que comentas. Probablemente tengas algún
> > error de diseño, porque no es muy razonable que quieras evitar el acceso
> > de escritura en ciertas partes del programa. O hay partes del programa
> > que no hacen uso de tu clase o si no, no tiene sentido que no les dejes
> > escribir.
>
> El tema es que ese código que no quiero que tenga acceso de escritura,
> va a estar relacionandose con código "no confiable". Básicamente,
> scripts creados por otra gente. Y esos scripts necesitan poder acceder
> a los datos, pero no puedo permitirles modificarlos directamente
> porque si la lian con el script, no quiero que me la lien en el resto
> del programa :S
>
> Y también hay partes del programa que sí que necesitan modificar los
> datos, y tengo que permitirles hacerlo...
>
> Si se te ocurre alguna idea, será gratamente bienvenida.
Ya pillo la idea. Lo mas sencillo (siempre EMHO) es utilizar herencia. Puedes
hacer una clase read-only y exportarla para que la usen en todo el programa y
una clase read-write que herede de la read-only y le añada soporte de
escritura para exportarla a aquellos módulos que sí necesitan modificar
datos. Esto es conceptualmente muy simple (nada de rollos friend y similares,
que suelen ser engorrosos). Es decir, algo así:
class ReadOnly {
public:
scriptData() { return run(m_script); }
protected:
script() { return(m_script); }
private:
Script m_script;
};
class ReadWrite : public ReadOnly {
public:
modifyScript( Code newCode ) { script()->setCode( newCode ); }
};
#include "private_api.h"
int trusted() {
ReadWrite *trustedHanlder = new ReadWrite("faisan.sh");
trustedHanlder->setScript( "#!/bin/sh -*- farsa-mode -*-" )
return trustedHandler->scriptData();
}
#include "public_api.h"
int notTrusted() {
ReadOnly *unTrustedHanlder = new ReadOnly("faisan.sh");
return unTrustedHandler->scriptData();
}
Espero haberme explicado :-)
--
Alfredo Beaumont Sainz
http://www.alfredobeaumont.org/blog.cgi
Más información sobre la lista de distribución eside-ghost