Zmienne składowe i ich stosowanie

0

Czytam aktualnie książkę i pod koniec każdego rozdziału są ćwiczenia do wykonania.

Napisałem w zasadzie kod prawie bez błędu. Problemem było to, że w klasie SportCar nadałem 4 zmienne instancji, a powinny być dwie zmienne instancji oraz 2 zmienne składowe.

Teraz pytanie. Co znaczy dokładnie, że one są składowe? I dlaczego w tym "projekcie" zostały one napisane jako składowe czyli static.

Treść zadanka:
Napisz klasę SportsCar zawierającą dwie zmienne instancji maxSpeed i horsepower typu int. Obie zmienne instancji muszą w każdym obiekcie SportsCar przechowywać wartości większe niż wstępnie określone; w przeciwnym wypadku nie są zakwalifikowane jako właściwe obiekty SportsCar. W naszym wypadku minimalna maxSpeed wynosi 200km/h, a minimalna wartość horsepower 250KM.
Umieść w klasie SportsCar dogodne zmienne składowe do przetrzymywania wspomnianych wartości( zwane maxSpeedRequirement() i horsepowerRequirement() ) i napisz metodę zwaną SportsCheck(), która zwraca wartość true, gdy obydwie zmienne maxSpeed i horsepower dla konkretnego obiektu SportsCar spełniają żądane kryteria, w przeciwnym razie zwracana jest wartość false.
Napisz metodę dostępową i ustawiania maxSpeed, horsepower, maxSpeedRequirement, horsepowerRequirement.
Dodaj do projektu inną klasę zawierającą metodę Main(), aby zademonstrować działanie klasy SportsCar.

using System;

class SportsCar
{
    private int maxSpeed = 0;
    private int horsepower = 0;
    public static int maxSpeedRequirement = 0;
    public static int horsepowerRequirement = 0;

    public bool SportsCheck()
    {
        if ((maxSpeed >= maxSpeedRequirement) && (horsepower >= horsepowerRequirement))
        {
            return true;
        }
        else
            return false;
    }

    public void SetMaxSpeed(int newMaxSpeed)
    {
        maxSpeed = newMaxSpeed;
    }

    public int GetMaxSpeed()
    {
        return maxSpeed;
    }

    public void SetHorsepower(int newHorsepower)
    {
        horsepower = newHorsepower;
    }

    public int GetHorsepower()
    {
        return horsepower;
    }

    public static void SetMaxSpeedRequirement(int newMaxSpeedRequirement)
    {
        maxSpeedRequirement = newMaxSpeedRequirement;
    }

    public static int GettMaxSpeedRequirement()
    {
        return maxSpeedRequirement;
    }

    public static void SetHorsepowerRequirement(int newHorsepowerRequirement)
    {
        horsepowerRequirement = newHorsepowerRequirement;
    }

    public static int GetHorsepowerRequirement()
    {
        return horsepowerRequirement;
    }


}






class SportsCarRun
    {
        static void Main()
        {
            SportsCar car1 = new SportsCar();
            SportsCar car2 = new SportsCar();

            //Wywołanie metody static przez nazwę klasy
            SportsCar.SetMaxSpeedRequirement(200);
            SportsCar.SetHorsepowerRequirement(250);

            //Wywołanie metod instacji poprzez nazwę obiektu
            car1.SetMaxSpeed(170);
            car1.SetHorsepower(110);
            car2.SetMaxSpeed(270);
            car2.SetHorsepower(300);

            Console.WriteLine("To znaczy, że mój samochód {0} jest sportowy",
                car1.SportsCheck() ? "" : "nie");
            Console.WriteLine("To znaczy, że mój samochód {0} jest sportowy",
                car2.SportsCheck() ? "" : "nie");

            Console.ReadLine();
        }
    }


 
0
  1. Dlaczego uczysz się C# z książki do Javy?
  2. Co za tym idzie - dlaczego piszesz w C# tak, jakbyś pisał w Javie?
  3. static oznacza statyczne, nie wiem po co tworzyć nowe nazewnictwo, którego nikt nie zna.
  4. Zmienne w klasie nazywa się polami.
  5. Pola statyczne to pola współdzielone przez wszystkie obiekty klasy, jeśli np. w jednym obiekcie zmienisz wartość takiego pola, to wszystkie pozostałe obiekty tej klasy będą korzystały ze zmienionej wartości.
