[java] Casos de uso adecuados para Android UserManager.isUserAGoat ()?



Answers

No sé si este fue "el" caso de uso oficial, pero lo siguiente produce una advertencia en Java (que puede producir errores de compilación si se combina con declaraciones de return , lo que lleva a un código inalcanzable):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

Sin embargo esto es legal:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

Así que a menudo me encuentro escribiendo un método de utilidad tonto para la forma más rápida de fingir un bloque de código, luego al completar la depuración encontrar todas las llamadas a él, por lo que siempre que la implementación no cambie esto puede ser utilizado para eso.

JLS señala if (false) no desencadena "código inalcanzable" por la razón específica de que esto rompería el soporte para indicadores de depuración, es decir, básicamente este caso de uso (h / t @auselen). ( static final boolean DEBUG = false; por ejemplo).

Reemplacé while para, produciendo un caso de uso más oscuro. Creo que puedes tropezar con tu IDE, como Eclipse, con este comportamiento, pero esta edición durará 4 años y no tengo un entorno Eclipse para jugar.

Question

Estaba viendo las nuevas API introducidas en Android 4.2 . Mientras miraba la clase UserManager encontré el siguiente método:

 public boolean isUserAGoat()

Se usa para determinar si el usuario que realiza esta llamada está sujeto a teletransportación.

Devuelve si el usuario que hace esta llamada es un chivo.

¿Cómo y cuándo se debe usar esto?




Google tiene un gusto serio por los huevos de Pascua basados ​​en cabras y cabras. Incluso ha habido publicaciones previas de al respecto .

Como se mencionó en publicaciones anteriores, también existe en el administrador de tareas de Chrome ( apareció por primera vez en 2009 ):

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

Y luego en las versiones de Windows, Linux y Mac de Chrome a principios de 2010 ). El número de "cabras teletransportadas" es aleatorio :

 int TaskManagerModel::GetGoatsTeleported(int index) const {
     int seed = goat_salt_ * (index + 1);
     return (seed >> 16) & 255;
 }

Otras referencias de Google a las cabras incluyen:

La correlación más temprana entre cabras y Google pertenece al blog original "Siega con cabras", por lo que puedo ver.

Podemos suponer con seguridad que no es más que un huevo de Pascua y no tiene uso en el mundo real, excepto para devolver el false .




A partir de API 21 (el primer SDK de Android 5.0 / Lollipop) , esto detecta si la aplicación Goat Simulator está instalada:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Esto debería dejar en claro que la sugerencia de djechlin de usarla como una advertencia de if (false) es una estrategia potencialmente desastrosa. Lo que anteriormente devolvió false para cada dispositivo ahora devuelve un valor aparentemente aleatorio: si esto estaba enterrado lo suficientemente profundo en su código, podría tomar mucho tiempo descubrir de dónde provienen sus nuevos errores.

En pocas palabras: si no controla la implementación de un método y decide utilizarlo para fines distintos a los establecidos en la documentación de API, se está dirigiendo a problemas.




Complementando la answer @djechlin (¡buena respuesta, por cierto!), Esta llamada a la función también podría usarse como código ficticio para mantener un punto de inflexión en un IDE cuando desee detenerse en alguna iteración específica o una llamada recursiva particular, por ejemplo:

isUserAGoat() podría usarse en lugar de una declaración de variable ficticia que se mostrará en el IDE como una advertencia y, en el caso particular de Eclipse, obstruirá la marca del punto de interrupción, lo que dificulta su habilitación / deshabilitación. Si el método se utiliza como una convención, todas las invocaciones podrían ser filtradas posteriormente por algún script (¿quizás durante la fase de confirmación?).

Los chicos de Google son pesados ​​usuarios de Eclipse (proporcionan varios de sus proyectos como complementos de Eclipse: Android SDK, GAE, etc.), por lo que la respuesta de @djechlin y esta respuesta complementaria tienen mucho sentido (al menos para mí).




En las montañas más remotas del planeta, se encuentra una especie avanzada de cabra que parece ser capaz de usar teléfonos, ¡al igual que los humanos!

Material filtrado: youtu.be/YJwZMUn7GdQ

Google debe haber detectado esto y decidió brindarles soporte, en un intento por mantenerse en primera línea de avance tecnológico.




Related