Vraag Juiste use cases voor Android UserManager.isUserAGoat ()?


Ik was aan het kijken naar de nieuwe API's die zijn geïntroduceerd in Android 4.2. Tijdens het kijken naar de UserManager klasse Ik kwam de volgende methode tegen:

 public boolean isUserAGoat()

Wordt gebruikt om te bepalen of de gebruiker die deze oproep doet onderworpen is aan teleportaties.

Retourneert of de gebruiker die deze oproep doet een geit is.

Hoe en wanneer moet dit worden gebruikt?


3140
2017-11-14 08:34


oorsprong


antwoorden:


Van hun bron, de methode die wordt gebruikt om terug te keren false totdat het werd gewijzigd in 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;
}

Het lijkt erop dat de methode geen echt nut voor ons als ontwikkelaars heeft. Iemand heeft eerder verklaard dat het een paasei.

In API 21 is de implementatie gewijzigd om te controleren of er een geïnstalleerde app bij het pakket is 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");
}

Hier is de bron link


1512
2017-11-14 08:40



Ik weet niet of dit "de" officiële use-case was, maar het volgende produceert een waarschuwing in Java (die verder compileerfouten kan produceren als deze wordt gemengd met return verklaringen, leidend tot onbereikbare code):

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

Dit is echter legaal:

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

Dus merk ik vaak dat ik een dwaze gebruiksmethode schrijf voor de snelste manier om een ​​codeblok te demonteren, en vervolgens bij het voltooien van debuggen alle oproepen ernaar te vinden, dus mits de implementatie niet verandert, kan dit daarvoor worden gebruikt.

JLS wijst erop if (false) activeert niet "onbereikbare code" om de specifieke reden dat dit de ondersteuning voor foutopsporingsvlaggen zou breken, d.w.z. in principe dit gebruik (h / t @auselen). (static final boolean DEBUG = false; bijvoorbeeld).

Ik heb vervangen while voor if, het produceren van een meer obscuur gebruik. ik geloven je kunt je IDE, zoals Eclipse, omzeilen met dit gedrag, maar deze bewerking is 4 jaar in de toekomst en ik heb geen Eclipse-omgeving om mee te spelen.


916
2017-11-14 14:47



Dit lijkt een inside joke bij Google te zijn. Het is ook te zien in de taakmanager van Google Chrome. Het heeft geen enkel doel, behalve dat sommige ingenieurs het grappig vinden. Dat is een doel op zich, als je wilt.

  1. Open in Chrome de Taakbeheer met Verschuiving+Esc.
  2. Klik met de rechtermuisknop om de te verwijderen Goats Teleported kolom.
  3. Vraag me af.

Er is zelfs een enorm Chromium-bugrapport over te veel teleporterende geiten.

chrome 

Het volgende Chromium broncodefragment is gestolen uit de HN opmerkingen.

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

706
2017-11-14 09:03



Aanvulling op de @ djechlin antwoord (goed antwoord trouwens!), deze functieaanroep zou kunnen zijn ook gebruikt als dummy-code om een ​​onderbrekingspunt in een IDE vast te houden wanneer u wilt stoppen in een bepaalde iteratie of een bepaalde recursieve oproep, bijvoorbeeld:

enter image description here

isUserAGoat() kan worden gebruikt in plaats van een dummy-variabele-declaratie die in de IDE wordt weergegeven als waarschuwing en die in het geval van Eclipse specifiek het breekpuntmarkering verstopt, waardoor het moeilijk wordt om deze in / uit te schakelen. Als de methode wordt gebruikt als een conventie, kunnen alle aanroepingen later worden gefilterd door een script (tijdens de commit-fase misschien?).

enter image description here

Google-jongens zijn zware Eclipse-gebruikers (ze leveren verschillende van hun projecten als Eclipse-plug-ins: Android SDK, GAE, enz.), Dus het antwoord van @djechlin en dit aanvullende antwoord zijn logisch (althans voor mij).


258
2017-11-21 16:55



Er is een grappige naam methode / constante / wat dan ook in elke versie van Android.

Het enige praktische gebruik dat ik ooit heb gezien was in de laatste oproep voor Google I / O Wedstrijd waarbij ze vroegen wat het was voor een bepaalde versie, om te zien of deelnemers het API diff-rapport voor elke release hebben gelezen. De wedstrijd had ook programmeerproblemen, maar over het algemeen een aantal trivia die automatisch als eerste konden worden beoordeeld om het aantal inzendingen te verlagen tot redelijke bedragen die gemakkelijker te controleren waren.


122
2017-11-14 17:26



In de discipline van spraakherkenning zijn gebruikers onderverdeeld in geiten en schapen.

Hier bijvoorbeeld op pagina 89:

Sheeps zijn mensen voor wie spraakherkenning uitzonderlijk goed werkt, en geiten zijn mensen voor wie het uitzonderlijk slecht werkt. Alleen de stemherkenner weet wat hen scheidt. Mensen kunnen niet voorspellen wiens stem gemakkelijk zal worden herkend en wiens wil niet. Het beste beleid is om de interface zo te ontwerpen dat deze met allerlei soorten stemmen in allerlei omgevingen kan omgaan

Misschien is het de bedoeling Android-gebruikers in de toekomst te markeren als geiten om de spraakherkenningsengine voor de behoeften van geiten te kunnen configureren. ;-)


110
2018-05-31 09:33



Google heeft een serieuze interesse voor geiten en geiten Paas eieren. Er is zelfs geweest vorige Stack Overflow-berichten erover.

Zoals eerder in eerdere berichten is vermeld, bestaat deze ook in de Chrome-taakmanager (het verscheen voor het eerst in het wild in 2009):

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

En dan in Windows, Linux en Mac-versies van Chrome begin 2010). Het aantal "Geit Geteleporteerd" is in feite willekeurig:

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

Andere Google-verwijzingen naar geiten zijn onder meer:

De vroegste correlatie tussen geiten en Google hoort thuis in de originele blog 'Maaien met geiten', voor zover ik weet.

We kunnen er gerust van uitgaan dat het slechts een paasei is en niet echt wordt gebruikt, behalve als het terugkeert false.


104
2017-11-15 10:33



Vanaf API 21 (de eerste Android 5.0 / Lollipop SDK), dit detecteert of de Geit Simulator app is geïnstalleerd:

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

Dit zou het duidelijk moeten maken de suggestie van djechlin van het gebruik als een waarschuwing-gratis if (false) is een potentieel rampzalige strategie. Wat eerder terugkeerde false want elk apparaat geeft nu een schijnbaar willekeurige waarde terug: als dit diep genoeg in je code was begraven, kon het een lang tijd om erachter te komen waar uw nieuwe bugs vandaan komen.

Kort gezegd: als u de implementatie van een methode niet beheert en besluit deze te gebruiken voor andere doeleinden dan die in de API-documentatie worden vermeld, gaat u op zoek naar problemen.


101
2017-10-20 10:00