Podział na klasy/prototypy/obiekty ćwiczeń użytkownika

0

Witam. Jak mielibyście napisać taki skrypt aplikację która przechowuje/wyświetla informację na temat treningów użytkownika, jakbyś cię się za to zabrali. Chodzi mi o podział na klasy/prototypy/obiekty. Załóżmy, że mam użytkownika, ten użytkownika ma jakieś treningi np. pompki,przysiady,bieganie,rower. Informacje to, od kiedy rozpoczął dany trening np. pompki od 02.08.2018, bieganie od 04.08.2018, przysiady od 08.08.2018. Kolejne informację, że tak to nazwę dzienne czyli to ile pompek zrobił danego dnia, ile km przejechał na rowerze np.pompki 03.08.2018 - 20 pompek, rower 03.03.2018 - 5km itd. Jak to ładnie ubrać w obiekty klasy.

function User(name, password){
    this.name = name;
    this.training = new Training();
};
function Training(){
    this.pushUp = new PushUp();
    this.squats = new Squats();
    this.running = new Running();
    this.bicycle = new Bicycle();
}
function PushUp(){
    this.startDate = new Date();
    this.Days = [];
    this.addDay = function(){
        this.days.push(new Day());
}
function Squats(){
    this.startDate = new Date();
    this.Days = [];
    this.addDay = function(){
        this.days.push(new Day());
}
function Running(){
    this.startDate = new Date();
    this.Days = [];
    this.addDay = function(){
        this.days.push(new Day());
}
function Bicycle(){
    this.startDate = new Date();
    this.Days = [];
    this.addDay = function(){
        this.days.push(new Day());
    };
}
function Day(){
    /// i tu właśnie ma problem nie wiem jak się za to zabrać
    /// tu powinny być danę, typu Ilość Pompek, Ilość Kilometrów, Ilość Przysiadów
    /// ale dane te będą miały różny format w zależności od ćwiczenia
}

Dobrze, to myślę do tej pory czy zupełnie nie tak. Ktoś jest w stanie i ma chęci mi cokolwiek podpowiedzieć ?
Pozdrawiam.

1

Widzisz, że 3/4 Twoich funkcji to kopiuj-wklej, prawda?
Podejdź do tego tak, jak gdyby lista możliwych ćwiczeń była modyfikowalna z jakiegoś panelu administracyjnego.

PS poczytaj o es6 classes.

0
Patryk27 napisał(a):

Widzisz, że 3/4 Twoich funkcji to kopiuj-wklej, prawda?
Podejdź do tego tak, jak gdyby lista możliwych ćwiczeń była modyfikowalna z jakiegoś panelu administracyjnego.

PS poczytaj o es6 classes.

Dzięki !. Masz rację poprzedni kod był bez sensu. Zastosowałem się do twojej sugestii. Poczytam o tych klasach w ES6. Teraz mam coś takiego:

function User(name){
    this.name = name;
    this.trainings = new Trainings();
};
function Trainings(){
    this.training = [];
    this.addtrainig = function(trainingName){
        this.training.push(new Training(trainingName));
    };
};
function Training(trainingName){
    this.name = trainingName;
    this.startDate = new Date();
    this.Days = [];
    this.addDay = function(){
        this.days.push(new Day());
    }
}
function Day(){
    /// i tu właśnie ma problem nie wiem jak się za to zabrać
    /// tu powinny być danę, typu Ilość Pompek, Ilość Kilometrów, Ilość Przysiadów
    /// ale dane te będą miały różny format w zależności od ćwiczenia
}

//dodawanie ćwiczenia
const user = new User('test');
user.trainings.addtrainig('pompki');

Mniej więcej o to, Ci chodził, czy miałeś coś innego na myśli ?. A coś do tych dni mógł byś jeszcze podpowiedzieć.

1

nie podoba mi się, że to obiekt tworzy sobie sam datę.

 this.startDate = new Date();

A co jeśli będziesz chciał utworzyć obiekt z datą wsteczną (albo przyszłą)? Bardziej elegancko byłoby coś takiego zrobić:

function Training(trainingName,date){
    this.startDate = date;
    // ....
}
addtrainig 

przyjęta w JS konwencja camelCase zakłada, że powinno być to addTraining a nie addtraining, a już na pewno nie addtrainig z literówką.
Owszem, można nie przestrzegać żadnych konwencji i pisać fristajlem, ale wtedy kod będzie ciężko utrzymywać.

A poza tym to mam wrażenie, że za wcześnie próbujesz obudować abstrakcję. Tyle zastanawiania się Jak to ładnie ubrać w obiekty klasy. a próbowałeś w ogóle napisać to brzydko i nie ubierać w klasy, prototypy a działać na zwykłych obiektach? Tj.traktować obiekty jako zwykłe pojemniki na dane, bez większych abstrakcji czy prób pisania "obiektowo". Ew. zrobić jakieś tam klasy "na próbę", ale większego przywiązania do ostatecznego kształtu.

Najlepiej zaczyna się od jednej rzeczy, a potem dobudowuje się do niej kolejne. Podczas tego procesu się przerabia (refaktoryzuje) kod albo ew. wyrzuca cały napisany kod i pisze od nowa (chodzi o proces twórczy, tak samo jak rysownik może wyrzucać nieudane szkice).

Załóżmy, że mam użytkownika, ten użytkownika ma jakieś treningi np. pompki,przysiady,bieganie,rower. Informacje to,
od kiedy rozpoczął dany trening np. pompki od 02.08.2018, bieganie od 04.08.2018, przysiady od 08.08.2018.
Kolejne informację, że tak to nazwę dzienne czyli to ile pompek zrobił danego dnia, ile km przejechał na rowerze np.pompki
03.08.2018 - 20 pompek, rower 03.03.2018 - 5km itd. Jak to ładnie ubrać w obiekty klasy.

tu powinny być danę, typu Ilość Pompek, Ilość Kilometrów, Ilość Przysiadów
/// ale dane te będą miały różny format w zależności od ćwiczenia

Trochę za dużo. Lepiej założyć na początku, że użytkownik może tylko biegać, i mierzy się to w kilometrach i tylko w zakresie jednego dnia (KISS )

Tylko, że warto też żeby program faktycznie coś robił. Bo klasy dla zabawy to można sobie w szkole pisać. Więc np. tworzysz jakiś interfejs (może być konsolowy) i próbujesz obudować wokół tego swój kod, żeby aplikacja miała wartość "biznesową" czyli żeby użytkownik mógł faktycznie dodawać czy edytować dane. Dzięki temu twoje pisanie zaczyna mieć jakikolwiek kontakt z rzeczywistością.

Więc robisz program, który pozwala tylko biegać, mierzy w kilometrach i w zakresie jednego dnia. A potem dorabiasz opcję np. wyboru sportu, albo dodajesz opcję wielu dni. Być może na tym etapie będziesz musiał przerobić kod albo napisać od nowa, ale to normalny proces. Bo może np. twój pierwszy szkic okaże się za mało elastyczny. Albo za bardzo przekombinowany. Albo doznasz olśnienia i zobaczysz jak można zrobić coś prościej.

Nie mówię, żebyś nie próbował tego ładnie ułożyć w tego klasy/prototypy czy dodać ładne fabryki czy metody. Raczej chodzi mi o to, że jeśli dopiero jesteś w fazie researchu i nie wiesz, jak to zrobić, to i tak zrobisz to suboptymalnie. Co najwyżej możesz się pewnych błędów ustrzec (choćby duplikacji kodu, którą miałeś w pierwszym poście).

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