Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Co możnaby poprawic w tym kodzie
Forum PHP.pl > Forum > Przedszkole
Matt23
Witam, załączam live demo razem z kodem i proszę o sugestie co powinienem poprawić aby kod ten był napisany właściwie i zgodnie z dzisiejszymi trendami. Jeśli wypadałoby napisać to obiektowo prosiłbym o wskazanie mi jakie klasy powinienem stworzyć, gdyż nie "czuję bluesa" w obiektówce.

http://jsfiddle.net/xj7vkkgo/

Aha, wiem że można wszystko zrobić w 3 linijakch z gatDay(); ale jest to interpretacja pewnego algorytmu...
PrinceOfPersia
1. nie ma żadnej walidacji, można wpisywać liczby na minusie, oraz słowa/nie tylko cyfry (ale to bardziej kwestia interfejsu niż kodu jako takiego).

[JAVASCRIPT] pobierz, plaintext
  1. var monthNum = [6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4];
[JAVASCRIPT] pobierz, plaintext

2. co to znaczy monthNum? Ta tablica z numerami jest niejasna, przydałby się jakiś komentarz. No i ogólnie, może to jakiś algorytm, ale jak się patrzy na te cyferki, to nie wiadomo o co chodzi. Skąd 6? Skąd 2? itp.

[JAVASCRIPT] pobierz, plaintext
  1. if (year >= 1700 && year < 1800) {
  2. spec = 5;
  3. }
[JAVASCRIPT] pobierz, plaintext

tak samo. Skąd 5?
Jakieś komentarze by się przydały, jak działa ten algorytm, co te zmienne oznaczają. Albo przynajmniej link w komentarzu na zasadzie
[JAVASCRIPT] pobierz, plaintext
  1. // implementation of SomeFancyName algorithm (more: en.wikipedia.org/wiki/Some_Fancy_Algorithm )
[JAVASCRIPT] pobierz, plaintext

W każdym razie przydałaby się jakaś wskazówka dla innych programistów, którzy będą to kiedyś przeglądać, bo inaczej w realnej sytuacji ten kod byłby ciężki do utrzymania.
Matt23
Ogólnie to cały czas 'ogarniam' javascript i tworzę sobie rózne takie programy w celu samodoskonalenia i do użytku prywatnego, wiec o komentarze nie dbam.

Ta tablica z liczbami to cyfry odpowiadające poszczególnym miesiącom celem prawidłowych obliczeń.
Blok ifów to znowu odpowiednia liczba do obliczeń dla odpowiedniego zakresu dat.

Algorytm pochodzi z książki, ale jeśli znajdę go gdzieś w internecie, to wszystko opiszę, jeśli faktycznie komuś może się to przydać.
A przy okazji, ten algorytm jest stosunkowo prosty do zapamiętania (z wyjątkiem numerów miesięcy) i przy odrobinie praktyki można szybko obliczyć dzień w głowie.

Aha, walidacja, to fakt, ale jak wspomniałem, to tylko forma ćwiczeń dla mnie więc detale zostawiam sobie na później, a poza tym, to dosyć logiczne że data nie może być ujemna, itp.

Oczekiwałbym bardziej wskazówek co do poprawnego zapisu całości, bo wiem, że można to napisać lepiej - nie wiem tylko co konkretnie.
Forti
Cytat
co to znaczy monthNum? Ta tablica z numerami jest niejasna, przydałby się jakiś komentarz.


Komentarze to zło wink.gif można to załątwić zmieniając nazwę tablicy lub poprzez refactoring całkowity, który się tu przyda.

[JAVASCRIPT] pobierz, plaintext
  1. var monthNum = [6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]; //odpowiednie wartości dla każdego miesiąca
[JAVASCRIPT] pobierz, plaintext


monthNum - odpowiednie wartości dla miesięcy.. spoko wink.gif

Raz masz 'month_spell' a raz 'monthNum' - brak konsekwencji w nazewnictwie. Człowiek ma bardzo potężne umiejętności nazewnictwa czegokolwiek. Korzystajmy z tego smile.gif Nie bójmy się nazywać zmiennie dłuższe jak 1-2 wyrazy.



Cytat
Jeśli wypadałoby napisać to obiektowo prosiłbym o wskazanie mi jakie klasy powinienem stworzyć, gdyż nie "czuję bluesa" w obiektówce.


Zaskoczę Cię. Javascript nie jest językiem obiektowym wink.gif - zaraz polecą na mnie pewnie fale krytyki.

