2012-03-17 8 views
5

W Javie, uważam, że najlepszym rozwiązaniem jest zastąpienie literały ciągów znaków o zmiennej stałej każdej chwili są one wykorzystywane w więcej niż jednym miejscu i oczekuje na mecz. Na przykład, jeśli zamierzasz ustawić plik cookie, a później go odtworzysz, nazwa pliku cookie powinna być stała, aby kompilator mógł złapać błędy ortograficzne, nie wspominając już o umożliwieniu czytelnej nazwy zmiennej versus faktyczna wartość String.Czy najlepszą praktyką jest wyodrębnianie ciągów znaków do stałych w JavaScript?

jestem przeglądu kodu takiego w JavaScript i jestem skłonny polecić że literały być zastąpiona stałą. Nie jestem jednak pewien, czy te same powody mają zastosowanie, ponieważ nie ma kompilatora, a nazwa pliku cookie jest tak samo opisowa, jak nazwa zmiennej.

Edit: Podobne do otrzymanych dotychczas komentarze i odpowiedzi, jestem zdecydowanie bardziej związane z wykorzystaniem stałych kontra jaki sposób są one rzeczywiście realizowane. Widzę ich wartość w Javie i innych językach skompilowanych jako sposób na uniknięcie błędów, ale nie jestem pewien, czy widzę tę samą wartość w JavaScript.

Jako mechanizm dokumentacji, powiedzmy dla liczb magicznych, myślę o zmiennej nazwie (nawet jeśli nie jest egzekwowane jako stała) jest nadal dobrym sposobem na poprawę czytelności. Ale dla napisowych, nie jestem pewien, że to:

var trackingCookieName = "trackingCookie"; 

jest lepsza niż tylko za pomocą „trackingCookie”, ponieważ można typo albo dosłowne lub zmienna nazwa i tak czy inaczej, to będzie poławiany wyłącznie przy starcie .

Odpowiedz

6

Odpowiedź jest subiektywna. jak pisałeś, nie ma kompilatora ani stałych.

Więc jeśli to pomaga czytanie i utrzymanie kodu jeśli struny są przechowywane w zmiennych, zrób to, inaczej uniknąć ...

+1

Uzgodnione. Dodam, że prawdopodobnie lepiej jest używać stałych, ponieważ liczba literałów łańcuchowych rośnie. W przypadku literówki najprawdopodobniej otrzymasz ReferenceError, który znacznie ułatwi debugowanie. – squidbe

0

Używanie stałych jest zawsze lepiej, niezależnie od języka (ok, może cię może znaleźć dobry wyjątek). Jedyny przypadek, w którym używam literałów łańcuchowych, dotyczy tego, czy robię parsery plików, czy nie mam czasu i nie chcę tworzyć listy stałych.

Oczywiście zbyt wiele stałych może być trudniejszych do odczytania ... To naprawdę zależy od tego, jak niejasne są ciągi znaków.

Niezależnie JavaScript jest językiem łańcuch ciężki (jak każdy język będzie interpretowane). Można wyodrębnić pola z obiektów na podstawie nazwy ciągu znaków obiektu (container["innerObject"]), a uruchomienie kodu za pomocą łańcucha jest prawie zbyt łatwe.

1

JavaScript const nie jest powszechnie obsługiwany, więc powiedziałbym, że No, to nie najlepsza praktyka.

„Obecna implementacja const jest Mozilla specyficzne rozszerzenie i nie jest częścią ECMAScript 5. Jest on obsługiwany w Firefoksie & Chrome (V8) i częściowo obsługiwane Opera 9+ i Safari. To nie jest obsługiwana w Internecie Explorer 6-9, lub w podglądzie Internet Explorera 10. Słowo kluczowe const aktualnie deklaruje stałą w zakresie funkcji (jak zmienne zadeklarowane przy var).

const będzie definiowane przez ECMAScript 6, ale z inną semantyka Podobnie jak zmienne zadeklarowane za pomocą instrukcji let, stałe zadeklarowane z const będą miały zasięg blokowy. " - https://developer.mozilla.org/en/JavaScript/Reference/Statements/const

Co więcej, jeśli chciałbyś zaimplementować prawdziwą const w javascript, a następnie zawiń go w obiekt i zapewnij tylko funkcję get.

coś takiego:

var Cookies = (function() 
{ 
var consts = 
{ 
    'APPLICATION': '21930857a3e', 
    'SERVER': '435a3456jh5' 
}; 
return 
{ 
    get: function(name) 
    { 
    return consts [name]; 
    } 
}; 
} 
)(); 

a następnie pobrać je:

document.write('<img src="' + Cookies.get('APPLICATION') + '" />') 

czy jakkolwiek chcesz używać stałych.

+0

@JeffreySweeney - Być może źle odczytałem, zinterpretowałem "jestem skłonny polecić zastąpienie literałów stałą" jako ustawienie ciągów do 'const', więc to było to, na co odpowiedziałem. –

1

