[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