Cómo implementar una función solo para unos pocos usuarios seleccionados

11

Un buen ejemplo de lo que estoy tratando de preguntar sería la nueva función de línea de tiempo de Facebook. Al principio, solo unos pocos seleccionados tenían acceso a la línea de tiempo. A medida que la función se solidificó en su funcionamiento y se corrigieron los errores, se permitió a los usuarios adicionales acceder a la función. En una fecha posterior, a un gran grupo de usuarios se les permitió acceder a la función y ahora, es una función general para todos los usuarios. ¿Cómo gestiona un equipo de desarrollo este tipo de despliegue de características?

He jugado con la idea de usar los ajustes de configuración para controlar selectivamente el acceso si algo está en prueba o en producción a través de un archivo de configuración y condicional si las declaraciones en el código. Ahora, aunque esto está bien para funciones simples, creo que si intentamos implementar esto en un conjunto de características más grande, sería inmanejable.

¿Cuál sería la mejor manera de gestionar el despliegue de funciones de esta manera?

Chris
fuente
3
ACL y RBAC son dos formas (muy similares) de hacer lo que estás buscando.
Yannis
@YannisRizos: De acuerdo, esa es una respuesta pequeña / corta, pero creo que es legítimamente útil. Deberías publicarlo como respuesta.
Steven Evers
¿No es básicamente lo mismo para todas las funciones, no solo para las nuevas? Dependiendo de las credenciales, ¿el usuario tiene acceso a la cantidad x de opciones? Por ejemplo, ¿el nivel de administrador puede cambiar la configuración y el nivel de gruñido solo puede escribir datos?
Pieter B

Respuestas:

2

¿Cómo gestiona un equipo de desarrollo este tipo de despliegue de características?

Es fácil adivinar que un sistema como Facebook está impulsado principalmente por bases de datos. Obviamente, todos los datos del usuario se almacenan en bases de datos, y eso probablemente incluye información sobre cómo representar los datos del usuario. Es imposible saber exactamente cómo está configurada la base de datos de Facebook, pero debe darse el caso de que una función como Timeline se implemente de forma gradual para los usuarios seleccionando periódicamente a los usuarios en la base de datos, según algunos criterios, y cambiando el valor ( s) de algún campo (s).

Por ejemplo, tal vez tienen un campo en la tabla de usuario como la timeline_statusque tiene valores como not offered, offered, preview, y public. Basándose solo en eso, el sistema de Facebook podría decidir cómo representar la página de información del usuario. El equipo de FB podría probar la función de línea de tiempo seleccionando algún grupo de usuarios y cambiando el valor de ese campo.

En la práctica, estoy seguro de que es un poco más complicado que eso, pero la idea central es que una cuenta de usuario son solo datos, y algunos de esos datos pueden determinar qué características están disponibles. La implementación de una nueva función es solo cuestión de actualizar los registros de los usuarios en la base de datos.

Caleb
fuente
9

... y condicional si las declaraciones en el código.

Sí, esa es la forma incorrecta de hacerlo. Cualquiera que sea la característica X, si es configurable, debe extender o reemplazar algo. Haz ESO en el código. Por ejemplo, lo de FB podría tener algo así:

class UserPageView;
class HatedTimelineView : UserPageView;
class OldViewEveryoneLikes : UserPageView;

Luego construiría una fábrica que crea objetos UserPageView cuando visita una página de usuario basada en la configuración. Activarías esa vista. No hay ramas tontas.

Desea hacerlo de esta manera porque si alguien le pide que lo cambie una vez, lo solicitará nuevamente. Además, pedirán cambiar otra cosa. Adivine su arquitectura con estuches especiales y si está por todas partes, tendrá un tazón gigante de espagueti con moho que no se puede mantener en lugar de un producto maduro y rico en características.

Edward extraño
fuente
Debe usar sentencias condicionales if. De lo contrario, ¿cómo sabe su fábrica qué UserPageView devolver? Dicho esto, estoy de acuerdo en que si las declaraciones en todo el código son una mala idea, desea centralizarlas.
briddums
1

Piense en la característica de la misma manera que pensaría en una característica de administración en un sitio wedsite.

Cuando se carga una página, verifique si el usuario tiene los privilegios correctos para la función, de ser así cárguela.

Facebook parece utilizar un enfoque basado en la ubicación al implementar nuevas funciones. Esto podría ser tan simple como mirar la dirección IP de los usuarios para encontrar su ubicación.

Gordon
fuente