Przejrzyste pisanie kodu

Przejrzyste pisanie kodu
LB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:427
0

Witam

Chciałbym się dowiedzieć czy kod prawidłowo powinien wyglądać tak

Kopiuj
var Sprzedaz = "Toyota";

function TypyAut(nazwa) {
   if(nazwa == "Polonez")
      return nazwa;
   else
      return "Przykro nam, ale nie sprzedajemy marki " + nazwa + ".";
}

czy może tak

Kopiuj

var Sprzedaz = "Toyota";

function TypyAut(nazwa) { {
   if(nazwa == "Polonez") }
      return nazwa; {
   } else
      return "Przykro nam, ale nie sprzedajemy marki " + nazwa + ".";
}

Bo w pętlach for nawias "{" pojawia się dość często

Kopiuj
    for (var x=1; x<=10; x++) {
        var tekst = x*y; //tworzymy tekst do wstawienia do komórki

        if (y==1 || x==1) {  //jeżeli jest to pierwsza komórka w pionie lub poziomie
            var td = '<th>'+tekst+'</th>'; //stwórz nowe th
        } else {
            var td = '<td>'+tekst+'</td>'; //stwórz nowe td
       }
edytowany 5x, ostatnio: LynxBings
ekhart
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:ekhart.pl
  • Postów:140
0

Wybierz któryś styl i się go spójnie w całym projekcie trzymaj

Wg mnie K&R best w tym przypadku

Kopiuj
var sprzedaz = "Toyota";

function TypyAut(nazwa) {
	if (nazwa == "Polonez") {
		return nazwa;
	} else {
		return "Przykro nam, ale nie sprzedajemy marki " + nazwa + ".";
	}
}

edytowany 1x, ostatnio: ekhart
axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Warszawa
  • Postów:2251
2

@ekhart - Wg mnie zachęcasz do złej praktyki. Dlaczego? Bo tylko zwiększa się szansę na to że ktoś zechcę coś dopisać po ifie i dostanie błąd. Dopisanie tych klamerek nawet przy pojedynczej instrukcji (np w ifie) daje o tyle fajną możliwość - że w przypadku np javascriptu, można tam na szybko sobie machnąć console.log'a albo de facto inne instrukcje (!debug-mode).

Brak klamerek dla mnie nic nie daje, trudniej coś dopisać - bo i trzeba klamerki znowu dodawać, zmniejsza ryzyko błędów oraz nie stanowi jakiegoś strasznie nadmiarowego zwiększenia objętości pliku z takimi skryptami.
EDIT:
ooo widzę że jednak polecasz klamerki - prawidłowo. Dodatkowo istnieje jeszcze wojna pomiędzy

Kopiuj
if(warunek){
    costam();
}

a

Kopiuj
if(warunek)
{
    costam();
}
Ale to już temat na inna bajkę ;)
edytowany 3x, ostatnio: axelbest
Zobacz pozostałe 3 komentarze
Maciej Cąderek
Maciej Cąderek
E, na dwóch spacjach więcej zagnieżdżonych ifów się mieści na ekranie :P
LukeJL
i to jest właśnie argument za 4 spacjami ;)
czysteskarpety
czysteskarpety
ja dwie czasami robię w html, nawet fajnie wygląda, w js w sumie bez sensu faktycznie, a klamerki pierwsze oczywiście
LukeJL
2 spacje w CSS jeszcze są okej.
czysteskarpety
czysteskarpety
a tak a propos, jakieś dobre narzędzie do minifikowania css?
LB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:427
0
axelbest napisał(a):

@ekhart - Wg mnie zachęcasz do złej praktyki. Dlaczego? Bo tylko zwiększa się szansę na to że ktoś zechcę coś dopisać po ifie i dostanie błąd. Dopisanie tych klamerek nawet przy pojedynczej instrukcji (np w ifie) daje o tyle fajną możliwość - że w przypadku np javascriptu, można tam na szybko sobie machnąć console.log'a albo de facto inne instrukcje (!debug-mode).

Brak klamerek dla mnie nic nie daje, trudniej coś dopisać - bo i trzeba klamerki znowu dodawać, zmniejsza ryzyko błędów oraz nie stanowi jakiegoś strasznie nadmiarowego zwiększenia objętości pliku z takimi skryptami.
EDIT:
ooo widzę że jednak polecasz klamerki - prawidłowo. Dodatkowo istnieje jeszcze wojna pomiędzy

Kopiuj
if(warunek){
    costam();
}

a

Kopiuj
if(warunek)
{
    costam();
}
Ale to już temat na inna bajkę ;)