0

Nie uczę się z książki do Javy :/ Nie jestem aż tak ograniczony, żeby uczyć się c# z książki do Javy :/
Znasz wszystkie książki od C# i od Javy? Pewnie nie. To nie oceniaj.

Inaczej napisałbym, że uczę się C# z książki od Javy, bo po co kłamać?

Przy okazji po czym stwierdzasz, że piszę w c# tak jakbym pisał w Javie?! Skoro kod jest prosto z książki od C# przepisany?!

0
D3X napisał(a):

Skoro kod jest prosto z książki od C# przepisany?!

To znaczy, że ta książka jest całkiem do d**y, przedstawiony kod to praktyki typowo javowe, w świecie .NET uznawane za antywzorzec.

0

Dobrze. Ale czy ja przyszedłem po krytykę książki? Poza tym jeśli możecie to róbcie to rzeczowo skoro posiadacie większą wiedzę ode mnie. Uzasadnijcie dlaczego tak jest? Dlaczego ten kod jest zły? Dlaczego widać po nim, że niby pisany jest jak do Javy?

Uzasadnijcie to wszystko i rozpiszcie się bardziej. Bo napisać, że coś jest do du*py i już każdy może napisać.

1

Powiedziałbym, że dobra książka to taka, dzięki której mógłbyś napisać taki kod:

using System.Linq;

namespace SportCars
{
    class Car
    {
        public string Color { get; set; }
        public int TopSpeed { get; set; }
        public int Horsepower { get; set; }

        public Car(string color, int topSpeed, int horsepower)
        {
            Color = color;
            TopSpeed = topSpeed;
            Horsepower = horsepower;
        }
    }

    class Validator<T>
    {
        public List<Func<T, bool>> Requirements { get; set; }

        public Validator(params Func<T, bool>[] requirements)
        {
            Requirements = new List<Func<T, bool>>(requirements);
        }

        public bool Validate(T element)
        {
            return Requirements.All(requirement => requirement(element));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var sportCarValidator = new Validator<Car>(
                car => car.TopSpeed >= 250,
                car => car.Horsepower >= 200
            );

            var cars = new []
            {
                new Car("blue", 300, 190),
                new Car("red", 260, 200)
            };
            
            foreach(var car in cars)
                Console.WriteLine("{0} car {1} a sport car", car.Color, sportCarValidator.Validate(car) ? "is" : "isn't"); 
        }
    }
}
0
D3X napisał(a):

Znasz wszystkie książki od C# i od Javy? Pewnie nie. To nie oceniaj.

Myślę jednak, że siedem lat pisania w C# pozwala mi zarówno określić, czy kod trzyma się zwyczajów języka, jak i oceniać książki.

Przy okazji po czym stwierdzasz, że piszę w c# tak jakbym pisał w Javie?! Skoro kod jest prosto z książki od C# przepisany?!

Tego typu kod, w którym mamy pole, metodę do ustawiania jego wartości oraz metodę do jej pobierania:

private int maxSpeed = 0;

public void SetMaxSpeed(int newMaxSpeed)
{
    maxSpeed = newMaxSpeed;
}

public int GetMaxSpeed()
{
    return maxSpeed;
}

jak najbardziej kojarzy się z Javą. Spójrz tutaj: http://docs.oracle.com/javase/tutorial/java/javaOO/variables.html

W C# nie tworzy się metod z prefiksami get i set (chociaż da się), zamiast tego do operowania na polach służy mechanizm właściwości. Wygląda to tak:

private int maxSpeed = 0;

public int MaxMaxSpeed
{
    get { return this.maxSpeed; }
    set { this.maxSpeed = value; }
}

A jeśli (tak jak powyżej) właściwość poza ustawianiem/pobieraniem wartości pola nic innego nie robi, to wystarczy tak:

public int MaxMaxSpeed { get; set; }

Idąc dalej, SportsCheck powinna być właściwością, nie metodą. Ponieważ niczego nie ustawia, to będzie miała jedynie akcesor get:

public bool SportsCheck
{
    get { return (maxSpeed >= maxSpeedRequirement) && (horsepower >= horsepowerRequirement); }
}

