Animal cat = new Animal("meow", Legs4, Eyes2); //dla ułatwienia podaję enumy, mogłyby to być zwykłe liczby
Animal spider = new Animal("I will kill you", Legs8, Eyes8);
przecież możesz zastosować fabrykę i zrobić cat = createCat()
zamiast klasy, i fabryka by ustawiała domyślne parametry.
I są projekty, gdzie inaczej się nie da. Bo za chwile okaże się, że trzeba gdzieś coś rozgraniczyć.
Np. nagle trzeba narysować wygląd zwierzęcia. I owszem, można dodać nowy parametr do konstruktora,
w którym przekażemy odpowiedni obrazek, ale to już się nieco kopie z ideą programowania obiektowego.
Zależy co robisz. Jeśli robisz prostą małą gierkę, gdzie każdy kot wygląda identycznie, robi tak samo miał, ma taki sam kolor, to pewnie, możesz nie podawać żadnych parametrów, tylko pisać new Cat
. Ale jeśli masz cokolwiek większego to i tak będziesz musiał podać te parametry, np. załóżmy, że robisz bardziej realistyczną symulację i do każdego tworzona kota będziesz podawał losowy kolor, losową wielkość, losową masę w kilogramach, losowe umiejętności (np. umiejętność dobrego łapania myszy), losowe choroby, losową lokację itp.
Więc i tak nie będzie to new Cat
a new Cat(color, size, mass, skills, diseases, location)
oczywiście podawanie zbyt wielu parametrów do konstruktora jest brzydkie, więc pewnie będziesz to robił inaczej jakoś - może będziesz ustawiał później kolejne właściwości po kolei, może załadujesz hurtem parametry z pliku tekstowego itp. W każdym razie odpada argument o tym, że new Cat
jest ładniejsze, bo jest ładniejsze dopóki nie robisz nic złożonego.
Swoją drogą wydaje mi się, że wpisywanie danych domyślnych do klas jest nadużyciem mechanizmu klas i takie rzeczy ładniej byłoby rozwiązać przez jakieś fabryki, mixiny czy coś takiego (w końcu klasy mają niby zachowanie dziedziczyć, a nie po prostu ustawiać parametry?). Nie wiem jak w Javie, ale w JS by się to łatwo rozwiązało w ten sposób np.
function createCat(params) {
const defaultParams = {legs: 4, eyes: 2, voice: 'meow'};
// tworzy nowy obiekt i wrzuca do niego najpierw `defaultParams`,
// a potem nadpisuje za pomoca `params` tymi parametrami, ktore są tam obecne
return Object.assign({}, defaultParams, params);
}
const cat = createCat({voice: 'jestem kotem, który gada'})