Zgadzam się z gdoronem, kiedy mówi, że jest to subiektywne, w rzeczy samej, to, co nazywamy konwencjami języków programowania, jest tak naprawdę porozumieniem między programistami, jak w ich perspektywie kod byłby wyraźniejszy, łatwiejszy do utrzymania i itp.

Przyniosłem rzecz "konwencyjną", ponieważ ta "konstytucyjna" rzecz dotyczy w przybliżeniu tego, i jest kilka osób/organizacji, które dużo używają tych języków i definiują dla nich dobre praktyki. Możesz używać tych konwencji w sposób, który bardziej Ci odpowiada, ponieważ różnią się one nieznacznie między sobą, dzięki czemu możesz się dostosować w miarę zdobywania doświadczenia. Oto one:

Google Style Guide

JS Crockford Style Guide

+0

Dzięki za linki. Niestety, nie widzę, aby któryś z nich dotyczył kwestii literałów łańcuchowych vs. stałych. Dokument Google zachęca do używania CONSTANT_VARIABLES dla magicznych liczb, co ma sens, ale w przeciwnym razie jest cicho. Wygląda na to, że odpowiedź na moje pytanie brzmi: "Nie, nie ma takiej najlepszej praktyki w odniesieniu do literałów ciągów a nazwanych stałych" –

1

OK, zgadzam się, że to może być subiektywny wybór. Oto powody, dla których jestem stronniczy w używaniu czegoś podobnego do stałych w JavaScript. Po pierwsze, jest tu jak mogę określić moje stałe (lub są one bardziej jak teksty stałe):

function ENUM(name) { 
    window[name] = name; // depending on platform I am on 
} 

Następnie, w zakresie globalnym, prawdopodobnie w jakimś pliku, robię

ENUM("MSG_DOOR_OPEN"); 
ENUM("MSG_DOOR_CLOSED"); 

I używam to w moim kodu, takich jak:

obj.notify(MSG_DOOR_OPEN); 

powodem Lubię to lepiej to:

  1. Jeśli coś wypisuję błędnie, pojawia się nieokreślony błąd referencyjny, co bardzo ułatwia wykrywanie w dowolnej konsoli JavaScript.
  2. W ten sposób odwołuję się do wstępnie przydzielonego obiektu typu string, a nie do tworzenia nowego obiektu typu string.
  3. Nie muszę tego cytować - wygląda ładniej, zwłaszcza w vim.

Wada:

  1. Tak, jest to zmienna globalna.
  2. Brak nazwy (inne niż przedrostek MSG_).
  3. To kłopot, jeśli chcesz zrobić to dla wszystkiego. (nie musisz)

Ale dla ważnych rzeczy, takich jak nazwy wiadomości itp., lubię robić to w ten sposób. Poza tym posiadanie wszystkich nazw wiadomości zdefiniowanych w jednym miejscu jest w każdym razie dobre. Nie jestem ekspertem od JavaScript ani nic, więc proszę mnie poprawić, jeśli się mylę ...

7

Wyodrębnianie napisowych do stałych oznacza

  • Narzędzia, takie jak JSHint może zidentyfikować błędnie napisane nazwy zmiennych
  • Sprężarki mogą skrócić nazwy zmiennych dla mniejszej mocy
  • zmienić wartości ciągu dokładnie 1 miejsce
0

W debacie na temat stałych w JavaScript, ja osobiście wolę następującą metodę (która jest bliżej do wyliczenia, naprawdę).

var DIR = { 
    North: [-1, 0], 
    NorthEast: [-1, 1], 
    East: [0, 1], 
    SouthEast: [1, 1], 
    South: [1, 0], 
    SouthWest: [1, -1], 
    West: [0, -1], 
    NorthWest: [-1, -1] 
}; 

co ułatwia użycie go lubię:

var myDirection = DIR.SouthEast; 

Plus, nowoczesne IDE może dostarczyć Intellisense dla wartości, które naprawdę pomaga.

Inna metoda, o której wspomina @ Travis-J, jest przyjemna i używa go wiele frameworków (Sencha itp.). Ale dla czegoś, co jest bliskie stałej lub wyliczenia w JS, preferuję powyższą metodę.

Ale można na pewno zrobić to jak Travis wymienić:

var Directions = (function() { 
    var consts = { 
     'North': [-1, 0], 
     'NorthEast': [-1, 1], 
     'East': [0, 1], 
     'SouthEast': [1, 1], 
     'South': [1, 0], 
     'SouthWest': [1, -1], 
     'West': [0, -1], 
     'NorthWest': [-1, -1] 
    }; 

    return { 
     get: function(name) { 
      return consts[name]; 
     } 
    } 
})(); 

Ale problem mam z tym jest teraz trzeba wiedzieć odpowiednie klawisze.

var myDirection = Directions.get('SouthEast'); 
var myDirection = Directions.get('SOUTHEAST'); // null 

Nadzieję, że zapewnia małą pomoc.

Powiązane problemy