Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Entiteetti-luokkien populointi ja uudelleenkäytettävyys

Triton [06.06.2014 19:01:15]

#

Olen tässä joutunut pohtimaan ratkaisua eräälle ohjelmistosuunnittelussa esiintulevalle kysymykselle:

Jokaisessa sovelluksessa on enemmän tai vähemmän näitä entiteetti-oliota, jotka edustaa yleensä tietokannan rivejä suoritettavassa sovelluksessa. Oletetaan tilanne, että meillä on luokka X, jossa on kymmenen eri attribuuttia. Tietyissä tilanteissa kun tietokannasta haetaan tietoa, olion kaikki kymmenen kenttää populoidaan datalla, mutta entäs sitten, kun jossakin tietyssä tilanteessa tarvitaankin vain 5 attribuuttia? Tehokkuussyistä ei mielestäni ole kauhean kannattavaa ladata turhaa dataa, jos sitä ei käytetä missään. Tässä kyseisessä esimerkissä ei toki ole väliä vaikka haettaisiinkin kaikki data, mutta jos määrä on paljon suurempi ja jos olioita haetaankin vaikka 1000. Toisaalta, jos lataan vain viiden attribuutin arvon kymmenestä, niin silloin minulla on vajaasti populoitu olio, mikä sekään ei tunnut hyvältä ajatuksilta. En myöskään näe järkevänä tehdä samasta käsitteestä useita luokkia, kun se sotii uudelleenkäytettävyyden periaatetta vastaan.

Miten tällaista ongelmaa tulisi lähestyä ja ratkaista se?

Grez [06.06.2014 22:28:55]

#

No esimerkiksi C#:ssa ja EF:ssä pysty tekemään kyselyitä, joissa entiteeteistä haetaan vain tarvittavat tiedot. Käytännössä näin kyllä tulee usein (anonyymejä) kertakäyttöisiä luokkia, mutta enpä nyt näe miten se tässä käyttötapauksessa mitään haittaa (uudelleenkäytettävyyden kannalta).

Esimerkiksi jos olisi Organisation-taulu missä on vaikka 10 kenttää ja tarvitsemme vain tietyn tyyppiset organisaatiot ja haluamme vain niiden nimen ja id-numeron niin

var tiedot = from o in db.Organisation
    where o.Type == (int)Enums.OrgType.Customer
    select new { o.Id, o.Name };

Tuossa siis tulisi anynyymiluokka tyypiltään

{
    public int Id;
    public string Name;
}

Mutta mitäpä se sitten haittaa?

Toki tiedot voisi hakea suoraan vaikkapa dictionaryyn:

var tiedot = db.Organisation.Where(o=>o.Type == (int)Enums.OrgType.Customer)
    .ToDictionary(o=>o.Id, o=>o.Name);

Tässäkään tapauksessa ei turhaan haettaisi muita kenttiä kuin Id ja Name

Triton [07.06.2014 15:44:30]

#

Käsitinkö siis oikein, ettei EF:ää käytettäessä C#:ssa tarvitse ollenkaan erikseen määritellä mitään erillistä luokkaa, jonka kentät sitten mäpätään vastaamaan taulun rivien kenttiä? Vai onko nämä entiteetti luokat olemassa ja EF vain käyttää niitä "pohjapiirustuksena" luodakseen virtuaalisia kertakäyttöluokkia? Onko näillä anonyymeilla luokilla olemassa kuitenkin oma abstrakti tyyppinsä niin kuin muillakin luokilla?

Vielä kun saisi tähän näkökulman java puolelta, jota siis itse käytän.

Grez [08.06.2014 15:37:37]

#

On siellä ne erilliset luokat taustalla, ja tuo tosiaan tekee niitä "virtuaalisia kertakäyttöluokkia" eli anonyymityyppejä.

Anonyymityypit

lainaus:

Anonymous types provide a convenient way to encapsulate a set of read-only properties into a single object without having to explicitly define a type first. The type name is generated by the compiler and is not available at the source code level. The type of each property is inferred by the compiler.

Javaan liittyen, tästä vastauksesta voisin päätellä että Javassa ei vastaavaa anonyymityyppi systeemiä ole, koska ensimmäisen vastauksen "Cons" on "not typesafe". Tosin tuo on 4 vuotta vanha, että ehkäpä siinä ajassa kieleen on ehtinyt tulla paljonkin uusia ominaisuuksia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta