Blog infomatyka z pasją poświęcony językom komputerowym

Blog infomatyka z pasją poświęcony językom komputerowym
0

@jarekr000000: w kodzie, w którym podałeś jest forEach, więc nie mów, że nie ma pętli. Podobnie są też drabinki ifów, np. https://github.com/javaFunAgain/lagomPong/blob/master/game-api/src/main/java/pl/setblack/pongi/game/impl/Ball.java#L44 (jeszcze przynajmniej jedno coś podobnego znalazłem). Nie żebym się czepiał, ale sam rzuciłeś wyzwanie, żeby przejrzeć repo.

jarekr000000
No właśnie liczy się forEach jako pętla czy nie? (W większości forEache są na Option) A drabinki ifów dokładnie w Ball - jestem z tego mega niezadowolony - na razie nie znalazłem jak je ładniej zapisać - ale kombinuje :-) (Tu wersja z alternatywnego projektu zrobionego pare dni później ( ale nadal nie dobrze ): https://github.com/javaFunAgain/ratpong/blob/master/src/main/java/pl/setblack/pongi/games/api/Ball.java)
krzysiek050
@jarekr000000 forEach to jest ładnie przykryta pętla. Dodatkowo często zwraca voida, którego tak bardzo nie lubisz :)
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:4 minuty
  • Postów:8408
0

to zmienne globalne powodują, że one nie są tworzone kolejny raz przy wywołaniu funkcji

No to tak.

  1. Przecież nic nie cachujesz. Spojrzysz do tego kodu. Za każdym razem przy wywołaniu funkcji tworzysz obiekty:
