Czy używac geterów i seterów czy metod publicznych?

0

Jak to jest z tymi geterami i seterami. Używać ich czy lepiej metod publicznych? W przypadku seterów i geterów to później odpowiednie dane referencji do obiektu można odpowiednio inkrementować, czego się nie da zrobić przez metody publiczne.

Zawsze je pisać w klasie? Bo kod wtedy nieco się wydłuża.

1
  1. Nie, kod się nie wydłuża.
  2. Używa się jednego i drugiego. Właściwości tam, gdzie pobieramy/ustawiamy jakieś cechy obiektu, metod tam, gdzie obiekt ma coś zrobić.
0

Czyli zawsze używać geterów i seterów? Kod się wydłuża o co najmniej 2linijki w przypadku getera i settera.

1

Nie bardzo rozumiem co ci się wydłuża, jeśli użyjesz Automatic Property to deklaracja jest tak samo "długa" jak deklaracja zwykłego pola w klasie.

Tak jak napisał somekind: jeśli masz sytuację że wykonujesz na obiekcie jakieś operacje przetwarzanie lub pobranie wartości jest zależne od innego parametru to lepszym (czasem jedynym) wyjściem jest metoda. Jeśli tylko ustawienie wartości to lepiej przez właściwość. Pamiętaj żeby w w getterach i setterach był jak najmniej (najlepiej wcale) logiki biznesowej. Możesz sobie pozowlić na sprawdzenie nulla itp operacje ale raczej nic więcej.

0
Świetny Pomidor2 napisał(a):

Czyli zawsze używać geterów i seterów?

Nie, nie zawsze. Getery i setery są częścią implementacji właściwości. Jeśli piszesz właściwość, to musisz ich użyć (przynajmniej jednego).

Kod się wydłuża o co najmniej 2linijki w przypadku getera i settera.

Nie.

W2K napisał(a):

Pamiętaj żeby w w getterach i setterach był jak najmniej (najlepiej wcale) logiki biznesowej. Możesz sobie pozowlić na sprawdzenie nulla itp operacje ale raczej nic więcej.

Też bez przesady - w geterze można coś dynamicznie obliczyć, np. pole figury geometrycznej.

0
somekind napisał(a):

Też bez przesady - w geterze można coś dynamicznie obliczyć, np. pole figury geometrycznej.

Pewnie, to jasna sprawa, że takie drobne rzeczy też można liczyć. Bardziej chodziło mi o duże operacje typu odpytywanie bazy/ usługi itp, albo czegokolwiek co wykracza poza proste operacje na kilku wartościach/obiektach.

0

Nie jestem przekonany czy obliczanie np: pola figury geometrycznej w getterze jest najlepszym pomysłem.

Obliczając pole pewnie posługiwalibyśmy się innymi properties, które mogą nie być przypisane - musielibyśmy to sprawdzać pewnie. Metoda by to na nas wymuszała aby podać np wysokość i szerokość czy cokolwiek innego. Tak jak napisał somekind pewnie nie jest błędem obliczać pole w getterze - w końcu to proste obliczenie - nie jest nigdzie napisane ile maksymalnie linii kodu może zawierać getter:). A pola figur pewnie potrafią być skomplikowane...

1
moneusz napisał(a):

Obliczając pole pewnie posługiwalibyśmy się innymi properties, które mogą nie być przypisane - musielibyśmy to sprawdzać pewnie. Metoda by to na nas wymuszała aby podać np wysokość i szerokość czy cokolwiek innego.

Ten problem wystąpi przy programowaniu proceduralnym. Pisząc obiektowo, wszystkie boki figury podamy w konstruktorze, więc będziemy pewni, że podczas obliczania pola będziemy mieli już wszystkie potrzebne dane.

0

A jak to jest z geterami i seterami automatycznymi? Mam przykładowy kod:

class Car
    {
        private string carName = string.Empty;

        public Car(string name)
        {
            PetName = name;
        }
        public string PetName
        {
            get;
            set;
        }
        public void wypisz()
        {
            Console.WriteLine("nazwa: {0}",carName);
        }
    } 

I przy wypisywaniu pokazuje mi pusty string, bo skąd ma on wiedzieć co ma zrobić w seterze i geterze

0

A co Ci ma wypisać, skoro do carName cały czas ma przypisany pusty string?

0

Dobra działa jak dodałem:

Car abc = new Car("Samolot");
            abc.PetName = "nazwa";
            abc.wypisz(); 

Dobra teraz działa. W metodzie wypisującej podawać jak element wypisujący daną właściowość?

0

Ale do carname nic nie wpisujemy, więc jak prawidłowo automatycznych geterów i seterów używać?

0
Świetny Pomidor2 napisał(a):

W metodzie wypisującej podawać jak element wypisujący daną właściowość?

No jeśli chcesz wypisać jej wartość na ekranie, to chyba nie masz wyjścia.

Świetny Pomidor2 napisał(a):

Ale do carname nic nie wpisujemy, więc jak prawidłowo automatycznych geterów i seterów używać?

Nie używać, bo nie ma czegoś takiego. Są automatyczne właściwości, w Twoim kodzie jest nią PetName - nie masz pola ukrywanego przez tę właściwość, ani ustawiania/pobierania jego wartości w akcesorach (czyli get/set).
carName to jest po prostu zwykłe prywatne pole, nie właściwość, tym bardziej nie automatyczna.

0

W setterze musisz przypisać wartość do tej zmiennej prywatnej którą chcesz później wyswietlić:

class Car
    {
        private string carName;
 
        public Car(string name)
        {
            this.PetName = name;
        }
        public string PetName
        {
            get {return carName;}
            set { carName = value; }
        }
        public void wypisz()
        {
            Console.WriteLine("nazwa: {0}",carName);//lub
            Console.WriteLine("nazwa: {0}",this.PetName);
        }
    } 
0

Jeśli korzystasz z właściwości automatycznych {get; set;} to kompilator automatycznie na etapie kompilacji wygeneruje pomocnicze pole w którym będzie ustawiał wartość, oraz zawartość gettera i settera odpowiadającą temu polu. Ciebie nie interesuje co tam jest.

Jeśli potrzebujesz innego zachowania tzn. np musisz sprawdzić po drodze jakiś warunek itd to wtedy twoim zdaniem staje się określenie ciała gettera i settera (albo tylko jednego z nich w zależności od potrzeb) zdefiniowania dodatkowych pól itd.

0

Czyli w przypadku automatycznych getterow i setterow nie trzeba dawac pół do klasy

1

Nie, nie trzeba. SOrry czy naprawdę tak trudno przejrzeć jakiś tutorial? To są naprawdę proste zagadnienia dostępne w niemal każdym kursie, a nie jakaś czarna magia.

0

W C# akurat niespecjalnie wydluza, jest tam taka fajna konstrukcja, cos na zasadzie:

public class Genre
{
    public string Name { get; set; }
}

Pytanie poboczne mamy cos podobnego w Javie?

0

Nie, nie mamy.

0

Jeżeli nie masz bardzo dobrego uzasadnienia, aby obiekt był mutowalny, to zaleca się używanie publicznych pól final.
Ewentualnie pola final w połączeniu ze wzorcem builder. Zaleta jest taka, że po zbudowaniu obiektu nie daje się zmienić i można bezpiecznie wszędzie przekazywać bez ryzyka, że wprowadzisz ukrytą zależność między odległymi komponentami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1