Dzięki za odpowiedź. Ale te dodatkowe klamerki dla javascriptu coś oznaczają czy to jest dla samego programisty?

axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Warszawa
  • Postów:2251
1

@LynxBings: oznaczają - tak jak chyba we wszystkich językach które zawierają klamerki (python ich nie ma). Oznaczają blok kodu. Wiadomo że przy pojedynczej instrukcji nie są potrzebne, ale koszt dodania jest niski, a mamy same zyski.

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
3

A może:

Kopiuj
function TypyAut(nazwa) { // zmień nazwę funkcji, bo nic nie mówi
    if (nazwa !== 'Polonez') {
        return "Przykro nam, ale nie sprzedajemy marki " + nazwa + ".";
    }

    return nazwa;
}

wtedy masz -1 zagnieżdżenie dla właściwego przebiegu sterowania, a nie musisz przewijać na sam koniec funkcji, żeby zobaczyć co się stanie jak to jednak nie polonez.

edytowany 1x, ostatnio: Desu
axelbest
To jest bardzo dobre podejście :) Popieram.
Maciej Cąderek
Maciej Cąderek
Swoją drogą, ta funkcja jest raczej bez sensu, bo co - przypisze gość wartość do zmiennej i potem będzie ifował, żeby coś z tym zrobić? :D :D :D Taki "walidator" to powinien boola zwracać, np: const czyMarkaJestDostępna = nazwa => nazwa.trim().toLowerCase() !== 'polonez', ale rozumiem, że to tylko przykład. W każdym razie takie guardy na początku są super (w tym przypadku też ternary ujdzie).
LB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:427
0
axelbest napisał(a):

@LynxBings: oznaczają - tak jak chyba we wszystkich językach które zawierają klamerki (python ich nie ma). Oznaczają blok kodu. Wiadomo że przy pojedynczej instrukcji nie są potrzebne, ale koszt dodania jest niski, a mamy same zyski.

Czyli w praktyce

Kopiuj
else {
        return "Przykro nam, ale nie sprzedajemy marki " + nazwa + ".";
    }

Klamerki ograniczają kod żeby był wykonany w ramach przykładowego else?

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
1

@LynxBings: tak. Jak masz po if/else pojedyńcze wyrażenie to teoretycznie nie trzeba ich pisać, ale dobrą praktyką jest jednak ich dodawanie.

Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
0

Ogólnie to polecam się nie zastanawiać i zainstalować linter (ESLint) z jednym z tych style guidów:

axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Warszawa
  • Postów:2251
1
Kopiuj
<!DOCTYPE html>
<html>
    <head>
        <script>
            function isCarForSale(name) {
                var carsNotForSale = ['polonez'];

                return carsNotForSale.indexOf(name.trim().toLowerCase()) < 0;
            }

            function showTestMessage() {
                var msg = isCarForSale('Polonez2') ? 'Ok, można sprzedawać' : 'Nie można sprzedawać';

                alert(msg);
            }
        </script>
    </head>
    <body>
        <button onclick="showTestMessage()">Test</button>
    </body>
</html>

To tak jako przykład do komentarza @Maciej Cąderek Oczywiście można to rozwinąć o wiele bardziej (walidacje typów itp itd)

edytowany 1x, ostatnio: axelbest
Maciej Cąderek
Maciej Cąderek
Jeszcze zamiast Array.prototype.indexOf użyłbym Array.prototype.includes żeby lepiej pokazać intencję.
Maciej Cąderek
Maciej Cąderek
I carsNotForSale wyrzucił poza funkcję, bo to taka "stała", więc nie popsuje to czystości funkcji, a nie bdzie tworzona przy każdym wywołaniu ;)
axelbest
Przy tworzeniu kodu na pokaz dla początkujących staram się znaleźć złoty środek. Ta lista samochodów też mi tam osobiście nie pasuje
LB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:427
0
axelbest napisał(a):
Kopiuj
<!DOCTYPE html>
<html>
    <head>
        <script>
            function isCarForSale(name) {
                var carsNotForSale = ['polonez'];

                return carsNotForSale.indexOf(name.trim().toLowerCase()) < 0;
            }

            function showTestMessage() {
                var msg = isCarForSale('Polonez2') ? 'Ok, można sprzedawać' : 'Nie można sprzedawać';

                alert(msg);
            }
        </script>
    </head>
    <body>
        <button onclick="showTestMessage()">Test</button>
    </body>
</html>

To tak jako przykład do komentarza @Maciej Cąderek Oczywiście można to rozwinąć o wiele bardziej (walidacje typów itp itd)

Tutaj dodałem komentarze z tego jak ja widzę ten kod i z jednym pytaniem czy możecie mi sprawdzić czy dobrze to rozumiem?