Inaczej napisałbym, że uczę się C# z książki od Javy, bo po co kłamać?

Ja Ci kłamstwa nie zarzucałem.

Mógłbyś zdradzić, jaki tytuł ma ta książka? Bo wygląda to tak, jakby ktoś wziął książkę do Javy i zmienił jej tytuł.

1

Ja się przyczepię do jeszcze jednej rzeczy: dlaczego treści w książce o C# są sprzeczne z oficjalnymi design guidelines Microsoftu?

Somekind napisał już, że SportsCheck powinno być właściwością, a ja bym zmienił jej też nazwę. Jeżeli typ to SportsCar i widzimy jakieś sprawdzanie sportowości albo sportowy czek to powoduje jeszcze większy mętlik w głowie (bo nazwy właściwości powinny być rzeczownikami / przymiotnikami, ale nie czasownikami). Natomiast jak ktoś zobaczy właściwość o nazwie IsValid to od razu będzie wiedział, że SportsCar wcale nie musi spełniać jakiś wymagań. Sam Microsoft stosuje właściwości o takiej właśnie nazwie. Jeżeli ktoś miał styczność z nią wcześniej to jest spora szansa, że przez analogię szybciej zrozumie działanie twojej klasy.

I nie mówi się "max speed" tylko "top speed". MaxMaxSpeed wygląda jeszcze gorzej.

0

Panowie, a czy to nie jest kwestia tego, że jestem w połowie książki i jeszcze nie przerobiłem niczego takiego o czym Wy wspominacie? To get, set itd.
Dlatego kod może jest tak bardziej łopatologicznie pisany?

Kupiłem sobie książkę taką: http://helion.pl/ksiazki/jezyk-c-szkola-programowania-klaus-michelsen,jcshpr.htm miał ktoś?

0

Varran no rozumiem. Po przeczytaniu tej książki w takim razie jaką polecilibyście w następnej kolejności?

I teraz mając już jasność czy możecie bez negowania tego kodu odpowiedzieć na zadane pytania w pierwszym poście?

0

Pierwsza odpowiedź w wątku ( @somekind ) udziela odpowiedzi na twoje pytanie.

0

"Pola statyczne to pola współdzielone przez wszystkie obiekty klasy, jeśli np. w jednym obiekcie zmienisz wartość takiego pola, to wszystkie pozostałe obiekty tej klasy będą korzystały ze zmienionej wartości."
Samą jego definicję rozumiem, którą on napisał. Natomiast DLACZEGO zostało to zastosowane zamiast zmiennej instancji?

1

Miej na uwadze to, że książka wprowadza jakieś dzikie nazewnictwo. To co nazwane jest "zmienną instancji" jest naprawdę statycznym polem klasy. To co nazwane jest "zmienną składową" jest niestatycznym polem klasy (lub krótko - jest polem klasy). Zarówno statyczne jak i niestatyczne pola klasy są jej składowymi, również metody i własności są składowymi klasy.

0

W tym kodzie
private int maxSpeed = 0;
private int horsepower = 0;

Te dwie zmienne są nazwane w treści zadanie zmiennymi instancji. Natomiast dwie następne są zmiennymi składowymi.

public static int maxSpeedRequirement = 0;
public static int horsepowerRequirement = 0;

Czyli zmienna instancji jest niestatycznym polem klasy, a zmienna składowa jest statycznym polem klasy.

Dobra rozumiem już, że nazewnictwo wprowadza tutaj w błąd, natomiast akurat bardziej się uczę samego stosowania tych rzeczy (choć wolałbym jakby były od razu lepsze nazwy).

W każdym razie wciąż nie zmienia to faktu,że nie uzyskałem odpowiedzi i zadam je ponownie tylko już z poprawnymi nazwami.

  1. Dlaczego w tym ćwiczeniu te dwie zmienne są statycznymi polami klasy, a nie zwykłymi polami klasy.
  2. Jaką książkę polecicie po przeczytaniu tej, której mam. Tak bym poznał bardzo dobrze tego c#, bo jak rozumiem moja książka jest dla początkujących.