Kopiuj
function SzerokoscMenu()
{	
	nawigacja=document.getElementById("nawigacja");
	listaMenu=document.getElementsByClassName("menuLink");
	menu=document.getElementById("listaMenu");
	szerokoscNawigacji=nawigacja.clientWidth;

To, że napiszesz sobie var przed funkcją ma takie znaczenie mniej więcej, jak to, że upadła ci jednogroszówka na podłogę jak płaciłeś za kawior w restauracji.

  1. jeśli faktycznie chcesz zrobić to co mówisz, to poczytaj o IIFE. I o domknięciach (closures):
Kopiuj
var abcdef = (function () {
    var zmiennaKtoraBylaGlobalna = document.getElementById('costam');
    return function abcdef() {
     console.log(zmiennaKtoraBylaGlobalna);
    }
})();

tym sposobem unikniesz zmiennych globalnych (co prawda nie jestem purystą, w pewnych ograniczonych sytuacjach uważam, że można je stosować, ale wtedy gdzie faktycznie dzięki temu można osiągnąć jakiś zysk, np. ułatwioną komunikację między różnymi częściami programu przez wystawienie jakiegoś obiektu globalnego. No ale jak zmienna globalna jest tylko fanaberią, wypadkiem przy pracy, to w sumie po co?).

. A listaMenu[i].style jest tylko w for. Jeśli za każdą iteracją miałbym przypisać ją do zmiennej, to bardziej spowolniłoby JS

No nie. JS jest szybkie, komputery są szybkie, dzisiaj takie mikrooptymalizacje zwykle nie mają znaczenia. A JS spowalnia zwykle dostęp do DOM, który robisz i tak, i tak, chociaż cachując przynajmniej style być może nawet zwiększyłbyś szybkość o tyle, żebyś nie musiał pobierać właściwości style z obiektu 3 razy co być może przyśpieszyło by program.

Piszę być może, bo to nie jest sednem - żeby naprawdę sprawdzić czy coś szybciej czy wolniej działa trzeba to sprawdzić praktycznie mierząc czas wykonania (ręcznie, albo patrząc w profilerze, np. tym z Chrome Dev Tools) - natomiast chodziło mi o to, że taki zapis byłby po prostu czytelniejszy.


edytowany 3x, ostatnio: LukeJL
XP
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Postów:152
0

@LukeJL: Wczoraj grzebiąc w sieci, znalazłem artykuł o symulacji statycznych zmiennych w Javascript - jeszcze bardziej się sprawdza niż domknięcia

edytowany 1x, ostatnio: xpeye
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:4 minuty
  • Postów:8408
0

Nie rozumiem. Czy na pewno chodzi o symulację statycznych zmiennych? A nie o prywatnych?

Bo tworzenie statycznych zmiennych to kompletnie nieistniejący problem w JS, więc nie trzeba ich nawet symulować, tylko należy utworzyć zmienną, która będzie statyczna (rozumiem, że masz na myśli statyczność w sensie zmiennych widocznych w metodach obiektów, które jednak będą istniały niezależnie od tworzonych obiektów? No to po prostu trzeba utworzyć jakąś zmienną poza obiektem i już).

Również w JS można bez problemu tworzyć prywatne zmienne (chociażby w domknięciach). To czego nie ma to prywatne właściwości obiektów (i to faktycznie można symulować w różny sposób).

jeśli faktycznie chcesz zrobić to co mówisz, to poczytaj o IIFE. I o domknięciach (closures):

dodałbym do swojej wypowiedzi jeszcze to, że teraz się stosuje zwykle moduły (CommonJS albo moduły z ES6) i IIFE często nie jest nawet potrzebne, żeby się pozbyć zmiennych globalnych (bo zmienne zadeklarowane w module X są widoczne tylko do tego pliku, chyba że moduł sam je wyeksportuje).

Z drugiej strony IIFE jest prostą metodą, którą można zastosować zawsze (a do modułów w przeglądarce potrzebne jest obecnie budowanie przez Webpacka czy Browserify).


edytowany 2x, ostatnio: LukeJL
Zobacz pozostałe 2 komentarze
LukeJL
z drugiej strony akurat w podanych przykładach właściwości te są tworzone w sposób leniwy, dynamiczny, więc w zasadzie w tych przykładach te właściwości wcale nie są takie statyczne (bo właściwość staticVar.counter zostaje utworzona dopiero za pierwszym wykonaniem funkcji staticVar). Więc faktycznie tutaj ktoś utworzył dynamicznie statyczną zmienną, można tak to określić
LukeJL
równie dobrze ktoś mógłby napisać tak: function staticVar() {...coś tam...} a potem w kolejnej linijce staticVar.counter = 1.
XP
Bo w JavaScript nie ma słowa kluczowego static, dlatego nie można ją nazwać statyczną w oczywisty sposób. To rozwiązanie wygląda ciekawie, to zastosowałem
LukeJL
1. przenoszenie zasad z innych języków do JS i próby wrzucenia JSu w nazewnictwo istniejące w innych językach nie ma sensu (dlatego mówię, że statyczne zmienne w JS to kompletnie nieistniejący problem) 2. w JavaScript jest słowo kluczowe static, w klasach ES6. Ale z tego co wiem dotyczy ono tylko metod (tak mi się przynajmniej wydaje, ale by trzeba było sprawdzić dokładnie w specyfikacji).
XP
Na kilku blogach to przeczytałem, więc przetestowałem i zastosowałem u siebie
wujnia
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:161
0

Widze, że wątek strasznie urósł.

Goto bardzo w C się przydaje. Negatywne komentarze, jakoby to wyglądało jak lata 90 etc. można zignorować. jak ktos wierzy w rzeczy totalne w stylu globalne są zawsze złe, czy brednie z czystego kodu żeby nie komentować nic najlepiej. To należy go pozostawić w jego świecie.

Zasadniczo jednak strona internetowa jest bardzo niewygodna w korzystaniu, brak czegoś w rodzaju spisu treści, jest mało przyjazna dla oka i nieprzejrzysta.. Zbytnie skupianie się na podstawach. Wypadałoby by zacząć bardziej oryginalnie. Albo wręcz napisać coś niepopularnego wtedy taki tekst jest interesujący.

Nie powinieneś też bronić się w sposób, że "ale patrzcie tu jest w książce tak". Musisz wiedzieć i mieć swoje zdanie. Ksiązką możesz się podeprzeć ale nie bronić.

Osoba która zaczyna zawsze ma problem z pomysłem na program. Jezeli jesteś w stanie wymyslić oryginalne pomysły przy okazji dostarczyć wiedzę potrzebną do napisania programu. To już wygrałeś, reszta może być nawet z błedam etc, [ok drobnymi błędami ;]

edytowany 2x, ostatnio: wujnia
XP
Lista tematów jest i mam swoje zdanie - już cztery strony je bronie
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
3

jak ktos wierzy w rzeczy totalne w stylu globalne są zawsze złe, czy brednie z czystego kodu żeby nie komentować nic najlepiej

Oh dear.

Albo wręcz napisać coś niepopularnego wtedy taki tekst jest interesujący.

Nooooo na przykład to, że goto ma jakieś sensowne uzasadnienie w kodzie? ;-D


lion137
  • Rejestracja:około 8 lat
  • Ostatnio:2 minuty
  • Postów:4891
0
wujnia napisał(a):

Goto bardzo w C się przydaje. Negatywne komentarze, jakoby to wyglądało jak lata 90 etc. można zignorować. jak ktos wierzy w rzeczy totalne w stylu globalne są zawsze złe, czy brednie z czystego kodu żeby nie komentować nic najlepiej. To należy go pozostawić w jego świecie.

Może sie przydaje w jakiś małych programach; bo mając duży program, pełno instruckcji sterujących i imperatywnych zmiennych, które przyprawiją cię o ból głowy, dodawanie sobie jeszcze goto, to czyste szaleństwo. Osobiście goto mi przypomina polibudę i Fortran, acha no i Basic:)


