Saltu al enhavo

Restrukturigado de fontkodo

El Vikilibroj

Enkonduko

[redakti]

Restrukturigado de fontkodo estas strukturita maniero plibonigi la fontkodon de programaro, por fari ĝin pli facile legebla kaj pli facile modifebla sen ŝanĝi la eksteran konduton.

Tiu ĉi libro celas programistojn, kiuj volas lerni kiel eblas per simplaj rimedoj plibonigi la strukturon kaj legeblecon de sia fontkodo. Antaŭa sperto pri programado estas nepra antaŭkondiĉo por tiu ĉi libro, kaj iom da sperto pri objektema programado estas postulata por povi absorbi la plenan enhavon de la libro.

Ĉiuj fontkodaj ekzemploj de la libro estas skribitaj per la programlingvo C#, sed devus estas facile kompreneblaj por tiuj spertaj pri Java, C++ aŭ aliaj objektemaj programlingvoj kun simila sintakso.

Metodkomponaj restrukturigoj

[redakti]

Ekstrakti metodon

[redakti]

Movu kodpecon al nova metodo, kies nomo bone priskribas la intecon de la kodo.

Antaŭ la restrukturigo:

public void PrintuPersoninformojn()
{
    PrintuNomon();

    // Printu la adreson
    System.Console.WriteLine("Strato: " + strato);
    System.Console.WriteLine("Poŝtkodo: " + poŝtkodo);
    System.Console.WriteLine("Urbo: " + urbo);
    System.Console.WriteLine("Lando: " + lando);
}

Post la restrukturigo:

public void PrintuPersoninformojn()
{
    PrintuNomon();
    PrintuAdreson();
}

private void PrintuAdreson()
{
    System.Console.WriteLine("Strato: " + strato);
    System.Console.WriteLine("Poŝtkodo: " + poŝtkodo);
    System.Console.WriteLine("Urbo: " + urbo);
    System.Console.WriteLine("Lando: " + lando);
}

Kial kaj kiam

[redakti]

Se metodo estas tro longa, ĝi fariĝas malfacile superrigardebla. Ekstrakti metodon estas maniero malplilongigi la originan metodon, kaj do plifaciligi la legeblon kaj superrigardeblon de la metodo.

Kelkfoje la intenco de grupo da linioj ne estas evidenta. En tiaj okazoj oni ofte trovas priskribajn komentojn en la fontkodo. Se oni anstataŭe ekstraktas metodon kaj donas al ĝi bone priskriban nomon, la komento fariĝos superflua.

Tiu ĉi restrukturigo povas havi sencon eĉ se la ekstraktita metodo havas nur unu linion da kodo. Se la nomo de la metodo multe pli klaras ol la enhavo mem, tiam faru la restrukturigon, aliokaze ne.

Kiel

[redakti]
  • Unue serĉu kodpecon kiu konsistigas memstaran unuon kun specifa celo.
  • Kreu novan metodon kun nomo priskribanta tion, kion faras la kodpecon. Uzu la intencon, ne la manieron, en la nomo. La maniero povas facile ŝanĝiĝi dum la intenco ofte restas la sama dum pli longa tempo.

Kondiĉaj esprimoj

[redakti]

Kune kun longaj metodoj, komplikaj kondiĉaj esprimoj estas unu el la plej grandaj faktoroj, kiuj malfaciligas la legadon de fontkodo. Feliĉe eblas multe fari por plibonigi la situacion, ekzemple per restrukturigoj kiel la antaŭe menciita metodekstrakto aŭ la restrukturigoj en tiu ĉi ĉapitro.

Anstataŭigi ingita kondiĉo per gardkondiĉo

[redakti]

Antaŭ la restrukturigo:

public Malsano Diagnozu(Simptomo simptomo)
{
    Malsano malsano = Malsano.Nekonata;
    if (simptomo == Simptomo.KorbatojMankas)
    {
        malsano = Malsano.Morto;
    }
    else
    {
        if (simptomo == Simptomo.Febro)
        {
            malsano = Malsano.Malvarmumo;
        }
    }
    return malsano;
}

Post la restrukturigo:

public Malsano Diagnozu(Simptomo simptomo)
{
    if (simptomo == Simptomo.KorbatojMankas)
        return Malsano.Morto;

    if (simptomo == Simptomo.Febro)
        return Malsano.Malvarmumo;
 
    return Malsano.Nekonata;
}

Ekzemplo

[redakti]

Ofte eblas utiligi tiun ĉi restrukturigon per inversigo de la kondiĉa esprimo. Jen ekzemplo de tia restrukturigo.

Antaŭ la restrukturigo:

public Rezulto AgorduGrandon(int novaLarĝo, int novaAlto)
{
    Rezulto rezulto = Rezulto.Bone;
    if (novaAlto > 0)
    {
        if (novaLarĝo > 0)
        {
            _larĝo = novaLarĝo;
            _alto = novaAlto;
        }
        else
        {
            rezulto = Rezulto.MalĝustaLarĝo;
        }
    }
    else
    {
        rezulto = Rezulto.MalĝustaAlto;
    }
    return rezulto;
}

Anstataŭigu la unuan kondiĉon per gardkondiĉo havanta inversigitan esprimon:

public Rezulto AgorduGrandon(int novaLarĝo, int novaAlto)
{
    Rezulto rezulto = Rezulto.Bone;

    if (novaAlto <= 0) return Rezulto.MalĝustaAlto;

    if (novaLarĝo > 0)
    {
        _larĝo = novaLarĝo;
        _alto = novaAlto;
    }
    else
    {
        rezulto = Rezulto.MalĝustaLarĝo;
    }
    return rezulto;
}

Daŭrigu kaj anstataŭigu la duan kondiĉon:

public Rezulto AgorduGrandon(int novaLarĝo, int novaAlto)
{
    Rezulto rezulto = Rezulto.Bone;

    if (novaAlto <= 0) return Rezulto.MalĝustaAlto;
    if (novaLarĝo <= 0) return Rezulto.MalĝustaLarĝo;

    _larĝo = novaLarĝo;
    _alto = novaAlto;

    return rezulto;
}

Nun la provizora variablo ne plu havas sencon, kaj ni do forigos ĝin:

public Rezulto AgorduGrandon(int novaLarĝo, int novaAlto)
{
    if (novaAlto <= 0) return Rezulto.MalĝustaAlto;
    if (novaLarĝo <= 0) return Rezulto.MalĝustaLarĝo;

    _larĝo = novaLarĝo;
    _alto = novaAlto;

    return Rezulto.Bone;
}

Restrukturigado en ordonemaj programlingvoj

[redakti]

Bona legebleco gravas por fontkodo skribita en kiu ajn programlingvo. Multaj el la listigitaj restrukturigoj validas kaj por objektemaj programlingvoj kaj por ordonemaj programlingvoj. Ekzemple la plejparto de la metodkomponaj restrukturigoj aplikeblas ankaŭ por ordonemaj programlingvoj.

Ligiloj

[redakti]
  • Refactoring Home - (angla) Retejo pri restrukturigado de Martin Fowler, kun listo de multaj restrukturigoj.
  • SourceMaking - (angla) Retejo kun multe da informoj pri restrukturigado kaj objektema programado.