2
D3X napisał(a):
  1. Dlaczego w tym ćwiczeniu te dwie zmienne są statycznymi polami klasy, a nie zwykłymi polami klasy.
    Każde auto będzie miało swoją własną prędkość maksymalną. Dlatego też jest ona zwykłym (niestatycznym) polem klasy. Natomiast limit prędkości maksymalnej jest wspólny dla wszystkich aut. Dlatego też użyto pola statycznego które będzie współdzielone pomiędzy obiektami.
0

Najlepiej sam macaj po swojemu np tak.

class SportsCarRun
    {
        static void Main()
        {
            SportsCar car1 = new SportsCar();
            SportsCar car2 = new SportsCar();
 
            Console.WriteLine("Wartości pól zaraz po utworzeniu obiektów");
            Console.WriteLine(car1.GetMaxSpeed());
            Console.WriteLine(car1.GetHorsepower());
            Console.WriteLine(car1.maxSpeedRequirement);
            Console.WriteLine(car1.horsepowerRequirement);
            Console.WriteLine(car2.GetMaxSpeed());
            Console.WriteLine(car2.GetHorsepower());
            Console.WriteLine(car2.maxSpeedRequirement);
            Console.WriteLine(car2.horsepowerRequirement);
            

            //Wywołanie metody static przez nazwę klasy
            SportsCar.SetMaxSpeedRequirement(200);            
            SportsCar.SetHorsepowerRequirement(250);

            Console.WriteLine("Wartości pól po ustawieniu pól statycznych");
            Console.WriteLine(car1.GetMaxSpeed());
            Console.WriteLine(car1.GetHorsepower());
            Console.WriteLine(car1.maxSpeedRequirement);
            Console.WriteLine(car1.horsepowerRequirement);
            Console.WriteLine(car2.GetMaxSpeed());
            Console.WriteLine(car2.GetHorsepower());
            Console.WriteLine(car2.maxSpeedRequirement);
            Console.WriteLine(car2.horsepowerRequirement);

 
            //Wywołanie metod instacji poprzez nazwę obiektu
            car1.SetMaxSpeed(170);
            car1.SetHorsepower(110);
            car2.SetMaxSpeed(270);
            car2.SetHorsepower(300);
 

            Console.WriteLine("Wartości pól po ustawieniu pól obiektów");
            Console.WriteLine(car1.GetMaxSpeed());
            Console.WriteLine(car1.GetHorsepower());
            Console.WriteLine(car1.maxSpeedRequirement);
            Console.WriteLine(car1.horsepowerRequirement);
            Console.WriteLine(car2.GetMaxSpeed());
            Console.WriteLine(car2.GetHorsepower());
            Console.WriteLine(car2.maxSpeedRequirement);
            Console.WriteLine(car2.horsepowerRequirement);


            Console.WriteLine("To znaczy, że mój samochód {0} jest sportowy",
                car1.SportsCheck() ? "" : "nie");
            Console.WriteLine("To znaczy, że mój samochód {0} jest sportowy",
                car2.SportsCheck() ? "" : "nie");
 
            Console.ReadLine();
        }
    }

I faktycznie juz zapomnialem ale nie bierz wszystkich określeń z tej ksiązki jako jakiś dogmatów bo faktycznie z tym może byc tam różnie - ale to ze wzgledu na to dla kogo jest adresowana ta ksiazka.

0

No powoli wszystko się dla mnie rozjaśnia. Powoli do celu.

W każdym razie. Jaką książką mam się potem zainteresować? Tak bym nie musiał kupować 10 książek, bo kolejna znów będzie jakąś niedorobiona.
Czy ta pozycja będzie ok?

http://ksiegarnia.pwn.pl/produkt/104381/jezyk-c-2010-i-platforma-net-40.html Czy ta też będzie zła, bo jest od podstaw, a po przeczytaniu tej Szkoły Programowania c# będę już jakieś podstawy znał przecież.

0
D3X napisał(a):

http://ksiegarnia.pwn.pl/produkt/104381/jezyk-c-2010-i-platforma-net-40.html Czy ta też będzie zła, bo jest od podstaw, a po przeczytaniu tej Szkoły Programowania c# będę już jakieś podstawy znał przecież.

