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[...]al/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/jezy[...]ia-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?

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