Pregunta Casos de uso adecuados para Android UserManager.isUserAGoat ()?


Estaba viendo las nuevas API introducidas en Android 4.2. Mientras mira el UserManager clase me encontré con 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?


3140
2017-11-14 08:34


origen


Respuestas:


De sus fuente, el método usado para regresar false hasta que se cambió en API 21.

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 * @return whether the user making this call is a goat 
 */
public boolean isUserAGoat() {
    return false;
}

Parece que el método no tiene un uso real para nosotros como desarrolladores. Alguien ha declarado previamente que podría ser un huevo de Pascua.

En la API 21, se modificó la implementación para verificar si hay una aplicación instalada con el paquete com.coffeestainstudios.goatsimulator

/**
 * 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");
}

Aquí está el enlace fuente


1512
2017-11-14 08:40



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 mezcla con return declaraciones, que conducen 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 usarse 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 los 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 if, produciendo un caso de uso más oscuro. yo creer puede tropezar con su IDE, como Eclipse, con este comportamiento, pero esta edición durará 4 años y no tengo un entorno Eclipse para jugar.


916
2017-11-14 14:47



Esto parece ser una broma interna en Google. También aparece en el administrador de tareas de Google Chrome. No tiene ningún propósito, aparte de que algunos ingenieros lo encuentran divertido. Lo cual es un propósito en sí mismo, si quieres.

  1. En Chrome, abra el Administrador de tareas con Cambio+Esc.
  2. Haga clic derecho para agregar el Goats Teleported columna.
  3. Preguntarse.

Incluso hay un gran informe de errores Chromium sobre demasiadas cabras teletransportadas.

chrome 

El siguiente cromo fragmento de código fuente es robado de la HN comentarios

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

706
2017-11-14 09:03



Complementando el @djechlin responder (¡buena respuesta por cierto!), esta llamada a la función podría ser además utilizado como código ficticio para mantener un punto de interrupción en un IDE cuando desea detenerse en alguna iteración específica o una llamada recursiva particular, por ejemplo:

enter image description here

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 activación / desactivació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?).

enter image description here

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í).


258
2017-11-21 16:55



Hay un divertido método llamado / constante / lo que sea en cada versión de Android.

El único uso práctico que vi fue en la última llamada para Google I / O Concurso donde preguntaron qué era para una versión en particular, para ver si los concursantes leen el informe de diferencia API para cada lanzamiento. El concurso también tenía problemas de programación, pero en general algunos trivialos que podían calificarse automáticamente para reducir el número de envíos a cantidades razonables que serían más fáciles de controlar.


122
2017-11-14 17:26



En la disciplina del reconocimiento de voz, los usuarios se dividen en cabras y Ovejas.

Por ejemplo, aquí en la página 89:

Las ovejas son personas para quienes el reconocimiento de voz funciona excepcionalmente bien, y las cabras son personas para las que funciona excepcionalmente mal. Solo el reconocedor de voz sabe lo que los separa. La gente no puede predecir quién será reconocida fácilmente y quién no. La mejor política es diseñar la interfaz para que pueda manejar todo tipo de voces en todo tipo de entornos

Tal vez, está previsto marcar a los usuarios de Android como cabras en el futuro para poder configurar el motor de reconocimiento de voz para las necesidades de las cabras. ;-)


110
2018-05-31 09:33



Google tiene un gusto serio por las cabras y las cabras huevos de Pascua. Incluso ha habido publicaciones previas de Stack Overflow al respecto.

Como se mencionó en publicaciones anteriores, también existe en el administrador de tareas de Chrome (apareció por primera vez en la naturaleza 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, de hecho, 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 regresar false.


104
2017-11-15 10:33



A partir de API 21 (el primer SDK de Android 5.0 / Lollipop), esto detecta si el Simulador de cabra la aplicación 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 sugerencia de djechlin de usarlo como una advertencia libre if (false) es una estrategia potencialmente desastrosa Lo que previamente regresó false para cada dispositivo ahora se devuelve un valor aparentemente aleatorio: si esto estaba enterrado lo suficientemente profundo en su código, podría tomar una largo tiempo para descubrir de dónde vienen 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.


101
2017-10-20 10:00