Zobacz pozostałe 8 komentarzy
Sarrus
Jak w bardziej elegancki sposób wyjść z zagnieżdżonych pętli (jeżeli już się takie ma)? Opakować to w funkcję i zrobić return.
kaczus
nie robic takich, bo poźniej są klopoty. A jesli trzeba, to mozna to bardziej elegancko zrobić, choćby przez głupia zmienną, jest przynajmniej czytelne i widoczne miejsce, nie wyskakujesz nagle w nieznane pozostawiając niepodomykane różne "rzeczy" Bo jesli juz masz zagmatwany kod, to podejrzewam, że może się w nim już dużo dziac "orzy okazji" wtedy właśnie takie skróty prowadza do katastrofy
wujnia
Nie robić pętli, hehe nie używaj goto bo są kłopoty bo ktoś kiedyś popełnił błąd. ;-) Goto nic nie psuje, jezeli już ktoś czegoś poprawnie nie potrafi to Kolega wykorzystać narzędzi które dostaje. Optymalizacja nie jest zawsze najwazniejsza. Nie jest też najwazniejsze rozpaczliwe trzymanie się regułek. Nie potrafi Kolega napisać przejrzystego/dobrego kodu używając goto? To niech kolega nie użwa i ok. Nikt nie będzie miał pretensji.
kaczus
widzę, że nie tylko Twoje umiejętności programistyczne sa słabe, ale i umiejętność czytania ze zrozumioeniem nie robić mocno zagnieżdżonych pętli. A z petli standardowo się wychodzi, gdy warunek stopu ma odpowiednią wartość - taka darmowa lekcja - może Ci sie przyda, choć przy takim podejści wolałbym nie musiec mieć doczynienia z Twoim kodem, ani jako gotowego produktu, ani czegoś do rozwijania/poprawiania...
wujnia
Dziękuję za lekcję Panie Psorze. Ale, że należy robić t y l k o tak jak sobie Pan Psor wymyślił to już zdążyłem zauważyć na początku.
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:dzień
  • Lokalizacja:Łódź
  • Postów:1402
3
xpeye napisał(a):

Tyle pisaliście o goto, że zamieszczam Wam skan z książki - może wtedy uwierzycie. A drugi jest o typie char - tam słowo "znaków" naprawdę istnieje. Jeśli chodzi o responsywne menu, to napisałem w pierwszym zdaniu, że sam CSS, przedstawiony wpis wcześniej, nie wystarczy i wyjaśniłem dlaczego
Za używanie goto w kodzie produkcyjnym (jak również return poza początkiem kodu funkcji, lub na jej końcu, powinno się mocno połapkach trzaskać. Przykład z kodu któray poprawiałem:
Jeden programista napisał dość niechlujnie kod (dlatego użył return, ale zasada działania ta sama). Konstrukcja standardowa

Kopiuj
 funkcja
  zagnieżdzone warunki i pętla
 w jednym miejscu nagle występuje return w funkcji
dalsza część funkcji
return konczący

okazało się, że kod wykorzystywany w urządzeniu potrzebował w jednym z tych warunków dostępu do zasobu współdzielonego, totez kolejny programista wstawił semafor. Niestety nie zauważył tego returna... Ponieważ akurat waunek, kiedy return ze środka był wołany był rzadko, toteż trudno wyłapywalny błąd. Obserwowano tylko dziwne zachowanie systemu, raz na jakis czas watchdog wywalał program. Czyli sytuacja, gdzie dopiero review kodu pozwoliła znaleźć przyczynę, ponieważ zdarzało się to rzadko i w losowych przypadkach.

Dlatego - używanie goto, returna do wychodzenia z bardzo zagłębionych pętli i warunków, to zła metoda programowania. Tego należy oduczać.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
kq
Ogółem tak, ale w C++ mając RAII to już mniej prawdziwe. Chociaż przyznam, że bardzo bym chciał coś w stylu break(2).
vpiotr
Break do labelki w javie to całkiem znośna konstrukcja - jak już się zapamięta jak działa. Gdyby było to w C to byłoby to myślę przyjemniejsze niż goto. A wiele instrukcji return też unikam, ale już nawet nie pamiętam dlaczego. Chyba dlatego że mi brakuje postconditions w językach w których pracuję... http://www.adacore.com/adaanswers/gems/gem-31/
XP
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Postów:152
0

Nie napisałem o goto, aby ludzie tę instrukcję nadmiernie wykorzystywali, tylko po to, aby czytelnik wiedział, że ona istnieje i w jakich sytuacjach dopuszczone jest skorzystanie z niej. Zresztą na początku tego wpisu zawarłem informację, że korzystanie z niej świadczy o złym stylu i braku odpowiedniej wiedzy programisty

kaczus
korzystanie z goto dopuszczalne jest tylko na starych procesorach do mikrooptymalizacji, używanie tego przy nowych to tylko psucie kodu.
XP
To blog na razie głównie o C a goto w nim istnieje, więc je opisałem, odradzając korzystanie z tej instrukcji
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)