Kopiuj
        <script>
            function isCarForSale(name) { // wywołujemy funkcję
                var carsNotForSale = ['polonez']; // Tu tworzymy stringa o nazwie polonez
 
                return carsNotForSale.indexOf(name.trim().toLowerCase()) < 0; // Jeżeli jest mniejsze od zera to ma zwrócić ale co to za funkcja? I jak dowiedzieć się co ona oznacza?
            }
 
            function showTestMessage() { // Tutaj załączona funkcja która odpowiada za wyświetlanie wiadomości
                var msg = isCarForSale('Polonez2') ? 'Ok, można sprzedawać' : 'Nie można sprzedawać'; // Tutaj deklarujemy zmienną ze stringiem polonez2 i dwoma tekstami wiadomości w zależności od spełnionych warunków
 
                alert(msg); // pokazuje wiadomość
            }
        </script>
edytowany 2x, ostatnio: LynxBings
axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Warszawa
  • Postów:2251
3

Incepcja - komentarze do komentarzy :D
Po kolei

  1. // wywołujemy funkcję <- Nic nie wywołujemy, tylko definiujemy tę funkcję

  2. // Tu tworzymy stringa o nazwie polonez Nie tworzymy stringa, tylko tworzymy tablicę stringów.

  3. // Jeżeli jest mniejsze od zera to ma zwrócić ale co to za funkcja? I jak dowiedzieć się co ona oznacza?
    -- Wystarczy nauczyć się czytać kod i wiedzieć co zwracają wyniki operacji logicznych -> Jeśli w tablicy carsNotForSale pozycja(index) wartości parametru name funkcji, jest mniejsza niz 0 zwróć prawdę. Przed sprawdzeniem z parametru name ucinamy skrajne spacje oraz zmieniamy znaki na lowercase Z czym poza tym masz problem? Jak nie rozumiesz co oznacza np indexof, wykonujesz następujące działania google -> javascript indexof (jak dalej nie zczaisz to dopisz "how to use" albo coś podobnego). Tak czy siak nastepnym razem postaraj się troszkę i poszukaj na google, nie będę/będziemy (może inni forumowicze podzielą moje zdanie) - Ci pomagać z takimi podstawami.

  4. // Tutaj załączona funkcja która odpowiada za wyświetlanie wiadomości - OK

  5. // Tutaj deklarujemy zmienną ze stringiem polonez2 i dwoma tekstami wiadomości w zależności od spełnionych warunków - Tutaj nie deklarujemy zmiennej ze stringiem polonez2, tylko wywołujemy funkcję z parametrem polonez2.

  6. // pokazuje wiadomość - OK, ale tego to już chyba nie musiałeś komentować...

edytowany 2x, ostatnio: axelbest
vpiotr
@Desu: ogólnie to warto pisać kod tak żeby komentarze były zbyteczne. I ew. jeśli już potrzebne (bo jak napisałeś trzeba opisać dlaczego coś robi) to dawać je tylko przed funkcją. Tamten podlinkowany przykład jest wg mnie strasznie nieczytelny na pierwszy rzut oka - kod przeplata się z prozą.
axelbest
Nie pamiętam kiedy ostatnio użyłem komentarzy w kodzie (dokumentacji w stylu phpDoc'ów oraz anotacji nie liczę)
DE
Ja też nie, stąd pewnie wymyśliłem taki skopany przykład :P Ale słuszna uwaga. Chociaż jak przeglądałem source takiego Laravela, to Otwell dużo komentuje (zwłaszcza wewnątrz metod) i w mojej opini pomaga to trochę zrozumieć co się dzieje w niektórych miejscach.
LukeJL
nie można przesadzać w drugą stronę, jak robisz coś nietrywialnego i niejasnego (hak na przeglądarkę, obejście buga biblioteki, nieoczywisty do końca algorytm itp.) to warto walnąć komentarz.
LukeJL
czasem wklejając też linka, np. do issue na Githubie w którym opisany jest bug, albo do strony z opisem algorytmu itp.
LukeJL
a adnotacje do każdej funkcji w stylu cośtamDoców moim zdaniem są jeszcze gorsze od zwykłych komentarzy (bo to już całkowicie zaciemnia kod).
vpiotr
@LukeJL: w PHP-ie 3/4 adnotacje (phpDocumentor AFAIR) bardzo mi pomagały w opisywaniu typów parametrów, ale nie wiem czy teraz to jeszcze potrzebne. JSDoc-a ktoś używa czy ludzie wolą nauczyć się TypeScript?
axelbest
@vpiotr W php7 już jest tego coraz mniej, ale w 5.* przydają się bardzo.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.