Thursday 2 February 2012

ProgrammerFail–Go To The Hell

 

Without any comment, let’s go to the hell:

/// <summary>
/// WriteRaw writes out the given string "unescaped", in other words it better be well formed XML markup.
/// So for the XmlNodeWriter we parse this string and build the resulting tree, so it maps to setting the
/// InnerXml property.  
/// </summary>
/// <param name="data"></param>
public override void WriteRaw(string data)
{
    if (data.IndexOf("<") < 0)
    {
        WriteString(data);
        return;
    }

    switch (state)
    {
        case WriteState.Start:
            goto case WriteState.Content;
        case WriteState.Prolog:
            goto case WriteState.Content;
        case WriteState.Element:
            state = WriteState.Content;
            goto case WriteState.Content;
        case WriteState.Attribute:
            {
                ArrayList saved = new ArrayList();
                if (ca.HasChildNodes)
                {
                    while (ca.FirstChild != null)
                    {
                        saved.Add(ca.FirstChild);
                        ca.RemoveChild(ca.FirstChild);
                    }
                }
                ca.InnerXml = data;
                for (int i = saved.Count - 1; i >= 0; i--)
                {
                    ca.PrependChild((XmlNode)saved[i]);
                }
            }
            break;
        case WriteState.Content:
            {
                ArrayList saved = new ArrayList();
                if (current.HasChildNodes)
                {
                    while (current.FirstChild != null)
                    {
                        saved.Add(current.FirstChild);
                        current.RemoveChild(current.FirstChild);
                    }
                }
                current.InnerXml = data;
                for (int i = saved.Count - 1; i >= 0; i--)
                {
                    current.PrependChild((XmlNode)saved[i]);
                }
                state = WriteState.Content;
            }
            break;
        case WriteState.Closed:
            throw new InvalidOperationException("Writer is closed");
    }

}

Nice combination of using goto and switch statement together. I hope I will never work with the author.

 

ProgrammerFail

!!!FAIL!!!

7 comments:

  1. A goto-t nem a switch-csel kombinálja, hanem egy címkével; mi ebben a különleges?

    ReplyDelete
  2. Vannak ágai amikben nem csinál semmi mást csak átirányít egy másik ágra.
    Ha ismerné a swith szerkezetét vagy csak kicsit is törődne azzal hogy olyan kódot írjon amibe majd lehet hogy fél év múlva más is belenéz akkor ezek az ágak egyben lennének kezelve.

    Morzel

    ReplyDelete
  3. Szemantikailag nem elemeztem, arra nincs is időm, csak azt hittem az a baj, hogy ráugrik egy case-címkére.

    ReplyDelete
    Replies
    1. Ha megnézed a Fail kategóriában a bejegyzéseket, nem nagyon látsz olyat ami szintaktikailag helytelen.

      Morzel

      Delete
  4. Lehet, hogy arra gondolt, hogy a jövőben majd nem kell szétbontani az egyes címkék alá besorolt kódot, mert már most úgy érezte, hogy külön kell azokat kezelni, de egyelőre még nem valósította meg a külön kezelésüket, így átirányította a másik ágra (egyelőre).

    Persze nem akarok kötözkötni veled; csak mint egy lehetséges magyarázat, hogy nem biztos, hogy gagyi a szerzője.

    ReplyDelete
    Replies
    1. Tapasztalataim szerint az ilyen kódok úgy születnek hogy valamit ki kell törölni. És a maradék ott marad. Hosszú távon futó projektek közül mindegyikben van ilyen. Vagy ha nem akkor az a rikta kivétel ami erősíti a szabályt...

      Morzel

      Delete