Z tego co widzę po spisie treści, to autorowi tej "Szkoły Programowania" udało się w raptem 1000 stron zmieścić materiał, który w normalnej książce zająłby 100, więc jest to swego rodzaju sukces. Ta książka opisuje jedynie składnię języka, czyli tak naprawdę niewiele. Z drugiej strony, gdybym miał zamiar napisać 1000 stron o składni języka, to delegaty i zdarzenia zajęłyby 250, a nie jak u Michelsena 25, bo z tego, co zauważyłem, dla początkujących jest to najtrudniejsze zagadnienie.
W spisie treści nie widzę nic o typach generycznych (kurcze, ale to przecież składnia języka, więc nawet jej autor nie opisał dobrze :/), kolekcjach danych, obsłudze XML, baz danych, nie ma też nic o tworzeniu GUI czy to desktopowego czy webowego.
Jakby nie patrzeć, Troelsen nie ma tych braków i wygląda na to, że jest dużo lepszą pozycją.

0

Zgadza się somekind, tempo akcji w tej książce można porównać chyba tylko do akcji w książce telefonicznej ale tylko dzięki tej książce absolutny nowicjusz, bez żadnej znajomości jakiegokolwiek języka programowania, ma szanse wejsc w programowanie i zajarzyc o co w tym chodzi (i w miarę dobrze wejść w temat).

Następna lektura po niej, w moim przypadku C# i .NET z wydawnictwa core to był dla mnie odlot, w czterech pierwszych rozdziałach (około 200str) Perry zmieścił lekko licząc pięć razy więcej materiału niż jest w tej szkole programowania i tu już od początku było i obiektowo i w WinForms. Dlatego przed Perrym przerobiłem jeszcze:
Wstęp do programowania w C# - Boducha
Visual C# 2005 od podstaw - Matulewskiego
Head First C# i Head First OOA&D

i dopiero kolejna klapka na C# i .NET z core mi się otworzyła.

Każdy ma swoje tempo i styl przyswajania nowej wiedzy - dlatego najlepiej samemu przejsc się do księgarni otworzyc pare ksiązek, przeczytac pare stron, sprawdzic czy taki jezyk pisania trafia i wtedy decydowac sie na kupno a nie tylko po tytule i spisie tresci z internetu.

0

ale to co mam zrobić? Przeczytać to co mam i potem czytać znów to samo?!

No rozumiem, ale jakieś pozycje możecie mi polecić, pójdę do księgarni i zobaczę, która z nich jest stylem pisania dla mnie.

Czy to co podałem w linku w poście wyżej jest dla mnie?

0
D3X napisał(a):

ale to co mam zrobić? Przeczytać to co mam i potem czytać znów to samo?!

No rozumiem, ale jakieś pozycje możecie mi polecić, pójdę do księgarni i zobaczę, która z nich jest stylem pisania dla mnie.

Czy to co podałem w linku w poście wyżej jest dla mnie?

Patrząc po spisie treści: http://www.ibuk.pl/fiszka/34043/jezyk-c-2010-i-platforma-net-40.html to jedynie część pierwsza i druga oraz rozdział 11, czyli ok. 300 stron pokrywa się tematycznie z książką, którą już masz. Pozostałe 1000 stron będzie dla Ciebie nowością, więc chyba warto się tą książką zainteresować. :)
Poza tym, i tak warto przeczytać drugi raz to samo, bo inny autor może wspomnieć o pewnych detalach, o których pierwszy nie wspomniał. Niestety nie ma książek idealnych i zupełnie kompletnych.

0

Straszna demagogia w przykładowym rozdziale tej książki. Inne technologie są opisane tak jakby do niczego się nie nadawały, poznanie ich i zrozumienie jest niemożliwe (sama technologia COM "wymaga miesięcy nauki"), wskaźniki i ręczne zarządzanie pamięci to wina zła na świecie, a niczego, co napisane w Javie (języku) nie da się połączyć z niczym innym.

Ciekawe czy wspomina o sytuacjach, w których to w .NET może dojść do wycieków pamięci. W Javie z resztą też są takie smaczki jak np. wywołanie substring na napisie spowoduje utrzymanie w pamięci większego napisu aż do zwolnienia mniejszego (tak wiem, można wywołać konstruktor, ale ciekawe ile osób o tym wie).

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