8000 GitHub - devSchacht/clean-code-javascript: πŸ› АдаптированныС для JavaScript ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Чистого ΠΊΠΎΠ΄Π°
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

πŸ› АдаптированныС для JavaScript ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Чистого ΠΊΠΎΠ΄Π°

License

Notifications You must be signed in to change notification settings

devSchacht/clean-code-javascript

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ: ryanmcdermott/clean-code-javascript

Актуализировано ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΏΠΎ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π½Π° 4 фСвраля 2017 Π³ΠΎΠ΄Π°

clean-code-javascript

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅
  2. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
  3. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  4. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ…
  5. ΠšΠ»Π°ΡΡΡ‹
  6. ВСстированиС
  7. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ
  8. ΠžΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ ошибок
  9. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
  10. ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ
  11. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠмористичСскоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ†Π΅Π½ΠΊΠΈ качСства ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния: Π² качСствС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ измСрСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ количСство Ρ€ΡƒΠ³Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π²Ρ‹ΠΊΡ€ΠΈΠΊΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π²ΠΎ врСмя чтСния ΠΊΠΎΠ΄Π°

Адаптация для JavaScript ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ Π ΠΎΠ±Π΅Ρ€Ρ‚Π° ΠœΠ°Ρ€Ρ‚ΠΈΠ½Π° Чистый ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ Π½Π΅ руководство ΠΏΠΎ ΡΡ‚ΠΈΠ»ΡŽ. Π­Ρ‚ΠΎ руководство ΠΏΠΎ написанию Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠ³ΠΎ для ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π½Π° JavaScript.

НС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ здСсь Π΄ΠΎΠ»ΠΆΠ΅Π½ строго ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒΡΡ ΠΈ Π΅Ρ‰Π΅ мСньшС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ всСобщСС ΠΏΡ€ΠΈΠ·Π½Π°Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅, Π½ΠΎ ΠΎΠ½ΠΈ накапливались Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π»Π΅Ρ‚ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Чистого ΠΊΠΎΠ΄Π°.

Π˜ΡΠΊΡƒΡΡΡ‚Π²Ρƒ написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π±ΠΎΠ»Π΅Π΅ пятидСсяти Π»Π΅Ρ‚, ΠΈ ΠΌΡ‹ всС Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΌΡƒ учимся. Когда программная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° постарССт Π΄ΠΎ возраста самой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ³Π΄Π° Ρƒ нас появятся ТСсткиС ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ. А сСйчас ΠΏΡƒΡΡ‚ΡŒ эти ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ слуТат ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅ΠΌ ΠΎΡ†Π΅Π½ΠΊΠ° качСства JavaScript-ΠΊΠΎΠ΄Π°, создаваСмого Π²Π°ΠΌΠΈ ΠΈ вашСй ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

И Π΅Ρ‰Π΅. Π—Π½Π°Π½ΠΈΠ΅ этих ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Π½Π΅ сразу сдСлаСт вас Π»ΡƒΡ‡ΡˆΠ΅ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Π° ΠΈΡ… использованиС Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π»Π΅Ρ‚ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ пСрСстанСтС ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ ошибки. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ набросок, ΠΊΠ°ΠΊ мокрая Π³Π»ΠΈΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ свою Ρ„ΠΎΡ€ΠΌΡƒ постСпСнно. НаконСц, всС ΠΌΡ‹ ΠΏΡ€ΠΎΠ½ΠΈΠ·Π°Π½Ρ‹ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° наш ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ. НС истязайтС сСбя Π·Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΈ, наброски. ВмСсто этого истязайтС свой ΠΊΠΎΠ΄!

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈ произносимыС ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

ΠŸΠ»ΠΎΡ…ΠΎ:

const yyyymmdstr = moment().format('YYYY/MM/DD');

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const currentDate = moment().format('YYYY/MM/DD');

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ лСксикон для Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

ΠŸΠ»ΠΎΡ…ΠΎ:

getUserInfo();
getClientData();
getCustomerRecord();

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

getUser();

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½Π°, доступныС для поиска

ΠœΡ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ большС ΠΊΠΎΠ΄Π°, Ρ‡Π΅ΠΌ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ напишСм. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создаСм, Π±Ρ‹Π» Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ доступным для поиска. ΠΠ΅Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π·Π²Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡƒΡ…ΡƒΠ΄ΡˆΠ°ΡŽΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ ΠΎΡΠΊΠΎΡ€Π±Π»ΡΡŽΡ‚ Π½Π°ΡˆΠΈΡ… Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ. Π”Π΅Π»Π°ΠΉΡ‚Π΅ ваши обозначСния доступными для поиска. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ buddy.js ΠΈ ESLint ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΉΡ‚ΠΈ Π½Π΅Π½Π°Π·Π²Π°Π½Π½Ρ‹Π΅ константы.

ΠŸΠ»ΠΎΡ…ΠΎ:

// Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ 86400000?
setTimeout(blastOff, 86400000);

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

// ΠžΠ±ΡŠΡΠ²Π»ΡΠΉΡ‚Π΅ ΠΈΡ… ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ `const` со всСми Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Π² Π·Π°Π³Π»Π°Π²Π½ΠΎΠΌ рСгистрС.
const MILLISECONDS_IN_A_DAY = 86400000;

setTimeout(blastOff, MILLISECONDS_IN_A_DAY);

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠŸΠ»ΠΎΡ…ΠΎ:

const address = 'One Infinite Loop, Cupertino 95014';
const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;
saveCityZipCode(address.match(cityZipCodeRegex)[1], address.match(cityZipCodeRegex)[2]);

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const address = 'One Infinite Loop, Cupertino 95014';
const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;
const [, city, zipCode] = address.match(cityZipCodeRegex) || [];
saveCityZipCode(city, zipCode);

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆ 3270 анию

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ мыслСнных связСй

Π―Π²Π½ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ нСявноС.

ΠŸΠ»ΠΎΡ…ΠΎ:

const locations = ['Austin', 'New York', 'San Francisco'];
locations.forEach((l) => {
  doStuff();
  doSomeOtherStuff();
  // ...
  // ...
  // ...
  // Π‘Ρ‚ΠΎΠΉΡ‚Π΅. Π•Ρ‰Π΅ Ρ€Π°Π·, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ `l`?
  dispatch(l);
});

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const locations = ['Austin', 'New York', 'San Francisco'];
locations.forEach((location) => {
  doStuff();
  doSomeOtherStuff();
  // ...
  // ...
  // ...
  dispatch(location);
});

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

НС добавляйтС Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΉ контСкст

Если вашС имя класса/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π·Π° сСбя, Π½Π΅ повторяйтС Π΅Π³ΠΎ Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠŸΠ»ΠΎΡ…ΠΎ:

const Car = {
  carMake: 'Honda',
  carModel: 'Accord',
  carColor: 'Blue'
};

