Windows 10 o cómo comprobar mal el número de versión

Windows 10 o cómo comprobar mal el número de versión
Sin comentarios Facebook Twitter Flipboard E-mail

Como os comentábamos hace unos días, Microsoft presentó el que será su nuevo sistema: Windows 10. Ayer fue liberada la preview que nuestros compañeros de Xataka Windows han probado a fondo.

Pero las novedades no fueron la mayor sorpresa. La sorpresa más grande fue que los de Redmond se saltaran la versión 9. Aunque Microsoft no siempre ha nombrado sus sistemas con números de versión -tenemos los ejemplos de Windows 98, Me, XP o Vista- parecía que esta iba a ser la tónica habitual después de la salida de Windows 7 y Windows 8. ¿Por qué se han saltado una versión?

En la presentación de Windows 10 no se dieron muchas explicaciones. De hecho se comentó a modo de broma que el 7 y el 8 se comieron al 9. Así que la falta de explicación ha hecho que cada uno la busque por su cuenta. Tanto que hemos llegado a un nivel peligroso de chistes malos (el más recurrente seguramente el de Windows malo-bueno-malo-bueno).

Es entonces cuándo ha aparecido el rumor que más está pegando. Al menos en el mundo del desarrollo. Un supuesto desarrollador de Microsoft publicaba en reddit este comentario:

Microsoft dev here, the internal rumours are that early testing revealed just how many third party products that had code of the form

if(version.StartsWith("Windows 9")) { /* 95 and 98 */ } else {

and that this was the pragmatic solution to avoid that.

Según este desarrollador, muchas aplicaciones y librerías de terceros, están comprobando la versión de Windows de esa manera. Solo se comprueba si el nombre del sistema empieza por "Windows 9", condición que cumplirían Windows 95, Windows 98 y el inexistente Windows 9.

Y claro, si el sistema se llamase Windows 9, muchas aplicaciones podrían verse afectadas.

¿Pero es verdad?

El problema es que sí. Si buscamos en Searchcode, encontraremos miles de resultados. Y no hablamos de cualquier cosa, hablamos de por ejemplo alguna versión del OpenJDK de Java. Por ejemplo en JDK 8:


     public WindowsAttachProvider() {
            String os = System.getProperty("os.name");
            if (os.startsWith("Windows 9") || os.equals("Windows Me")) {
                throw new RuntimeException(
                    "This provider is not supported on this version of Windows");
            }
            String arch = System.getProperty("os.arch");
            if (!arch.equals("x86") && !arch.equals("amd64")) {
                throw new RuntimeException(
                    "This provider is not supported on this processor architecture");
            }
        }

Es una forma terrible de comprobar que sistema operativo Windows estamos usando, porque nos estamos basando simplemente en su nombre.

Para hacerlo mejor, podríamos hacer algo similar a lo que se hace en el código de Jenkins:


    if (name.startsWith("windows 9"))
        {
            if (version.startsWith("4.0"))
            {
                version = "95";
            }
            else if (version.startsWith("4.9"))
            {
                version = "me";
            }
            else
            {
                assert version.startsWith("4.1");
                version = "98";
            }
        }
        else
        {
            if (version.startsWith("4.0"))
            {
                version = "nt4";
            }
            else if (version.startsWith("5.0"))
            {
                version = "2000";
            }
            else if (version.startsWith("5.1"))
            {
                version = "xp";
            }
            else if (version.startsWith("5.2"))
            {
                if ("amd64".equals(arch))
                {
                    // The 64-bit version of xp is based on 2003
                    version = "2003+xp";
                }
                else
                {
                    version = "2003";
                }
            }
            else if (version.startsWith("6.0.6000"))
            {
                version = "vista";
            }
            else if (version.startsWith("6.0"))
            {
                // Server 2008 is based on 6.0.6001
                version = "vista+2008";
            }
            else if (version.startsWith("6.1"))
            {
                if ("x86".equals(arch))
                {
                    // 2008 R2 is 64-bit only.
                    version = "7";
                }
                else
                {
                    // TODO distinguish windows 7amd64 from 2008R2?
                    version = "7+2008r2";
                }
            }
        }

El código es más exhaustivo (aunque habría que pensar seriamente en por qué tanto if else if) y permite saber qué versión de Windows usamos de forma más exacta, ya que hacemos uso de dos propiedades de Java: os.name y os.version.

También, si nuestra aplicación lo permite, podemos usar las funciones específicas de Windows para realizar esta tarea.

¿Y de quién es la culpa?

En mi opinión la culpa, en este caso, es del desarrollador. Me parece una temeridad basarse en un string que nunca ha seguido un estándar. Ya sabemos todos que Microsoft no destaca precisamente por nombrar sus productos de forma consistente, así que basarse solo en el nombre del sistema es jugar con fuego.

De todas maneras no creo que Microsoft se haya saltado Windows 9 por esta razón. Más que nada porque podrían haberlo evitado usando otro nombre tipo Windows One, Windows X o similar. Sencillo y jamás nos hubiésemos enterado de todo esto.

¿Qué os parece?

En GenbetaDev | Se desvela el misterio, el nuevo Windows será Windows 10

Imagen | William Mewes

Comentarios cerrados
Inicio