Diskuze: enum uvnitř třídy nebo venku

C# .NET .NET (C# a Visual Basic) enum uvnitř třídy nebo venku American English version English version

Avatar
Posix
Člen
Avatar
Posix:

Zdravím, jsou nějaké osvědčené postupy, jak psát enumy? Uvnitř třídy nebo venku. Ono je to celkem jedno, když je to public, protože když je uvnitř třídy, tak se přidá navíc jen jméno třídy a tečka. Zajímalo by mě, jak to píšete vy.

Odpovědět 27.10.2013 20:40
Proč to dělat jednoduše, když to jde složitě.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Posix
Kit:

Vzhledem k tomu, že mé enumy obsahují i konstruktory a další metody, považuji je za plnohodnotné třídy a jako takové mají právo být v samostatném souboru.

... když je uvnitř třídy, tak se přidá navíc jen jméno třídy a tečka

to nemůžeš myslet vážně. A co ti říká Démeteřin zákon?

Nahoru Odpovědět 27.10.2013 20:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Posix
Člen
Avatar
Odpovídá na Kit
Posix:

To máš jako u každého enumu konstruktor a metody? Asi dělám něco špatně :(

Aha, takže podle toho zákonu je to celkem jasné; mají být mimo danou třídu (pokud ten enum potřebuje i někdo jiný) nebo se pletu?

Editováno 27.10.2013 21:07
Nahoru Odpovědět 27.10.2013 21:06
Proč to dělat jednoduše, když to jde složitě.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Posix
Kit:

Konstruktor a další metody mám uvnitř toho enumu.

Přesně tak. Zacházej s enumem jako s třídou. Pokud ji nikdo jiný nepotřebuje, můžeš ji umístit dovnitř.

Nahoru Odpovědět 27.10.2013 21:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Posix
Člen
Avatar
Odpovídá na Kit
Posix:

A můžu se zeptat, k čemu je dobré mít u každého enumu konstruktor a metody? Nějaký dobrý příklad?

Nahoru Odpovědět 27.10.2013 21:13
Proč to dělat jednoduše, když to jde složitě.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Posix
Jan Vargovský:

Je to celkem jedno. Záleží na Tobě - já to teda vždycky dávám mimo třídu. Ale jestli to máš jako nějaký pomocný enum, který venku nebudeš používat tak ho můžeš nechat uvnitř (tak jako nested třídy).

Kit v C# to tuším ani nejde, maximálně přes extension metody ...

Editováno 27.10.2013 21:15
 
Nahoru Odpovědět 27.10.2013 21:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na Posix
Kit:

Netvrdím, že u každého enumu je potřebný konstruktor a třídy. Někdy se to však velmi dobře hodí:

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
}

Edit: No nazdar. Tohle je pro Javu. Zkus si to přepsat do C#.

Editováno 27.10.2013 21:24
Nahoru Odpovědět 27.10.2013 21:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět 27.10.2013 21:29
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

To je docela škoda, protože tímto způsobem se dá hezky zapouzdřit kus kódu i s relevantními konstantami a případnými výstupy, takže když vypíšu

Planet.MARS.surfaceGravity()

dostanu gravitační zrychlení na Marsu a nemusím to v jiné části programu počítat.

Nahoru Odpovědět 27.10.2013 21:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:

Tohle konkrétně by šlo implementovat taky :)

 
Nahoru Odpovědět 27.10.2013 23:36
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:
public class Planets
{
    public class Planet
    {
        private int n;
        public Planet(int n) { this.n = n; }
        public int GetN() {return n;}
    }

    public static readonly Planet MARS = new Planet(20);
    public static readonly Planet PLUTO = new Planet(20);
    //
    // TODO
    //
}

Třeba nějak takto => vím, že se ti nebude líbit statika.

 
Nahoru Odpovědět 27.10.2013 23:48
Avatar
Posix
Člen
Avatar
Odpovídá na Jan Vargovský
Posix:

proč se každý bojí statiky? :D

Nahoru Odpovědět 28.10.2013 0:51
Proč to dělat jednoduše, když to jde složitě.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

Zrovna tady je statika v pořádku. Jen mi to řešení připadá takové anemické, struktura by posloužila lépe.

Nahoru Odpovědět 28.10.2013 6:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Posix
Kit:

Nebojím se statiky, ale používá se zbytečně často i tam, kde být nemá.

Nahoru Odpovědět 28.10.2013 6:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.