Efecto de plataforma interna.
El efecto de plataforma interna consiste en crear un sistema tan configurable que acaba siendo una mala copia de su propia plataforma, como una base de datos dentro de otra.
El efecto de plataforma interna es la tendencia de los arquitectos de software a crear un sistema tan personalizable que acaba convirtiéndose en una réplica, y a menudo una mala réplica, de la propia plataforma de desarrollo de software que están utilizando. Esto suele ser ineficiente y, con frecuencia, tales sistemas se consideran ejemplos de un antipatrón.
Ejemplos
Hay ejemplos visibles en el software basado en complementos, como algunos editores de texto y navegadores web, que a menudo hacen que los desarrolladores creen complementos que recrean software que normalmente se ejecutaría sobre el propio sistema operativo. El mecanismo de extensiones de Firefox se ha utilizado para desarrollar varios clientes FTP y exploradores de archivos, que efectivamente replican algunas de las funciones del sistema operativo, aunque sobre una plataforma más restringida.
En el mundo de las bases de datos, los desarrolladores a veces se ven tentados a saltarse el RDBMS, por ejemplo, almacenándolo todo en una única tabla enorme con tres columnas etiquetadas como ID de entidad, clave y valor. Aunque este modelo entidad-atributo-valor permite al desarrollador escapar de la estructura impuesta por una base de datos SQL, pierde todas sus ventajas, ya que todo el trabajo que el RDBMS podría realizar de forma eficiente recae ahora sobre la aplicación. Las consultas se vuelven mucho más enrevesadas, los índices y el optimizador de consultas ya no pueden funcionar de forma eficaz, y las restricciones de validez de los datos no se aplican. El rendimiento y la mantenibilidad pueden ser extremadamente pobres.
Existe una tentación similar con XML, donde los desarrolladores a veces prefieren nombres de elementos genéricos y usan atributos para almacenar información significativa. Por ejemplo, cada elemento podría llamarse item y tener los atributos type y value. Esta práctica requiere uniones (joins) entre varios atributos para extraer el significado. Como resultado, las expresiones XPath son más enrevesadas, la evaluación es menos eficiente y la validación estructural aporta poco beneficio.
Otro ejemplo es el fenómeno de los escritorios web, donde todo un entorno de escritorio —a menudo incluido un navegador web— se ejecuta dentro de un navegador (que a su vez normalmente se ejecuta dentro del entorno de escritorio proporcionado por el sistema operativo). Un escritorio dentro de un escritorio puede resultar inusualmente incómodo para el usuario y, por tanto, esto generalmente solo se hace para ejecutar programas que no pueden desplegarse fácilmente en los sistemas de los usuarios finales, o para ocultar el escritorio exterior.
Efecto
Es normal que los desarrolladores de software creen una biblioteca de funciones personalizadas relacionadas con su proyecto específico. El efecto de plataforma interna se produce cuando esta biblioteca crece hasta incluir funciones de propósito general que duplican una funcionalidad ya disponible como parte del lenguaje de programación o de la plataforma. Dado que cada una de estas nuevas funciones generalmente llamará a varias de las funciones originales, tienden a ser más lentas y, si están mal programadas, también menos fiables.
Por otro lado, tales funciones suelen crearse para ofrecer una capa de abstracción más sencilla (y a menudo más portable) sobre servicios de más bajo nivel que tienen una interfaz incómoda, son demasiado complejos, no son portables o lo son de forma insuficiente, o simplemente encajan mal con el código de aplicación de más alto nivel.
Usos apropiados
Una plataforma interna puede ser útil por motivos de portabilidad y de separación de privilegios; en otras palabras, para que la misma aplicación pueda ejecutarse en una amplia variedad de plataformas externas sin afectar a nada fuera de un entorno aislado (sandbox) gestionado por la plataforma interna. Por ejemplo, Sun Microsystems diseñó la plataforma Java para cumplir ambos objetivos.
Ejemplo
En lugar de una tabla por entidad, todo va a una tabla genérica de entidad–atributo–valor, y la aplicación tiene que reconstruir lo que la base de datos ya ofrece: tipos, restricciones y combinaciones. Incluso un filtro sencillo necesita una autocombinación y una conversión de tipo, y nada impide que un cliente se quede sin correo electrónico o tenga un límite de crédito negativo.
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE entity (id INTEGER, attr TEXT, value TEXT)")
def save_customer(cid, name, email, credit_limit):
db.executemany(
"INSERT INTO entity VALUES (?, ?, ?)",
[(cid, "name", name), (cid, "email", email), (cid, "credit_limit", str(credit_limit))],
)
def customers_over(limit):
return db.execute(
"SELECT n.id, n.value FROM entity n "
"JOIN entity c ON c.id = n.id AND c.attr = 'credit_limit' "
"WHERE n.attr = 'name' AND CAST(c.value AS REAL) > ?",
(limit,),
).fetchall()
Un esquema real permite que el SGBDR haga cumplir tipos y restricciones, use un índice y optimice la consulta: la aplicación ya no reimplementa la plataforma sobre la que se ejecuta.
import sqlite3
db = sqlite3.connect(":memory:")
db.execute(
"CREATE TABLE customer ("
" id INTEGER PRIMARY KEY,"
" name TEXT NOT NULL,"
" email TEXT NOT NULL UNIQUE,"
" credit_limit REAL NOT NULL CHECK (credit_limit >= 0))"
)
db.execute("CREATE INDEX customer_credit_limit ON customer (credit_limit)")
def save_customer(cid, name, email, credit_limit):
db.execute("INSERT INTO customer VALUES (?, ?, ?, ?)", (cid, name, email, credit_limit))
def customers_over(limit):
return db.execute("SELECT id, name FROM customer WHERE credit_limit > ?", (limit,)).fetchall()
Adaptado del artículo de Wikipedia “Inner-platform effect” (revisión 1319593770), disponible bajo la licencia CC BY-SA 4.0; el texto ha sido traducido y editado, y se han añadido ejemplos.