16

Aprill

Võõrastega ei suhelda

Marek Tihkan

Paljud emad hoiatavad lapsi, et võõrastega suhelda ei tohi. Eriti nendega, kes kommi pakuvad. Ka koodi kirjutamisel on kasulik seda hoiatust arvesse võtta.

Law of Demeter (Principle of Least Knowledge)
Kui objekt A viitab objekt B-le, siis võib A kutsuda B meetodeid, kuid ta peaks hoiduma kutsumast meetodeid objektidel, millele viitab B.

public class Person
{
    public Account Account { get; set; }

    public void Block()
    {
        Account.State = AccountState.Disabled;
    }
}

public class Account
{
    public AccountState State { get; set; }
}

public class AccountState
{
    public static AccountState Disabled
    {
        //...
    }
}

Näitest võime näha, et Person klass teab liiga palju. Ta ei peaks teadma, kuidas Account klass enda olekut muudab. Alternatiivselt võime viia Block() meetodi Account alla. Kasutada saaksime seda järgnevalt:

var person = new Person();
person.Account.Block();

See ei tundu ka kõige parem moodus, sest esimese näite korral saime ainult person.Block() hakkama.

Siinkohal olekski mõistlik väikesed ümberkorraldused teha:

public class Person
{
    //...

    public void Block()
    {
        Account.Block();
    }
}

public class Account
{
    //...

    public void Block()
    {
        State = AccountState.Disabled;
    }
}

Näitest võis täheldada, et printsiibi vastu hakates kaob kapseldus hõlpsalt. Kui objekt-orienteerituse põhimõtteid meelde tuletada, siis kapseldamine oli üks neist. Sellest võiks järeldada, et printsiibist kõrvale kaldumine viib eemale ka objekt-orienteeritusest.

Teine häiriv osa koodist oli see, et mõned klassid teavad liiga palju. Lisades veel seoseid Personile ning käitudes printsiibi vastaselt, siis Person klassi muuta on halb ja iga muudatus ta seostes tekitab muudatusi temas.

Lisaks selline muudatuste ahel pärsib ka võõraste objektide ümber struktureerimist.

Loodan, et te ei pea selliste pikkade ahelatega tegelema (v.a. kui tegemist on ilusate liidestega).

Loe veel sarnastel teemadel:

  • Share/Bookmark

KATEGOORIAD » Arendus

SILDID » , , ,

Lisa kommentaar

  • * Kuvatakse kommentaari juures
  • * Ei publitseerita