edit: albo inaczej.. javascript nie musi być pisany "obiektowo" przy takich skryptach.
tzm
Cytat(Forti @ 24.01.2015, 06:59:56 ) *
Zaskoczę Cię. Javascript nie jest językiem obiektowym wink.gif - zaraz polecą na mnie pewnie fale krytyki.

edit: albo inaczej.. javascript nie musi być pisany "obiektowo" przy takich skryptach.


dobrze że się poprawiłeś facepalmxd.gif

cały ten kod jest do poprawy wypieprzenia i napisania tego jak trzeba. toż to pseudokod ..
PrinceOfPersia
Cytat(Forti @ 24.01.2015, 06:59:56 ) *
Komentarze to zło wink.gif można to załątwić zmieniając nazwę tablicy lub poprzez refactoring całkowity, który się tu przyda.

też tak uważam (lepiej pisać kod jasny, który nie wymaga komentarzy), ale czasem komentarz się przydaje, szczególnie przy implementacji różnych algorytmów.

Cytat
Zaskoczę Cię. Javascript nie jest językiem obiektowym wink.gif - zaraz polecą na mnie pewnie fale krytyki.

JavaScript podobnie jak C++ czy Python jest językiem wieloparadygmatowym wink.gif

Cytat
jakie klasy powinienem stworzyć, gdyż nie "czuję bluesa" w obiektówce.

opakowanie tego w "klasy" nie miałoby większego sensu (pomijając już to, że w JavaScript nie ma klas, tylko jest dziedziczenie po prototypach).

Swoją drogą:
Cytat
exit();

w JS się wychodzi za pomocą instrukcji return, a nie za pomocą funkcji exit().

Kod
var yearEnd = Number(String(year).substring(2, 4)); //końcówka roku

po co tak dziwnie? Skoro możesz tak:
Kod
var yearEnd = year % 100;

i osiągniesz to samo...

Kod
insert(result);

w ten sposób uzależniasz się od istnienia funkcji "insert", więc jak będziesz przenosił kod tej funkcji do innego pliku, będziesz musiał przenieść również funkcję insert (a jeśli zapomnisz, będziesz miał błąd). A przecież co robi twoja funkcja? Bierze jakieś parametry, oblicza coś i zwraca wartość. Możesz zrobić coś takiego (wszędzie gdzie masz insert:
Kod
if (typeof (result) !== 'undefined') {
    return day + ' ' + spell + ' ' + year + ' roku' + ' to ' + result;
} else {
    return '';
}

a funkcję insert wywoływać "poziom wyżej":
Kod
insert(getDay(d, m, y));


Kod
var mnth = monthValue[month - 1]; //numer odpowiadający danemu miesiącowi w tablicy

zle nazwana zmienna. nic nie mówi i będzie się mylić z month.



I komentarze. Pisałem, że brakuje mi komentarzy, ale nie miałem na myśli, żebyś je wstawiał bez namysłu w losowych miejscach:

Cytat
//odpowiednie wartości dla każdego miesiąca

ten komentarz absolutnie nic nie tłumaczy. To, że to są odpowiednie wartości dla każdego miesiąca wiadomo, bo zmienna się nazywa monthValue. Komentarz raczej powinien wyjaśniac co oznaczają te wartości, skąd się to wzięło. Liczbę tygodni? Numer dnia tygodnia, od którego się zaczyna dany miesiąc? jakąś inną magiczną wartość?

Idealnie, gdyby dało się samą zmienną nazwać w ten sposób, że komentarz będzie zbędny.

Kod
   var yearCode = spec + Math.floor(yearEnd / 4) + yearEnd; //końcówkę dzielimy przez 4, zaokrąglamy do całości i dodajemy końcówkę roku

To też jest zły komentarz. Komentarze służą do tego, żeby wyjaśniać to co jest niejasne, a nie po to, żeby opisywały to, co i tak widać gołym okiem (w książce "Czysty Kod" Martina fajnie jest to opisane).

Kod
var result = check % 7; //reszta z / 7

facepalmxd.gif komentarz "reszta z / 7" to wygląda tak jakby komentarze były dla laików, którzy nie wiedzą, że znaczek procenta oznacza liczbę z dzielenia... (no i komentarze się pisze po angielsku w normalnych sytuacjach, bo programistów na świecie, którzy znają język polski jest garstka... (a nigdy nie wiadomo z kim bedziesz pracować/komu będziesz pokazywać później kod, który piszesz).

ale co oznacza 7? Liczbę dni w tygodniu?
Może lepiej coś takiego zrobić:

[JAVASCRIPT] pobierz, plaintext
  1. var daysInWeek = 7
  2. ...
  3. var result = check % daysInWeek
[JAVASCRIPT] pobierz, plaintext


jesli moja intuicja jest tutaj dobra.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.