• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Review kodu javascript i optymalizacja

Object Storage Arubacloud
0 głosów
132 wizyt
pytanie zadane 12 lutego w Nasze projekty przez Piotrek2713 Mądrala (5,440 p.)

Witam. Mam już skończony swój timer w javascript i chciałbym prosić o przegląd kodu, opinię, informację na temat ewentualnych poprawek bądź optymalizacji kodu

Kod javascript zamieszczam na forum w bloczku

const timer = document.querySelector('.timer');
const hours = document.querySelector('#timer-hours');
const minutes = document.querySelector('#timer-minutes');
const seconds = document.querySelector('#timer-seconds');
const alarm = new Audio ('timer.mp3');
let countDownIsOn = false;

function formatNumbers(e)
{
    e.preventDefault();
    const span = e.target;
    if (e.code == 'Delete')
    {
        span.textContent == '00';
        return;
    }

    if (/^\d$/.test(e.key))
    {
        const currentValue = span.textContent, inputValue = e.key;

        let newValue = parseInt(currentValue + inputValue);
        if (newValue > 99) newValue = newValue.toString().slice(-2);
        if (newValue > 59) newValue = inputValue;
        span.textContent = ('00' + newValue).slice(-2);
    }
}

function countDown()
{
    if (hours.textContent == 0 && minutes.textContent == 0 && seconds.textContent == 0)
    {
        alarm.play();
    }
    else
    {
        setTimeout('countDown()', 1000);
        hours.setAttribute('contenteditable', 'false');
        minutes.setAttribute('contenteditable', 'false');
        seconds.setAttribute('contenteditable', 'false');
        if (seconds.textContent>0)
        {
            seconds.textContent--;
            if (seconds.textContent < 10)
            {
                seconds.textContent = '0' + seconds.textContent;
            }
        }
        else
        {
            seconds.textContent = 59;
            if (minutes.textContent>0)
            {
                minutes.textContent--;
                if (minutes.textContent < 10)
                {
                    minutes.textContent = '0' + minutes.textContent;
                }
            }
            else
            {
                minutes.textContent = 59;
                if (hours.textContent>0)
                {
                    hours.textContent--;
                    if (hours.textContent < 10)
                    {
                        hours.textContent = '0' + hours.textContent;
                    }
                }
            }
        }
    }
}
timer.addEventListener('keydown', formatNumbers);
window.addEventListener('keydown', (event) => {
    event.preventDefault();
    if (event.key === 'Enter' && countDownIsOn == false)
    {
        countDownIsOn = true;
        countDown();
    }
    else if (event.key === 'Enter' && countDownIsOn == true)
    {
        alarm.pause();
    }
})

A całość na code pen

1 odpowiedź

+1 głos
odpowiedź 12 lutego przez Ehlert Ekspert (212,790 p.)
wybrane 13 lutego przez Piotrek2713
 
Najlepsza
  • Wszystko jest w globalnym scope'ie, do owrapowania.
  • Jest słaba nomenklatura: formatNumbers brzmi jakby przyjmował tablicę floatów/intów i zwracał tablice stringów w odpowiednim formacie. Tymczasem robi bardzo dużo rzeczy. countDown brzmi jak jakaś prosta funkcja, hook, a robi literalnie wszystko. minutes jak widzę w kodzie to zakładam że to number z liczbą minut. Tymczasem u Ciebie to element.
  • Ja kiedy mam umieścić ifa w ifie, to zastanawiam się jak to napisać czytelniej, aby tego uniknąć. U Ciebie są 4 zagnieżdżone ify, kod jest strasznie nieczytelny.
  • Masz niespójne formatowanie kodu, proponuję zainstalować eslinta. W jsie brackety otwierające są raczej w tej linijce, której dotyczą.
  • Jest dość spory problem z architekturą tego. Proponuję oddzielić logikę od widoku. Niech logika w odpowiednich interwałach aktualizuje swój stan. Widok mając dostęp do tego stanu, niech się odświeża po logice. To chyba najbardziej trywialny podział, który umożliwi czytanie tego ze zrozumieniem.
  • Proponuję żebyś wgl porzucił jsa, zdecydowana większość nowych projektów powstaje teraz w Typescriptcie.
komentarz 13 lutego przez Piotrek2713 Mądrala (5,440 p.)
Dzięki za wyczerpującą odpowiedź. Postaram się na to wszystko zwrócić uwagę

Podobne pytania

0 głosów
3 odpowiedzi 342 wizyt
pytanie zadane 18 kwietnia 2018 w JavaScript przez SzukającyPrzygód Bywalec (2,310 p.)
0 głosów
0 odpowiedzi 220 wizyt
pytanie zadane 1 sierpnia 2016 w JavaScript przez MichałGNU Gaduła (4,330 p.)
0 głosów
2 odpowiedzi 204 wizyt

92,619 zapytań

141,468 odpowiedzi

319,786 komentarzy

62,001 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...