Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Elegancki kod., Kod który działa ale jest "brzydki"
saund
post
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 18.08.2013

Ostrzeżenie: (0%)
-----


Hej!

Jestem początkującym programistą JS i korzystam z framewoka jQuery.

  1. function maximumZindex () {
  2. "use strict";
  3. var highestZindex = 0;
  4. frame.contents().find('body *').each(
  5. function zIndexCheck () {
  6. if (isNaN(Number($(this).css("zIndex")))) ; // Do nothing when .css() return "auto"
  7. else if ($(this).css("zIndex")>highestZindex)
  8. highestZindex = $(this).css("zIndex");
  9. })
  10. highestZindex++;
  11. return highestZindex;
  12. };
  13. //v2
  14. function maximumZindex () {
  15. "use strict";
  16. var highestZindex = 0;
  17. frame.contents().find('body *').each(
  18. function zIndexCheck () {
  19. if (!isNaN(Number($(this).css("zIndex")))) {
  20. if($(this).css("zIndex")>highestZindex)
  21. highestZindex = $(this).css("zIndex");
  22. };
  23. })
  24. highestZindex++;
  25. return highestZindex;
  26. };
  27.  


Są dwie wersje tego samego skryptu.
Opis działania: Skrypt wyszukuję największy z-index występujący na stronie w ramce iframe ( $("#frame") = frame ). Pierwszy IF sprawdza czy .css() nie zwraca wartości auto (Nie chcę porównywać "auto" z liczbą a parsowanie "auto" na inta wzraca NaN)jeśli tak to nic nie robi jeśli nie to porównuje do ostatniego największego z-index jakiego napotkał i jeśli jest większy to staje się aktualnym największym z indexem.

Postanowiłem zapytać się znajomego, który jest programistą JS czy kod jest poprawny (pokazałem mu pierwszą wersje) powiedział, że pusty IF nie przejdzie nigdzie więc ok napisałem drugą i powiedział, że kod jest beznadziejny i oprócz tego, że brakuję wywołania wewnętrznej funkcji zIndexCheck() wiem bo tylko tego się od niego dowiedziałem. Zasugerował mi też, że $('body *').each(...) jest za wolny w jaki inny sposób(szybszy) mogę sprawdzić jakie z-index mają wszystkie objekty występujące na stronie.

Co mogę zrobić, żeby ten kod był "elegancki" ?

Ten post edytował saund 18.08.2013, 22:43:29
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
lukasz1985
post
Post #2





Grupa: Zarejestrowani
Postów: 205
Pomógł: 43
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----


Nie nadawałbym nazwy funkcjom anonimowym, wskazuje na to logika i dodatkowo problemy z IE, gdzie ta funkcja może wyciec do zakresu globalnego. Funkcje anonimowe to fragmenty kodu - używane są jako zwykłe instrukcje, więc ich nazywanie jest niespójne z resztą kodu (nie nadajesz nazwy pętli for, while, czy instrukcji if albo switch - poza przypadkiem używania zakładek ale to rzadki przypadek).

Poza tym raczej unikam wstawiania funkcji anonimowych, jeśli nie jest to trywialna funkcja, wtedy definiuję funkcję na zewnątrz zakresu i odwołuję się do jej referencji. Twoja "anonimowa" funkcja zIndexCheck jest trywialna, więc ok.

Jeśli funkcja jest bardziej rozbudowana - to raczej powinna być zaimplementowana w obiekcie - w tym przypadku - przydaje się funkcja "bind" obiektu "Function". Jeśli znajduje się w globalnej przestrzeni nazw, to staje się zbędne ale kod, który nie jest obiektowy może sprawiać problemy.

O wydajności nie mam dużo do powiedzenia - jedyne na co mogę zwrócić uwagę, to tworzenie łańcuchów wywołań. Więcej zmiennych powinno być na stosie, zamiast zmuszać komputer do ciągłego wywoływania metod pobierających. Chodzi o to, że zamiast pisać x razy "cosTam($(this).css("zIndex"))" czy "$(this).css("zIndex") > cosTam" - należałoby przechwycić wartość "$(this).css("zIndex")" do zmiennej i potem jej używać, zamiast za każdym razem ją pobierać. Kod staje się czytelniejszy i bardziej wydajny.

Generalnie napisałbym Twój kod tak:

[JAVASCRIPT] pobierz, plaintext
  1. function maximumZindex ()
  2. {
  3. "use strict";
  4. var highestZindex = 0;
  5. var allElements = frame.contents().find('body *');
  6.  
  7. allElements.each(
  8. function () {
  9. var currentZIndex = $(this).css("zIndex");
  10. if (!isNaN(Number(currentZIndex))) {
  11. if(currentZIndex >highestZindex)
  12. highestZindex = currentZIndex;
  13. };
  14. highestZindex++;
  15. })
  16.  
  17. return highestZindex;
  18. };
[JAVASCRIPT] pobierz, plaintext


Ten post edytował lukasz1985 2.09.2013, 14:12:17
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 10:33