function paintCar(car) {
  car.carColor = 'Red';
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const Car = {
  make: 'Honda',
  model: 'Accord',
  color: 'Blue'
};

function paintCar(car) {
  car.color = 'Red';
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ вмСсто ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ схСмы вычислСния

АргумСнты ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ часто Ρ‡ΠΈΡ‰Π΅, Ρ‡Π΅ΠΌ короткая схСма вычислСния. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΅Π΅, ваша функция Π·Π°Π΄Π°Π΅Ρ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для undefined Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π”Ρ€ΡƒΠ³ΠΈΠ΅ "falsy" значСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ '', "", false, null, 0 ΠΈ NaN, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΠ»ΠΎΡ…ΠΎ:

function createMicrobrewery(name) {
  const breweryName = name || 'Hipster Brew Co.';
  // ...
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function createMicrobrewery(breweryName = 'Hipster Brew Co.') {
  // ...
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

АргумСнты Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (идСально Π΄Π²Π° ΠΈΠ»ΠΈ мСньшС)

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ нСвСроятно Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ тСстированиС. Π‘ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… приводят ΠΊ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½ΠΎΠΌΡƒ Π²Π·Ρ€Ρ‹Π²Ρƒ, Π³Π΄Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ.

Один Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ Π΄Π²Π° - ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ случай, Ρ‚Ρ€Π΅Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Π‘ΠΎΠ»ΡŒΡˆΠ΅Π΅ количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ объСдинСно. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ссли Ρƒ вас Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ваша функция пытаСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° случаСв, Π³Π΄Π΅ это ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ достаточно ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JavaScript позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° Π»Π΅Ρ‚Ρƒ, Π±Π΅Π· классов Π² качСствС основы, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ссли Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅ΡΡŒ Π²ΠΎ мноТСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ свойства функция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис дСструкции ΠΈΠ· ES2015/ES6. Он ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько прСимущСств:

  1. Когда Π²Ρ‹ смотритС Π½Π° сигнатуру Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ сразу понятно, ΠΊΠ°ΠΊΠΈΠ΅ свойства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.
  2. ДСструкция ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дСструктурированы ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, НЕ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.
  3. Π›ΠΈΠ½Ρ‚Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ вас ΠΎ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… свойствах, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· дСструктурирования.

ΠŸΠ»ΠΎΡ…ΠΎ:

function createMenu(title, body, buttonText, cancellable) {
  // ...
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function createMenu({ title, body, buttonText, cancellable }) {
  // ...
}

createMenu({
  title: 'Foo',
  body: 'Bar',
  buttonText: 'Baz',
  cancellable: true
});

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ дСйствиС

Π­Ρ‚ΠΎ, бСзусловно, самоС Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния. Когда Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ большС Ρ‡Π΅ΠΌ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ, ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ, Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Если Π²Ρ‹ смоТСтС ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ дСйствиС, Π² дальнСйшСм ΠΎΠ½Π° Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½Π°, Π° ваш ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ‡ΠΈΡ‰Π΅. Π”Π°ΠΆΠ΅ Ссли ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства Π²Ρ‹ Π½Π΅ ΠΏΠΎΡ‡Π΅Ρ€ΠΏΠ½Π΅Ρ‚Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°, Ρ‚ΠΎ Π²Ρ‹ ΡƒΠΆΠ΅ оставитС ΠΏΠΎΠ·Π°Π΄ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².

ΠŸΠ»ΠΎΡ…ΠΎ:

function emailClients(clients) {
  clients.forEach((client) => {
    const clientRecord = database.lookup(client);
    if (clientRecord.isActive()) {
      email(client);
    }
  });
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function emailClients(clients) {
  clients
    .filter(isClientActive)
    .forEach(email);
}

function isClientActive(client) {
  const clientRecord = database.lookup(client);
  return clientRecord.isActive();
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ИмСна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚

ΠŸΠ»ΠΎΡ…ΠΎ:

function addToDate(date, month) {
  // ...
}

const date = new Date();

// Из ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слоТно ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° добавляСт
addToDate(date, 1);

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function addMonthToDate(month, date) {
  // ...
}

const date = new Date();
addMonthToDate(1, date);

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции

Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции, ваша функция, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄Π΅Π»Π°Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ возмоТности ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ простотС тСстирования.

ΠŸΠ»ΠΎΡ…ΠΎ:

function parseBetterJSAlternative(code) {
  const REGEXES = [
    // ...
  ];

  const statements = code.split(' ');
  const tokens = [];
  REGEXES.forEach((REGEX) => {
    statements.forEach((statement) => {
      // ...
    });
  });

  const ast = [];
  tokens.forEach((token) => {
    // Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ...
  });

  ast.forEach((node) => {
    // Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ...
  });
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function tokenize(code) {
  const REGEXES = [
    // ...
  ];

  const statements = code.split(' ');
  const tokens = [];
  REGEXES.forEach((REGEX) => {
    statements.forEach((statement) => {
      tokens.push( /* ... */ );
    });
  });

  return tokens;
}

function lexer(tokens) {
  const ast = [];
  tokens.forEach((token) => {
    ast.push( /* ... */ );
  });

  return ast;
}

function parseBetterJSAlternative(code) {
  const tokens = tokenize(code);
  const ast = lexer(tokens);
  ast.forEach((node) => {
    // Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ...
  });
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠΎΠ΄Π°

Π”Π΅Π»Π°ΠΉΡ‚Π΅ всС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ дублирования ΠΊΠΎΠ΄Π°. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΠΏΠ»ΠΎΡ… Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ссли придСтся ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ Π»ΠΎΠ³ΠΈΠΊΡƒ, Π΅Π΅ придСтся ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Π²Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ рСсторан ΠΈ Π²Π΅Π΄Π΅Ρ‚Π΅ ΡƒΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² (всСх Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€ΠΎΠ², Π»ΡƒΠΊΠ°, чСснока, спСций ΠΈ Ρ‚.Π΄.). Если Ρƒ вас нСсколько списков с ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌΠΈ, Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π·Π°ΠΊΠ°ΠΆΡƒΡ‚ Ρ‚ΠΎΠΌΠ°Ρ‚Π½Ρ‹ΠΉ суп, Π²Π°ΠΌ придСтся ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ… всС. Если список Ρƒ вас Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½, Ρ‚ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ придСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ!

Часто Π²Ρ‹ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ нСсколько логичСских участков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ схоТи, Π½ΠΎ ΠΈΡ… различия Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ вас ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠΎΠ΄Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ созданиС абстракции, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ эту Ρ€Π°Π·Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ всСго ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ/модуля/класса.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ абстракции ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ проСктирования классов (SOLID-ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ), ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠšΠ»Π°ΡΡΡ‹. ΠŸΠ»ΠΎΡ…ΠΈΠ΅ абстракции ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄ΡŒΡ‚Π΅ остороТны! ΠŸΠΎΠΏΡ€ΠΎΡΡ‚Ρƒ говоря, Ссли Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, Π΄Π΅Π»Π°ΠΉΡ‚Π΅! НС повторяйтС сСбя, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π² любом ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ сСбя, вносящим измСнСния Π² нСсколько мСст Ρ€Π°Π΄ΠΈ измСнСния ΠΎΠ΄Π½ΠΎΠΉ СдинствСнной Π»ΠΎΠ³ΠΈΠΊΠΈ.

ΠŸΠ»ΠΎΡ…ΠΎ:

function showDeveloperList(developers) {
  developers.forEach((developer) => {
    const expectedSalary = developer.calculateExpectedSalary();
    const experience = developer.getExperience();
    const githubLink = developer.getGithubLink();
    const data = {
      expectedSalary,
      experience,
      githubLink
    };

    render(data);
  });
}

function showManagerList(managers) {
  managers.forEach((manager) => {
    const expectedSalary = manager.calculateExpectedSalary();
    const experience = manager.getExperience();
    const portfolio = manager.getMBAProjects();
    const data = {
      expectedSalary,
      experience,
      portfolio
    };

    render(data);
  });
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function showEmployeeList(employees) {
  employees.forEach((employee) => {
    const expectedSalary = employee.calculateExpectedSalary();
    const experience = employee.getExperience();

    let portfolio = employee.getGithubLink();

    if (employee.type === 'manager') {
      portfolio = employee.getMBAProjects();
    }

    const data = {
      expectedSalary,
      experience,
      portfolio
    };

    render(data);
  });
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ЗначСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° устанавливайтС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Object.assign

ΠŸΠ»ΠΎΡ…ΠΎ:

const menuConfig = {
  title: null,
  body: 'Bar',
  buttonText: null,
  cancellable: true
};

function createMenu(config) {
  config.title = config.title || 'Foo';
  config.body = config.body || 'Bar';
  config.buttonText = config.buttonText || 'Baz';
  config.cancellable = config.cancellable === undefined ? config.cancellable : true;
}

createMenu(menuConfig);

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const menuConfig = {
  title: 'Order',
  // ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠΎΠ»Π΅ 'body'
  buttonText: 'Send',
  cancellable: true
};

function createMenu(config) {
  config = Object.assign({
    title: 'Foo',
    body: 'Bar',
    buttonText: 'Baz',
    cancellable: true
  }, config);

  // config Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π²Π΅Π½: {title: "Order", body: "Bar", buttonText: "Send", cancellable: true}
  // ...
}

createMenu(menuConfig);

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„Π»Π°Π³ΠΈ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π€Π»Π°Π³ΠΈ говорят ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эта функция Π΄Π΅Π»Π°Π΅Ρ‚ большС Ρ‡Π΅ΠΌ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ. Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Π²Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ссли, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° логичСском ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅, ΠΎΠ½Π° исполняСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

ΠŸΠ»ΠΎΡ…ΠΎ:

function createFile(name, temp) {
  if (temp) {
    fs.create(`./temp/${name}`);
  } else {
    fs.create(name);
  }
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function createFile(name) {
  fs.create(name);
}

function createTempFile(name) {
  createFile(`./temp/${name}`);
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов (Ρ‡Π°ΡΡ‚ΡŒ пСрвая)

Ѐункция ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, Ссли ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ запись Π² Ρ„Π°ΠΉΠ», ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ случайный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ всСх своих Π΄Π΅Π½Π΅Π³ Π½Π° Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ†Π°.

Однако Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… случаях Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты. Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ запись Π² Ρ„Π°ΠΉΠ». Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π³Π΄Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ это Π΄Π΅Π»Π°Ρ‚ΡŒ. НС Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ классов для записи Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π”ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ сСрвис, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠΉ это. Один ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½.

Π“Π»Π°Π²Π½ΠΎΠ΅ здСсь - ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ распространСнных ошибок: раздСлСния состояния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ структуры, использованиС измСняСмых Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ΅ΠΌ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, отсутствиС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ мСста возникновСния Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. Если Π²Ρ‹ смоТСтС ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Π²Ρ‹ станСтС счастливСС, Ρ‡Π΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… программистов.

ΠŸΠ»ΠΎΡ…ΠΎ:

// Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π° Π½Π΅ΠΉ функция.
// Ѐункция ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² массив ΠΈ Ссли Π±Ρ‹ Ρƒ нас Π±Ρ‹Π»Π° Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° функция, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ эту ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‚ΠΎ это ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ привСсти ΠΊ Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΌΠΊΠ΅.
let name = 'Ryan McDermott';

function splitIntoFirstAndLastName() {
  name = name.split(' ');
}

splitIntoFirstAndLastName();

console.log(name); // ['Ryan', 'McDermott'];

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function splitIntoFirstAndLastName(name) {
  return name.split(' ');
}

const name = 'Ryan McDermott';
const newName = splitIntoFirstAndLastName(name);

console.log(name); // 'Ryan McDermott';
console.log(newName); // ['Ryan', 'McDermott'];

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов (Ρ‡Π°ΡΡ‚ΡŒ вторая)

Π’ JavaScript ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹/массивы ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ссылкС. Π’ случаС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ массивов, Ссли ваша функция вносит измСнСния Π² массив ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹ ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡƒΡ‚Π΅ΠΌ добавлСния Ρ‚ΠΎΠ²Π°Ρ€Π°, Ρ‚ΠΎ любая другая функция, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот массив cart, Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ этого дополнСния. Π­Ρ‚ΠΎ Π² Ρ€Π°Π²Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ ΠΏΠ»ΠΎΡ…ΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим сСбС ΠΏΠ»ΠΎΡ…ΠΎΠΉ сцСнарий.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° "ΠšΡƒΠΏΠΈΡ‚ΡŒ" - ΠΊΠ½ΠΎΠΏΠΊΡƒ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ purchase, которая создаСт сСтСвой запрос ΠΈ отправляСт массив cart Π½Π° сСрвСр. Из-Π·Π° ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сСти функция purchase Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос. А Ρ‡Ρ‚ΠΎ Ссли Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ случайно Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ "Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ" Π½Π° Ρ‚ΠΎΠ²Π°Ρ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚ΡŒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ начался сСтСвой запрос? Если это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Π° сСтСвой запрос ΡƒΠΆΠ΅ начался, Ρ‚ΠΎ функция ΠΏΠΎΠΊΡƒΠΏΠΊΠΈ ΠΏΠΎΡˆΠ»Π΅Ρ‚ Π½Π° сСрвСр случайно Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΎΠ²Π°Ρ€, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ ссылку Π½Π° массив ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹ ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ функция addItemToCart ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»Π° ΠΏΡƒΡ‚Π΅ΠΌ добавлСния Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΎΠ²Π°Ρ€Π°.

ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция addItemToCart всСгда ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»Π° массив cart, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π»Π° Π΅Π³ΠΎ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ»ΠΎΠ½. Π­Ρ‚ΠΎ Π±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ссылку Π½Π° массив ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹ ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ измСнСниями.

Π”Π²Π° прСдостСрСТСния:

  1. ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ случаи, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π° самом Π΄Π΅Π»Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ входящий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ½Π΅Ρ‚Π΅ ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ программирования, Ρ‚ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ эти случаи довольно Ρ€Π΅Π΄ΠΊΠΈ. Π‘ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов Π½Π΅ Π±Ρ‹Π»ΠΎ совсСм!
  2. ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, это Π½Π΅ являСтся большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ [ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ] (https://facebook.github.io/immutable-js/), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ программирования Π±Ρ‹Ρ‚ΡŒ быстрым ΠΈ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΌ ΠΏΠΎ памяти, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ссли Π±Ρ‹ Π²Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ массивы.

ΠŸΠ»ΠΎΡ…ΠΎ:

const addItemToCart = (cart, item) => {
  cart.push({ item, date: Date.now() });
};

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const addItemToCart = (cart, item) => {
  return [...cart, { item, date : Date.now() }];
};

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

НС записывайтС Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

ЗагрязнСниС глобального ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° - плохая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Π² JavaScript, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вашСго API останСтся Π² Π·Π°ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π΅ Π΄Π°ΠΆΠ΅ послС получСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ production. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΡ€Π°Π·ΠΌΡ‹ΡˆΠ»ΡΠ΅ΠΌ ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Array, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΈΠΌΠ΅Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ diff, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя массивами? Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊ Array.prototype, Π½ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰Π΅ΠΉΡΡ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС. Π§Ρ‚ΠΎ, Ссли эта другая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ diff ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя массивами, Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈ послСдним элСмСнтами массива? Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ES2015/ES6 классы ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Array.

ΠŸΠ»ΠΎΡ…ΠΎ:

Array.prototype.diff = function diff(comparisonArray) {
  const hash = new Set(comparisonArray);
  return this.filter(elem => !hash.has(elem));
};

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class SuperArray extends Array {
  diff(comparisonArray) {
    const hash = new Set(comparisonArray);
    return this.filter(elem => !hash.has(elem));
  }
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅ΠΉ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ

JavaScript Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ язык ΠΊΠ°ΠΊ Haskell, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΊ этому. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки Ρ‡ΠΈΡ‰Π΅ ΠΈ ΠΈΡ… ΠΏΡ€ΠΎΡ‰Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ этот ΡΡ‚ΠΈΠ»ΡŒ программирования, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅.

ΠŸΠ»ΠΎΡ…ΠΎ:

const programmerOutput = [
  {
    name: 'Uncle Bobby',
    linesOfCode: 500
  }, {
    name: 'Suzie Q',
    linesOfCode: 1500
  }, {
    name: 'Jimmy Gosling',
    linesOfCode: 150
  }, {
    name: 'Gracie Hopper',
    linesOfCode: 1000
  }
];

let totalOutput = 0;

for (let i = 0; i < programmerOutput.length; i++) {
  totalOutput += programmerOutput[i].linesOfCode;
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const programmerOutput = [
  {
    name: 'Uncle Bobby',
    linesOfCode: 500
  }, {
    name: 'Suzie Q',
    linesOfCode: 1500
  }, {
    name: 'Jimmy Gosling',
    linesOfCode: 150
  }, {
    name: 'Gracie Hopper',
    linesOfCode: 1000
  }
];

const INITIAL_VALUE = 0;

const totalOutput = programmerOutput
  .map((programmer) => programmer.linesOfCode)
  .reduce((acc, linesOfCode) => acc + linesOfCode, INITIAL_VALUE);

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ условия

ΠŸΠ»ΠΎΡ…ΠΎ:

if (fsm.state === 'fetching' && isEmpty(listNode)) {
  // ...
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function shouldShowSpinner(fsm, listNode) {
  return fsm.state === 'fetching' && isEmpty(listNode);
}

if (shouldShowSpinner(fsmInstance, listNodeInstance)) {
  // ...
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… условий

ΠŸΠ»ΠΎΡ…ΠΎ:

function isDOMNodeNotPresent(node) {
  // ...
}

if (!isDOMNodeNotPresent(node)) {
  // ...
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function isDOMNodePresent(node) {
  // ...
}

if (isDOMNodePresent(node)) {
  // ...
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ условий

Π­Ρ‚ΠΎ каТСтся Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ людСй, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡƒΡΠ»Ρ‹ΡˆΠ°Π² это, говорят: "Как я Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π±Π΅Π· выраТСния if?". ΠžΡ‚Π²Π΅Ρ‚ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях для достиТСния Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ†Π΅Π»ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄Π°Π»Π΅Π΅ слСдуСт вопрос: "Π₯ΠΎΡ€ΠΎΡˆΠΎ, это Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Π½ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ этому?". ΠžΡ‚Π²Π΅Ρ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… Чистого ΠΊΠΎΠ΄Π°: функция Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ. Если Ρƒ вас Π΅ΡΡ‚ΡŒ классы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ выраТСния if, Π²Ρ‹ ΠΏΡ€ΠΈΠ·Π½Π°Π΅Ρ‚Π΅ΡΡŒ своСму ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Ρ‡Ρ‚ΠΎ ваша функция Π΄Π΅Π»Π°Π΅Ρ‚ большС, Ρ‡Π΅ΠΌ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ. Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ.

ΠŸΠ»ΠΎΡ…ΠΎ:

class Airplane {
  // ...
  getCruisingAltitude() {
    switch (this.type) {
      case '777':
        return this.getMaxAltitude() - this.getPassengerCount();
      case 'Air Force One':
        return this.getMaxAltitude();
      case 'Cessna':
        return this.getMaxAltitude() - this.getFuelExpenditure();
    }
  }
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class Airplane {
  // ...
}

class Boeing777 extends Airplane {
  // ...
  getCruisingAltitude() {
    return this.getMaxAltitude() - this.getPassengerCount();
  }
}

class AirForceOne extends Airplane {
  // ...
  getCruisingAltitude() {
    return this.getMaxAltitude();
  }
}

class Cessna extends Airplane {
  // ...
  getCruisingAltitude() {
    return this.getMaxAltitude() - this.getFuelExpenditure();
  }
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² (Ρ‡Π°ΡΡ‚ΡŒ пСрвая)

JavaScript - слабо Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык программирования - ваши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ любого Ρ‚ΠΈΠΏΠ°. Иногда такая свобода ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² вас ΠΈ Π²Π΅Π»ΠΈΠΊ соблаз ввСсти Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ². Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ способов ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ - ΡƒΠΏΠ»ΠΎΡ‚Π½ΠΈΡ‚ΡŒ API.

ΠŸΠ»ΠΎΡ…ΠΎ:

function travelToTexas(vehicle) {
  if (vehicle instanceof Bicycle) {
    vehicle.pedal(this.currentLocation, new Location('texas'));
  } else if (vehicle instanceof Car) {
    vehicle.drive(this.currentLocation, new Location('texas'));
  }
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function travelToTexas(vehicle) {
  vehicle.move(this.currentLocation, new Location('texas'));
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² (Ρ‡Π°ΡΡ‚ΡŒ вторая)

Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ значСниями, ΠΊΠ°ΠΊ строки, числа ΠΈ массивы, ΠΈ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, Π½ΠΎ Π²Ρ‹ всС Π΅Ρ‰Π΅ Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅ΡΡŒ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΈΠΏΠΎΠ², Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ ΠΎΠ± использовании TypeScript. Π­Ρ‚ΠΎ отличная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ JavaScript, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ прСдоставляСт Π²Π°ΠΌ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ… стандартного JavaScript синтаксиса. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² JavaScript Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, Ссли Π΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΎΠ½Π° излишнС многословна ΠΈ получаСмая Π²Π°ΠΌΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ компСнсируСт ΠΏΠΎΡ‚Π΅Ρ€ΡΠ½Π½ΡƒΡŽ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ. Π”Π΅Ρ€ΠΆΠΈΡ‚Π΅ JavaScript Π² чистотС, ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ тСсты ΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ качСствСнноС Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Π΄Π΅Π»Π°ΠΉΡ‚Π΅ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Π½ΠΎ с TypeScript (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ я ΡƒΠΆΠ΅ сказал, - отличная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°!).

ΠŸΠ»ΠΎΡ…ΠΎ:

function combine(val1, val2) {
  if (typeof val1 === 'number' && typeof val2 === 'number' ||
      typeof val1 === 'string' && typeof val2 === 'string') {
    return val1 + val2;
  }

  throw new Error('Must be of type String or Number');
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function combine(val1, val2) {
  return val1 + val2;
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

НС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎ

Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ соврСмСнныС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ большой объСм ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя выполнСния ΠΊΠΎΠ΄Π°. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, Ссли Π²Ρ‹ занимались ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Π²Ρ‹ попусту ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ своС врСмя. [Π•ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ рСсурсы] (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers) для обнаруТСния Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΡ… Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° ситуация Π½Π΅ измСнится.

ΠŸΠ»ΠΎΡ…ΠΎ:

// Π’ старых Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… каТдая итСрация с Π½Π΅Π·Π°ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ `list.length` - дорогостоящая.
// Π”Π΅Π»ΠΎ Π² постоянном пСрСрасчСтС `list.length`. Π’ соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… это ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ.
for (let i = 0, len = list.length; i < len; i++) {
  // ...
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

for (let i = 0; i < list.length; i++) {
  // ...
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

УдаляйтС ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹ΠΉ ΠΊΠΎΠ΄

ΠœΠ΅Ρ€Ρ‚Π²Ρ‹ΠΉ ΠΊΠΎΠ΄ - Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠ»ΠΎΡ…ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄. НСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… оснований ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅. Если ΠΎΠ½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΈΠ·Π±Π°Π²ΡŒΡ‚Π΅ΡΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ! Π’ случаС надобности, Π΅Π³ΠΎ всСгда ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² истории вСрсий.

ΠŸΠ»ΠΎΡ…ΠΎ:

function oldRequestModule(url) {
  // ...
}

function newRequestModule(url) {
  // ...
}

const req = newRequestModule;
inventoryTracker('apples', req, 'www.inventory-awesome.io');

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function newRequestModule(url) {
  // ...
}

const req = newRequestModule;
inventoryTracker('apples', req, 'www.inventory-awesome.io');

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ…

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΈ сСттСры

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΈ сСттСры для доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΅Π³ΠΎ свойствам. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? Π’ΠΎΡ‚ список ΠΏΡ€ΠΈΡ‡ΠΈΠ½:

  • Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ большС, Ρ‡Π΅ΠΌ просто ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ свойство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
  • Π”Π΅Π»Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ set элСмСнтарным.
  • Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС.
  • ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π»Π΅Π³ΠΊΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок.
  • Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ свойств вашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, скаТСм, получая ΠΈΡ… с сСрвСра.

ΠŸΠ»ΠΎΡ…ΠΎ:

function makeBankAccount() {
  // ...

  return {
    balance: 0,
    // ...
  };
}

const account = makeBankAccount();
account.balance = 100;

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function makeBankAccount() {
  // приватная пСрСмСнная
  let balance = 0;

  // Π³Π΅Ρ‚Ρ‚Π΅Ρ€ являСтся ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ возвращаСтся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π½ΠΈΠΆΠ΅
  function getBalance() {
    return balance;
  }

  // сСттСр являСтся ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ возвращаСтся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π½ΠΈΠΆΠ΅
  function setBalance(amount) {
    // ... валидация ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ баланса
    balance = amount;
  }

  return {
    // ...
    getBalance,
    setBalance,
  };
}

const account = makeBankAccount();
account.setBalance(100);

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ поля

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достигнуто ΠΏΠΎ срСдством Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ (для вСрсии ES5 ΠΈ Π½ΠΈΠΆΠ΅).

ΠŸΠ»ΠΎΡ…ΠΎ:

const Employee = function(name) {
  this.name = name;
};

Employee.prototype.getName = function getName() {
  return this.name;
};

const employee = new Employee('John Doe');
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: undefined

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function makeEmployee(name) {
  return {
    getName() {
      return name;
    },
  };
}

const employee = makeEmployee('John Doe');
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠšΠ»Π°ΡΡΡ‹

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ СдинствСнной отвСтствСнности (SRP)

Чистый ΠΊΠΎΠ΄ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚: "НС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ для измСнСния класса". Π—Π°ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС класс, ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ большим количСством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°, словно Π² ΠΏΠΎΠ΅Π·Π΄ΠΊΡƒ Π²Π°ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ Π²Π·ΡΡ‚ΡŒ всСго ΠΎΠ΄ΠΈΠ½ Ρ‡Π΅ΠΌΠΎΠ΄Π°Π½. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ваш класс Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ ΠΈ это даст Π΅ΠΌΡƒ мноТСство ΠΏΡ€ΠΈΡ‡ΠΈΠ½ для измСнСния. Π˜ΠΌΠ΅Π΅Ρ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свСсти ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ количСство Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½. Если ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ классС, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ, Ρ‚ΠΎ ΡΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… модулях систСмы, станСт ΠΊΡ€Π°ΠΉΠ½Π΅ слоТно.

ΠŸΠ»ΠΎΡ…ΠΎ:

class UserSettings {
  constructor(user) {
    this.user = user;
  }

  changeSettings(settings) {
    if (this.verifyCredentials()) {
      // ...
    }
  }

  verifyCredentials() {
    // ...
  }
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class UserAuth {
  constructor(user) {
    this.user = user;
  }

  verifyCredentials() {
    // ...
  }
}


class UserSettings {
  constructor(user) {
    this.user = user;
    this.auth = new UserAuth(user);
  }

  changeSettings(settings) {
    if (this.auth.verifyCredentials()) {
      // ...
    }
  }
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ открытости/закрытости (OCP)

Как заявил Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ ΠœΠ΅ΠΉΠ΅Ρ€, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ сущности (классы, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚.Π΄.) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π§Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅? ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ закрСпляСт, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности, Π½ΠΎ Π±Π΅Π· измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

ΠŸΠ»ΠΎΡ…ΠΎ:

class AjaxAdapter extends Adapter {
  constructor() {
    super();
    this.name = 'ajaxAdapter';
  }
}

class NodeAdapter extends Adapter {
  constructor() {
    super();
    this.name = 'nodeAdapter';
  }
}

class HttpRequester {
  constructor(adapter) {
    this.adapter = adapter;
  }

  fetch(url) {
    if (this.adapter.name === 'ajaxAdapter') {
      return makeAjaxCall(url).then((response) => {
        // трансформируСм ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ
      });
    } else if (this.adapter.name === 'httpNodeAdapter') {
      return makeHttpCall(url).then((response) => {
        // трансформируСм ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ
      });
    }
  }
}

function makeAjaxCall(url) {
  // Π΄Π΅Π»Π°Π΅ΠΌ запрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠŸΡ€ΠΎΠΌΠΈΡ
}

function makeHttpCall(url) {
  // Π΄Π΅Π»Π°Π΅ΠΌ запрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠŸΡ€ΠΎΠΌΠΈΡ
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class AjaxAdapter extends Adapter {
  constructor() {
    super();
    this.name = 'ajaxAdapter';
  }

  request(url) {
    // Π΄Π΅Π»Π°Π΅ΠΌ запрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠŸΡ€ΠΎΠΌΠΈΡ
  }
}

class NodeAdapter extends Adapter {
  constructor() {
    super();
    this.name = 'nodeAdapter';
  }

  request(url) {
    // Π΄Π΅Π»Π°Π΅ΠΌ запрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠŸΡ€ΠΎΠΌΠΈΡ
  }
}

class HttpRequester {
  constructor(adapter) {
    this.adapter = adapter;
  }

  fetch(url) {
    return this.adapter.request(url).then((response) => {
      // трансформируСм ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ
    });
  }
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Π‘Π°Ρ€Π±Π°Ρ€Ρ‹ Лисков (LSP)

Π­Ρ‚ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для ΠΎΡ‡Π΅Π½ΡŒ простой ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ языком ΠΎΠ½ Π·Π²ΡƒΡ‡ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: "Если S являСтся ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠΌ T, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° Π’ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° S (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° S ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° Π’) Π±Π΅Π· влияния Π½Π° Π²Π°ΠΆΠ½Ρ‹Π΅ свойства ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ для выполнСния Π·Π°Π΄Π°Ρ‡ ΠΈ Ρ‚.Π΄.). И Π΄Π°, Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π΅Ρ‰Π΅ ΡΡ‚Ρ€Π°ΡˆΠ½Π΅ΠΉ.

Π›ΡƒΡ‡ΡˆΠ΅Π΅ объяснСниС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ классы, Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ взаимозамСняСмыС, Π½Π΅ приводя ΠΏΡ€ΠΈ этом ΠΊ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ. Π­Ρ‚ΠΎ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° классичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°-ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ прСдставляСт собой ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Π½ΠΎ Ссли Π²Ρ‹ смодСлируСтС ΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· наслСдованиС ("являСтся Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ"), Π²Ρ‹ быстро Π½Π°Ρ‚ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ Π½Π° нСприятности.

ΠŸΠ»ΠΎΡ…ΠΎ:

class Rectangle {
  constructor() {
    this.width = 0;
    this.height = 0;
  }

  setColor(color) {
    // ...
  }

  render(area) {
    // ...
  }

  setWidth(width) {
    this.width = width;
  }

  setHeight(height) {
    this.height = height;
  }

  getArea() {
    return this.width * this.height;
  }
}

class Square extends Rectangle {
  setWidth(width) {
    this.width = width;
    this.height = width;
  }

  setHeight(height) {
    this.width = height;
    this.height = height;
  }
}

function renderLargeRectangles(rectangles) {
  rectangles.forEach((rectangle) => {
    rectangle.setWidth(4);
    rectangle.setHeight(5);
    const area = rectangle.getArea(); // ΠŸΠ›ΠžΠ₯О: Π’Π΅Ρ€Π½Π΅Ρ‚ 25 для ΠšΠ²Π°Π΄Ρ€Π°Ρ‚Π°. Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ 20.
    rectangle.render(area);
  });
}

const rectangles = [new Rectangle(), new Rectangle(), new Square()];
renderLargeRectangles(rectangles);

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class Shape {
  setColor(color) {
    // ...
  }

  render(area) {
    // ...
  }
}

class Rectangle extends Shape {
  constructor(width, height) {
    super();
    this.width = width;
    this.height = height;
  }

  getArea() {
    return this.width * this.height;
  }
}

class Square extends Shape {
  constructor(length) {
    super();
    this.length = length;
  }

  getArea() {
    return this.length * this.length;
  }
}

function renderLargeShapes(shapes) {
  shapes.forEach((shape) => {
      const area = shape.getArea();
      shape.render(area);
    });
  }

const shapes = [new Rectangle(4, 5), new Rectangle(4, 5), new Square(5)];
renderLargeShapes(shapes);

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ раздСлСния интСрфСйса (ISP)

JavaScript Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ интСрфСйсов, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π΅ примСняСтся Ρ‚Π°ΠΊ строго, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это Π²Π°ΠΆΠ½ΠΎ ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π² Π²ΠΈΠ΄Ρƒ ΠΈΡ… отсутствия. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚. Из-Π·Π° ΡƒΡ‚ΠΈΠ½ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π² JavaScript интСрфСйсы - это нСявныС ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ станут классы, ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ мноТСство настроСк для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ПолСзно Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² проставлСния ΠΈΡ… всСх, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ всС ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… настроСк ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Π±ΡƒΡ…Π°Π½ΠΈΠ΅ интСрфСйса.

ΠŸΠ»ΠΎΡ…ΠΎ:

class DOMTraverser {
  constructor(settings) {
    this.settings = settings;
    this.setup();
  }

  setup() {
    this.rootNode = this.settings.rootNode;
    this.animationModule.setup();
  }

  traverse() {
    // ...
  }
}

const $ = new DOMTraverser({
  rootNode: document.getElementsByTagName('body'),
  animationModule() {} // Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв анимация Π½Π°ΠΌ Π½Π΅ пригодится.
  // ...
});

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class DOMTraverser {
  constructor(settings) {
    this.settings = settings;
    this.options = settings.options;
    this.setup();
  }

  setup() {
    this.rootNode = this.settings.rootNode;
    this.setupOptions();
  }

  setupOptions() {
    if (this.options.animationModule) {
      // ...
    }
  }

  traverse() {
    // ...
  }
}

const $ = new DOMTraverser({
  rootNode: document.getElementsByTagName('body'),
  options: {
    animationModule() {}
  }
});

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (DIP)

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ закрСпляСт Π΄Π²Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ:

  1. ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. И Ρ‚Π΅, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.
  2. Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций.

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд это каТСтся Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ΠΌ, Π½ΠΎ Ссли Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с Angular.js, Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π² Π²ΠΈΠ΄Π΅ внСдрСния зависимостСй (Dependency Injection - DI). НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ DIP ΠΈ DI - понятия Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅, DIP ΠΎΠ±Π΅Ρ€Π΅Π³Π°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· DI. ΠžΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ прСимущСство DIP Π² ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ взаимосвязСй ΠΌΠ΅ΠΆΠ΄Ρƒ модулями. ΠŸΠ΅Ρ€Π΅ΠΏΠ»Π΅Ρ‚Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ - это Π°Π½Ρ‚ΠΈΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ вашСго ΠΊΠΎΠ΄Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌ.

Как Π±Ρ‹Π»ΠΎ сказано Π²Ρ‹ΡˆΠ΅, JavaScript Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ интСрфСйсов, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ абстракции зависят ΠΎΡ‚ нСявных ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ². Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚/класс прСдоставляСт Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ/классу. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, нСявный ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ любой ΠΌΠΎΠ΄ΡƒΠ»ΡŒ запроса для InventoryTracker Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ requestItems.

ΠŸΠ»ΠΎΡ…ΠΎ:

class InventoryRequester {
  constructor() {
    this.REQ_METHODS = ['HTTP'];
  }

  requestItem(item) {
    // ...
  }
}

class InventoryTracker {
  constructor(items) {
    this.items = items;

    // ΠŸΠ›ΠžΠ₯О: ΠœΡ‹ создали Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ запроса.
    this.requester = new InventoryRequester();
  }

  requestItems() {
    this.items.forEach((item) => {
      this.requester.requestItem(item);
    });
  }
}

const inventoryTracker = new InventoryTracker(['apples', 'bananas']);
inventoryTracker.requestItems();

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class InventoryTracker {
  constructor(items, requester) {
    this.items = items;
    this.requester = requester;
  }

  requestItems() {
    this.items.forEach((item) => {
      this.requester.requestItem(item);
    });
  }
}

class InventoryRequesterV1 {
  constructor() {
    this.REQ_METHODS = ['HTTP'];
  }

  requestItem(item) {
    // ...
  }
}

class InventoryRequesterV2 {
  constructor() {
    this.REQ_METHODS = ['WS'];
  }

  requestItem(item) {
    // ...
  }
}

// ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠ² наши зависимости ΠΈΠ·Π²Π½Π΅ ΠΈ внСдряя ΠΈΡ…, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ
// Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ запроса Π½Π° ΠΌΠΎΠ΄Π½Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ вСбсокСты.
const inventoryTracker = new InventoryTracker(['apples', 'bananas'], new InventoryRequesterV2());
inventoryTracker.requestItems();

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠšΠ»Π°ΡΡΡ‹ ES2015/ES6 ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ES5

ΠŸΡ€ΠΈ классичСском ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ классам Π² ES5 ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ³ΠΎ наслСдования, конструктора ΠΈ опрСдСлСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ наслСдованиС (Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ вСроятнСй всСго Π½Π΅Ρ‚), Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ классам ES2015/ES6. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ малСнькиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ классами, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π² Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΈ слоТных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ….

ΠŸΠ»ΠΎΡ…ΠΎ:

const Animal = function(age) {
  if (!(this instanceof Animal)) {
    throw new Error('Instantiate Animal with `new`');
  }

  this.age = age;
};

Animal.prototype.move = function move() {};

const Mammal = function(age, furColor) {
  if (!(this instanceof Mammal)) {
    throw new Error('Instantiate Mammal with `new`');
  }

  Animal.call(this, age);
  this.furColor = furColor;
};

Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.constructor = Mammal;
Mammal.prototype.liveBirth = function liveBirth() {};

const Human = function(age, furColor, languageSpoken) {
  if (!(this instanceof Human)) {
    throw new Error('Instantiate Human with `new`');
  }

  Mammal.call(this, age, furColor);
  this.languageSpoken = languageSpoken;
};

Human.prototype = Object.create(Mammal.prototype);
Human.prototype.constructor = Human;
Human.prototype.speak = function speak() {};

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class Animal {
  constructor(age) {
    this.age = age;
  }

  move() { /* ... */ }
}

class Mammal extends Animal {
  constructor(age, furColor) {
    super(age);
    this.furColor = furColor;
  }

  liveBirth() { /* ... */ }
}

class Human extends Mammal {
  constructor(age, furColor, languageSpoken) {
    super(age, furColor);
    this.languageSpoken = languageSpoken;
  }

  speak() { /* ... */ }
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π² JavaScript ΠΈ Π²Ρ‹ встрСтитС Π΅Π³ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, JQuery ΠΈ Lodash. Он Π΄Π΅Π»Π°Π΅Ρ‚ ваш ΠΊΠΎΠ΄ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΌΠ΅Π½Π΅Π΅ многословным. Π‘Ρ‚Ρ€ΠΎΠΉΡ‚Π΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚Π΅, Π½Π° сколько Ρ‡ΠΈΡ‰Π΅ становится ваш ΠΊΠΎΠ΄. ΠœΠ΅Ρ‚ΠΎΠ΄ вашСго класса Π΄ΠΎΠ»ΠΆΠ΅Π½ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ this Π² ΠΊΠΎΠ½Ρ†Π΅ своСго Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π²Ρ‹ смоТСтС ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ Π²Ρ‹Π·ΠΎΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠŸΠ»ΠΎΡ…ΠΎ:

class Car {
  constructor() {
    this.make = 'Honda';
    this.model = 'Accord';
    this.color = 'white';
  }

  setMake(make) {
    this.make = make;
  }

  setModel(model) {
    this.model = model;
  }

  setColor(color) {
    this.color = color;
  }

  save() {
    console.log(this.make, this.model, this.color);
  }
}

const car = new Car();
car.setColor('pink');
car.setMake('Ford');
car.setModel('F-150');
car.save();

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class Car {
  constructor() {
    this.make = 'Honda';
    this.model = 'Accord';
    this.color = 'white';
  }

  setMake(make) {
    this.make = make;
    // ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ this для построСния Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ
    return this;
  }

  setModel(model) {
    this.model = model;
    // ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ this для построСния Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ
    return this;
  }

  setColor(color) {
    this.color = color;
    // ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ this для построСния Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ
    return this;
  }

  save() {
    console.log(this.make, this.model, this.color);
    // ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ this для построСния Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ
    return this;
  }
}

const car = new Car()
  .setColor('pink')
  .setMake('Ford')
  .setModel('F-150')
  .save();

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ наслСдованиСм

Как Π²Π΅Ρ€Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π² Design Patterns ΠΏΠΎΠ΄ авторством Π‘Π°Π½Π΄Ρ‹ Π§Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… (Gang of Four), ΠΊΠΎΠ³Π΄Π° это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ наслСдованиСм. Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ для использования наслСдования ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ для примСнСния ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Ссли ваш ΡƒΠΌ инстинктивно ΠΈΠ΄Π΅Ρ‚ ΠΏΡƒΡ‚Π΅ΠΌ наслСдования, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ композиция способна Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅. Π’ рядС случаСв это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ΡΡŒ вопросом: "Когда я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наслСдованиС?". Π­Ρ‚ΠΎ зависит ΠΎΡ‚ вашСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΠΎ Π²ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ список, ΠΊΠΎΠ³Π΄Π° наслСдованиС ΠΈΠΌΠ΅Π΅Ρ‚ большС смысла, Ρ‡Π΅ΠΌ композиция:

  1. Π’Π°ΡˆΠ΅ наслСдованиС прСдставляСт собой ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ "являСтся Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ", Π° Π½Π΅ "Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя" (Π§Π΅Π»ΠΎΠ²Π΅ΠΊ->Π–ΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ->Π”Π΅Ρ‚Π°Π»ΠΈ_ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ).
  2. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (люди ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΈ всС ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Π΅).
  3. Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ измСнСния Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах ΠΏΡƒΡ‚Π΅ΠΌ измСнСния Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ расхода ΠΊΠ°Π»ΠΎΡ€ΠΈΠΉ всСх ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… Π²ΠΎ врСмя двиТСния).

ΠŸΠ»ΠΎΡ…ΠΎ:

class Employee {
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }

  // ...
}

// ΠŸΠ»ΠΎΡ…ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Employee (Π‘ΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΠΊ) "ΠΈΠΌΠ΅Π΅Ρ‚" Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.
// EmployeeTaxData (НалоговыС_Π΄Π°Π½Π½Ρ‹Π΅_сотрудника) Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠΎΠΌ Employee (Π‘ΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΠΊΠ°).
class EmployeeTaxData extends Employee {
  constructor(ssn, salary) {
    super();
    this.ssn = ssn;
    this.salary = salary;
  }

  // ...
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class EmployeeTaxData {
  constructor(ssn, salary) {
    this.ssn = ssn;
    this.salary = salary;
  }

  // ...
}

class Employee {
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }

  setTaxData(ssn, salary) {
    this.taxData = new EmployeeTaxData(ssn, salary);
  }
  // ...
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ВСстированиС

ВСстированиС Π²Π°ΠΆΠ½Π΅Π΅ дСплоя. Если Ρƒ вас Π½Π΅Ρ‚ тСстов ΠΈΠ»ΠΈ ΠΈΡ… ΠΌΠ°Π»ΠΎ, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΊΠΎΠ΄Π° Π½Π° Π±ΠΎΠ΅Π²Ρ‹Π΅ сСрвСра Ρƒ вас Π½Π΅Ρ‚ увСрСнности, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ сломалось. РСшСниС ΠΎ достаточном количСствС тСстов остаСтся Π½Π° совСсти вашСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π½ΠΎ 100% ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ тСстами всСх Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ обСспСчиваСт высокоС Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΊΠΎΠ΄Ρƒ ΠΈ спокойствиС всСх Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Из этого слСдуСт, Ρ‡Ρ‚ΠΎ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ для тСстирования, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ инструмСнт покрытия.

НСт оправдания Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ тСсты. Π’ JavaScript cущСствуСт мноТСство Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… тСстовых Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ подходящий для вас. А ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅, Ρ‚ΠΎ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅ΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ тСсты для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΡ‡ΠΈ ΠΈΠ»ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ модуля. Π—Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· тСстированиС (TDD), Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ запуском любой Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΡ‡ΠΈ ΠΈΠ»ΠΈ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π²Ρ‹ достигаСтС достаточного уровня покрытия тСстами.

Один кСйс Π½Π° ΠΎΠ΄ΠΈΠ½ тСст

ΠŸΠ»ΠΎΡ…ΠΎ:

const assert = require('assert');

describe('MakeMomentJSGreatAgain', () => {
  it('handles date boundaries', () => {
    let date;

    date = new MakeMomentJSGreatAgain('1/1/2015');
    date.addDays(30);
    assert.equal('1/31/2015', date);

    date = new MakeMomentJSGreatAgain('2/1/2016');
    date.addDays(28);
    assert.equal('02/29/2016', date);

    date = new MakeMomentJSGreatAgain('2/1/2015');
    date.addDays(28);
    assert.equal('03/01/2015', date);
  });
});

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const assert = require('assert');

describe('MakeMomentJSGreatAgain', () => {
  it('handles 30-day months', () => {
    const date = new MakeMomentJSGreatAgain('1/1/2015');
    date.addDays(30);
    assert.equal('1/31/2015', date);
  });

  it('handles leap year', () => {
    const date = new MakeMomentJSGreatAgain('2/1/2016');
    date.addDays(28);
    assert.equal('02/29/2016', date);
  });

  it('handles non-leap year', () => {
    const date = new MakeMomentJSGreatAgain('2/1/2015');
    date.addDays(28);
    assert.equal('03/01/2015', date);
  });
});

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠŸΡ€ΠΎΠΌΠΈΡΡ‹, Π° Π½Π΅ Callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΡ…ΡƒΠ΄ΡˆΠ°ΡŽΡ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ приводят ΠΊ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠΌΡƒ количСству влоТСнности. Π’ ES2015/ES6 ΠŸΡ€ΠΎΠΌΠΈΡΡ‹ - встроСнный Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΡ…!

ΠŸΠ»ΠΎΡ…ΠΎ:

require('request').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin', (requestErr, response) => {
  if (requestErr) {
    console.error(requestErr);
  } else {
    require('fs').writeFile('article.html', response.body, (writeErr) => {
      if (writeErr) {
        console.error(writeErr);
      } else {
        console.log('File written');
      }
    });
  }
});

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin')
  .then((response) => {
    return require('fs-promise').writeFile('article.html', response);
  })
  .then(() => {
    console.log('File written');
  })
  .catch((err) => {
    console.error(err);
  });

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Async/Await Π΄Π°ΠΆΠ΅ Ρ‡ΠΈΡ‰Π΅, Ρ‡Π΅ΠΌ ΠŸΡ€ΠΎΠΌΠΈΡΡ‹

ΠŸΡ€ΠΎΠΌΠΈΡΡ‹ - ΠΎΡ‡Π΅Π½ΡŒ чистая Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° callback-функциям, Π½ΠΎ ES2017/ES8 привносит async ΠΈ await с Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ чистым Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. ВсС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, это функция с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом async, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ - Π±Π΅Π· Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ then. Если ΡƒΠΆΠ΅ сСгодня Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Ρ„ΠΈΡ‡ΠΈ ES2017/ES8, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ async/await!

ΠŸΠ»ΠΎΡ…ΠΎ:

require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin')
  .then((response) => {
    return require('fs-promise').writeFile('article.html', response);
  })
  .then(() => {
    console.log('File written');
  })
  .catch((err) => {
    console.error(err);
  });

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

async function getCleanCodeArticle() {
  try {
    const response = await require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin');
    await require('fs-promise').writeFile('article.html', response);
    console.log('File written');
  } catch(err) {
    console.error(err);
  }
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠžΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ ошибок

Π’Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ ошибки - отличная ΡˆΡ‚ΡƒΠΊΠ°! Они ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π²ΠΎ врСмя выполнСния вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ, это Π±Ρ‹Π»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ зафиксировано ΠΈ донСсСно Π΄ΠΎ вас ΠΏΡƒΡ‚Π΅ΠΌ остановки выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, убийства процСсса ΠΈ увСдомлСния Π² консоль с трассировкой стСка.

НС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠΉΠΌΠ°Π½Π½Ρ‹Π΅ ошибки

Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠΉΠΌΠ°Π½Π½ΠΎΠΉ ошибки Π½Π΅ Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ возмоТности ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π΅Π΅ появлСниС. Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ошибок Π² консоль (console.log) Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒΡΡ Π² ΠΌΠΎΡ€Π΅ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… записСй. ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ куска ΠΊΠΎΠ΄Π° Π² try/catch ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ появлСния ошибки ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π½Π° этот случай Ρ‡Π΅Ρ‚ΠΊΠΈΠΉ ΠΏΠ»Π°Π½.

ΠŸΠ»ΠΎΡ…ΠΎ:

try {
  functionThatMightThrow();
} catch (error) {
  console.log(error);
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

try {
  functionThatMightThrow();
} catch (error) {
  // Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² (Π±ΠΎΠ»Π΅Π΅ навязчивый, Ρ‡Π΅ΠΌ console.log):
  console.error(error);
  // Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:
  notifyUserOfError(error);
  // Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:
  reportErrorToService(error);
  // Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ всС Ρ‚Ρ€ΠΈ!
}

НС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ с ошибкой (rejected) ΠŸΡ€ΠΎΠΌΠΈΡΡ‹

Π’Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки Π² ΠŸΡ€ΠΎΠΌΠΈΡΠ°Ρ… ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² try/catch.

ΠŸΠ»ΠΎΡ…ΠΎ:

getdata()
.then((data) => {
  functionThatMightThrow(data);
})
.catch((error) => {
  console.log(error);
});

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

getdata()
.then((data) => {
  functionThatMightThrow(data);
})
.catch((error) => {
  // Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² (Π±ΠΎΠ»Π΅Π΅ навязчивый, Ρ‡Π΅ΠΌ console.log):
  console.error(error);
  // Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:
  notifyUserOfError(error);
  // Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:
  reportErrorToService(error);
  // Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ всС Ρ‚Ρ€ΠΈ!
});

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ носит ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€. Как ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ собранном здСсь, Π² вопросС форматирования Π½Π΅Ρ‚ ТСстких ΠΏΡ€Π°Π²ΠΈΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ обязаны ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ. Π“Π»Π°Π²Π½ΠΎΠ΅, Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° споры ΠΎ Π½Π΅ΠΌ. Π•ΡΡ‚ΡŒ Ρ‚ΠΎΠ½Π½Ρ‹ инструмСнтов для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ этого процСсса. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ΄ΠΈΠ½! Π‘ΠΏΠΎΡ€Ρ‹ ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ - пустая Ρ‚Ρ€Π°Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π΅Π½Π΅Π³.

Для случаСв, Π½Π΅ подходящих для автоматичСского форматирования (отступы, табуляция ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΈ Ρ‚.Π΄.), Π² Π΄Π°Π½Π½ΠΎΠΌ руководствС содСрТатся Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ Π² ΠΊΠ°ΠΏΠΈΡ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

JavaScript - Π½Π΅Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, поэтому капитализация Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π²Π°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΎ Π²Π°ΡˆΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, функциях ΠΈ Ρ‚.Π΄. ΠŸΡ€Π°Π²ΠΈΠ»Π° носят ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€, ваша ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅. Π“Π»Π°Π²Π½ΠΎΠ΅, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ, Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

ΠŸΠ»ΠΎΡ…ΠΎ:

const DAYS_IN_WEEK = 7;
const daysInMonth = 30;

const songs = ['Back In Black', 'Stairway to Heaven', 'Hey Jude'];
const Artists = ['ACDC', 'Led Zeppelin', 'The Beatles'];

function eraseDatabase() {}
function restore_database() {}

class animal {}
class Alpaca {}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

const DAYS_IN_WEEK = 7;
const DAYS_IN_MONTH = 30;

const songs = ['Back In Black', 'Stairway to Heaven', 'Hey Jude'];
const artists = ['ACDC', 'Led Zeppelin', 'The Beatles'];

function eraseDatabase() {}
function restoreDatabase() {}

class Animal {}
class Alpaca {}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΈ вызываСмая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ рядом

Если функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, сохраняйтС эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ рядом Π² исходном Ρ„Π°ΠΉΠ»Π΅. Π’ ΠΈΠ΄Π΅Π°Π»Π΅, Π΄Π΅Ρ€ΠΆΠΈΡ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ прямо Π½Π°Π΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ. ΠœΡ‹ склонны Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ свСрху-Π²Π½ΠΈΠ·Ρƒ, ΠΊΠ°ΠΊ Π³Π°Π·Π΅Ρ‚Ρƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°ΠΉΡ‚Π΅ ваш ΠΊΠΎΠ΄ для восприятия Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ΠŸΠ»ΠΎΡ…ΠΎ:

class PerformanceReview {
  constructor(employee) {
    this.employee = employee;
  }

  lookupPeers() {
    return db.lookup(this.employee, 'peers');
  }

  lookupManager() {
    return db.lookup(this.employee, 'manager');
  }

  getPeerReviews() {
    const peers = this.lookupPeers();
    // ...
  }

  perfReview() {
    this.getPeerReviews();
    this.getManagerReview();
    this.getSelfReview();
  }

  getManagerReview() {
    const manager = this.lookupManager();
  }

  getSelfReview() {
    // ...
  }
}

const review = new PerformanceReview(user);
review.perfReview();

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

class PerformanceReview {
  constructor(employee) {
    this.employee = employee;
  }

  perfReview() {
    this.getPeerReviews();
    this.getManagerReview();
    this.getSelfReview();
  }

  getPeerReviews() {
    const peers = this.lookupPeers();
    // ...
  }

  lookupPeers() {
    return db.lookup(this.employee, 'peers');
  }

  getManagerReview() {
    const manager = this.lookupManager();
  }

  lookupManager() {
    return db.lookup(this.employee, 'manager');
  }

  getSelfReview() {
    // ...
  }
}

const review = new PerformanceReview(employee);
review.perfReview();

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ - оправдания ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΊΠΎΠ΄ Π² основном Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ сСбя сам.

ΠŸΠ»ΠΎΡ…ΠΎ:

function hashIt(data) {
  // Π₯эш
  let hash = 0;

  // Π”Π»ΠΈΠ½Π° строки
  const length = data.length;

  // Π¦ΠΈΠΊΠ» Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π² Π΄Π°Π½Π½Ρ‹Ρ…
  for (let i = 0; i < length; i++) {
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠΎΠ΄ символа
    const char = data.charCodeAt(i);
    // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ…ΡΡˆ
    hash = ((hash << 5) - hash) + char;
    // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π² 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число
    hash &= hash;
  }
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function hashIt(data) {
  let hash = 0;
  const length = data.length;

  for (let i = 0; i < length; i++) {
    const char = data.charCodeAt(i);
    hash = ((hash << 5) - hash) + char;

    // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π² 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число
    hash &= hash;
  }
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

НС оставляйтС Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² вашСй ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅

БистСмы контроля вСрсий ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ зря. ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ старый ΠΊΠΎΠ΄ Π² истории.

ΠŸΠ»ΠΎΡ…ΠΎ:

doStuff();
// doOtherStuff();
// doSomeMoreStuff();
// doSoMuchStuff();

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

doStuff();

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

НС Π·Π°Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π²

НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ систСмы контроля вСрсий! НСт нСобходимости Π² ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠΌ ΠΊΠΎΠ΄Π΅, Π·Π°ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈ особСнно Π² ΠΆΡƒΡ€Π½Π°Π»ΡŒΠ½Ρ‹Ρ… коммСнтариях. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git log, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ!

ΠŸΠ»ΠΎΡ…ΠΎ:

/**
Β * 2016-12-20: Π£Π΄Π°Π»Π΅Π½Ρ‹ ΠΌΠΎΠ½Π°Π΄Ρ‹, Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π» ΠΈΡ… (RM)
Β * 2016-10-01: Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΎ использованиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ½Π°Π΄Ρ‹ (JP)
Β * 2016-02-03: Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² (LI)
Β * 2015-03-14: Π”ΠΎΠ±Π°Π²Π»Π΅Π½ combine с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Ρ‚ΠΈΠΏΠΎΠ² (JR)
Β */
function combine(a, b) {
  return a + b;
}

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

function combine(a, b) {
  return a + b;
}

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ΠΎΠ² позиционирования

Они, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, просто Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΡˆΡƒΠΌ. ΠŸΡƒΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… вмСстС с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ отступами ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°ΡŽΡ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ структуру ΠΊΠΎΠ΄Π°.

ΠŸΠ»ΠΎΡ…ΠΎ:

////////////////////////////////////////////////////////////////////////////////
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
////////////////////////////////////////////////////////////////////////////////
$scope.model = {
  menu: 'foo',
  nav: 'bar'
};

////////////////////////////////////////////////////////////////////////////////
// Установка экшСна
////////////////////////////////////////////////////////////////////////////////
const actions = function() {
  // ...
};

Π₯ΠΎΡ€ΠΎΡˆΠΎ:

$scope.model = {
  menu: 'foo',
  nav: 'bar'
};

const actions = function() {
  // ...
};

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹

Π”Π°Π½Π½ΠΎΠ΅ руководство Ρ‚Π°ΠΊΠΆΠ΅ доступно Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках:

⬆ Назад ΠΊ Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

About

πŸ› АдаптированныС для JavaScript ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Чистого ΠΊΠΎΠ΄Π°

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 53

0