Kalkulator BMI

Odpowiedz Nowy wątek
2019-08-08 14:35
0

Probuję stworzyć aplikację kalkulator BMI w React:

Czy dobrze robię?

getBmi(bmi) {
    if(bmi < 18.5) {
        return "Underweight";
    }
    if(bmi >= 18.5 && bmi < 24.9) {
        return "Normal weight";
    }
    if(bmi >= 25 && bmi < 29.9) {
        return "Overweight";
    }
    if(bmi >= 30) {
        return "Obesity";
    }
}
edytowany 1x, ostatnio: cerrato, 2019-08-08 15:22

Pozostało 580 znaków

2019-08-08 23:41
2

Albo tak:

const getBmi = bmi =>
        bmi < 18.5? 'Underweight':
        bmi < 25? 'Normal weight':
        bmi < 30? 'Overweight':
        'Obesity';

:)

Tu warunki są najlepsze, ale to zagnieżdżanie ternary to mam mieszane uczucia - Maciej Cąderek 2019-08-08 23:50

Pozostało 580 znaków

2019-08-09 02:42
0

@Maciej Cąderek: To dobrze, że masz mieszane uczucia bo ta funkcja jest bez sensu :) Powinna sprawdzać czy w ogóle bmi jest liczbą, czy mieści się w zakresie, w przeciwnym wypadku rzucać errorami. Gdy projekt rośnie, a bawimy się takimy funkcyjkami to potem robi się spagetti i jest masakra.

Poglądowo powinno to byc w stylu:

// config.js

const appConfig = {
    bmi: {
        values: [
            {
                name: 'Underweight',
                min: 0,
                max: 18.5,
            },
            {
                name: 'Normal weight',
                min: 18.5,
                max: 25,
            },
            {
                name: 'Overweight',
                min: 25,
                max: 30,
            },
            {
                name: 'Obsesity',
                min: 30,
                max: 10000,
            },
        ]
    }
}

// helpers.js

const isNumber = val => typeof val === 'number' && val === val;

// errors.js

const errors = {
    isNotANumberError: new Error('bmi must be a number type'),
    bmiIsOutOfRangeError: new Error('bmi is out of range'),
}

// getBmi.js

const getBmi = async (bmi) => {
    if (!isNumber(bmi)) {
        throw errors.isNotANumberError;
    }

    const result = appConfig.bmi.values.filter(value => bmi >= value.min && bmi < value.max);

    if (!result.length) {
      throw errors.bmiIsOutOfRangeError;
    }
    return result[0].name;
};

// test.js

(async () => {
    try {
        const result = await getBmi(20);
        console.log(result);
    } catch (e) {
        console.error(e);
    }
})();

To wygląda jak przerost formy nad treścią, ale tylko pozornie ponieważ w dłuższej perspektywie panujemy nad projektem. Oczywiście nie wspominam tu o dalszych rzeczach typu repozytorium, linter, prietter, testy itd. itp.

Chciałem tylko dać do zrozumienia początkującym, żeby w pierwszej kolejności zajęli się nauką podstawowych narzędzi, ściągali sobie skeletony z githuba lub podglądali proste projekty, przede wszystkim nauczyli się korzystać z dokumentacji języka i bibliotek, a potem działali, bo jeśli na początku przyswoją złe nawyki to będzie kiszka w przyszłości.

A piszę tak ponieważ czasem widzę kody niektórych juniorów to włosy się jeżą.
To na tyle :)

edytowany 2x, ostatnio: kult, 2019-08-09 02:45
To jest przerost formy nad treścią. Wystarczyłyby dodatkowe warunki na ujemność, nieliczbowość i dodatnie ale absurdalne wartości, żeby wyrzucić error. Tych ostatnich nota bene tutaj brakuje i system za poprawne uzna BMI na poziomie 1-2. - Freja Draco 2019-08-09 13:20
Chciałem zauważyć, że to był przykład poglądowy, gdzie bmi służyło jako kulawy hello world. Co do nieujemności, absurdalne wartości to raczej powinien zadbać o to oddzielny validator, który i tak skorzysta z wartości z config/env whatever. - kult 2019-08-09 13:36

Pozostało 580 znaków

2019-08-09 08:47
2
kult napisał(a):

@Maciej Cąderek: To dobrze, że masz mieszane uczucia bo ta funkcja jest bez sensu :) Powinna sprawdzać czy w ogóle bmi jest liczbą, czy mieści się w zakresie, w przeciwnym wypadku rzucać errorami. Gdy projekt rośnie, a bawimy się takimy funkcyjkami to potem robi się spagetti i jest masakra.

Zgadzam się, w takich funkcjach w istocie powinno się sprawdzić czy bmi jest liczbą i czy jest "dobrą" liczbą.

Ale.

Szansa że algorytm liczenia BMI się zmieni jest bardzo mała. Wręcz żadna. Prędzej spodziewałbym się przepisania całej aplikacji niż tego że zajdą jakieś zmiany w tej części kodu.

Więc myślę że Twój kod nie jest przerostem formy nad treścią tylko pozornie, ale i dosłownie.


Wcześniej już wspomniałem, że nie chodziło w istocie o bmi. - kult 2019-08-09 13:39

Pozostało 580 znaków

2019-08-09 08:48
2
Haskell napisał(a):

W React programuje się w JS, zatem twierdzenie, że JS nie ma nic wspólnego z Reactem to jakiś mindfuck.

To w takim razie w pytaniu widzę kod z Angulara oraz jquery :D jeszcze się nie zdecydowałem :D


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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