Witam was !
Zaczynam naukę z programowaniem i piszę skromny projekt. Nauka z książek jest ok, ale pomija wiele aspektów i niestety bardzo rzadko są podawane podpowiedzi od autorów jak oni robią daną rzecz. Przedstawię wam moje 2 pytania.
Pytanie 1. Mam pewną klasę która robi parę obliczeń na zmiennej, dla bardzo dużego uproszczenia, zróbmy przykład z mnożeniem zmiennej przez inna liczbę stałą, zmiennoprzecinkową. Dodam również, że obiekty tej klasy będą tworzone stopniowo (co jakiś czas), zaś na końcu wyniki mnożenia będą potrzebne wszystkie razem.
Jak wy byście zaprojektowali klasę ? Nastawilibyście się na odciążenie procesora czy pamięci ?
a) większe zużycie pamięci (tworzy zmienną i przetrzymuje ją cały czas w liście(obiektów)), za to mamy bezpośredni dostęp na końcu do wyniku, czy mnożenie w locie? A i jeszcze jedno (chodzi mi, aby dowiedzieć się o szczegóły, wyniki zwracalibyście za pomocą void czy gettera ?
class Licz
{
private double _wezly = 0;
private double _kilometry = 0;
public Licz(double wezly)
{
this._wezly = wezly;
this._kilometry = wezly * 1.852;
}
//użyć funkcji
public double GetKilometers()
{
return this._kilometry;
}
// czy użyć gettera ?
public double Wezly
{
get
{
return this._wezly;
}
}
}
b) Czy może użyć bardziej obciążającej dla procesora wersji ?
class Licz
{
private double _wezly = 0;
public Licz(double wezly)
{
this._wezly = wezly;
}
public double GetKilometers()
{
return this._wezly * 1.852;
}
}
Pytanie 2. Walidacja danych
Powiedzmy, że klasa wykonuje jakieś obliczenia czy przyjmuje parametry - cokolwiek,a następnie (albo przypisywanie, albo jakieś obliczenia funkcji mogą się powieść, bądź nie, możemy dostać wyjątek, bądź nie, albo wynik "czegoś" nie spełnia naszych oczekiwań), już wyjaśniam na prostych przykładach.
Przed tym przykładem muszę zadać również pytanie pomocnicze. W którym miejscu Wy przeprowadzacie walidację danych ? Przed wprowadzeniem zmiennych do klasy, czy już w samej klasie i zwracacie odpowiedni wynik.
Wg mnie dużo czytelniej dla kodu jest przeprowadzać walidację (szczególnie bardziej skomplikowaną już w klasie) i zwracać odpowiedni wynik -- ale może się milę ;)
Przykład 1.
Powiedzmy, że mamy klasę w której jakaś funkcja nie może przypisać do zmiennej string ciągu znaków który rozpoczyna się od znaku _. Zakładam, że walidacja występuje w klasie. W tym przypadku mamy dość prosty schemat, przypisanie do zmiennej może się odbywać poprzez void ale dla naszych potrzeb zamiast void możemy wstawić bool
czyli :
class PrzypiszString
{
private string _tekst;
...
public bool Przypisz(string tekst)
{
if(tekst.Length > 1 && tekst[0] != '_'))
{
this._tekst = tekst;
return true;
}
else return false;
}
}
a kod aplikacji wiadomo :
...
if(!ObiektPrzypiszString.Przypisz("_wow")) Console.WriteLine("false");
Co jeśli gdy chcemy aby funkcja zwracała nam wynik dodawania (+10), ale gdy wprowadzona przez nas liczba jest różna od 5 ?
public int Dodaj(int liczba)
{
if(liczba != 5)
{
return liczba + 10;
}
else return
// no właśnie co nie możemy zwrócić null, a teoretycznie każda inna liczba może być wynikiem
}
wiadomo, że mądrzy pomyślą, że wystarczy w klasie programu : if(Dodaj(LICZBA) == 15) Console.WriteLine("Błąd liczby 5");, lecz co przy bardziej skomplikowanych działaniach ?
Możemy oczywiście zrobić, aby Dodaj wyświetlił nam Console.WriteLine("błąd");, lecz jeśli będziemy pracować na zwróconych przez niego wynikach, klasa będzie mogła być przenoszona między powiedzmy aplikacjami konsolowymi a okienkowymi.
Dopiero się uczę i dlatego proszę o wyjaśnienie sytuacji :)